JavaFX:我应该使用多个ImageViews的静态图像

JavaFX:我应该使用多个ImageViews的静态图像

问题描述:

我正在用JavaFX构建棋盘游戏类型游戏。不同的GameObjects有不同的对象类型。我目前正在存储一些静态图像,并在需要新的ImageView时引用它们。JavaFX:我应该使用多个ImageViews的静态图像

public class GameObject extends ImageView { 

private static final Image BG_IMG = new Image(RESPATH + "BG.png"); 
private static final Image NULL_IMG = new Image(RESPATH + "NULL.png"); 

private static final Image T2_IMG = new Image(RESPATH + "T2.png"); 
private static final Image T3_IMG = new Image(RESPATH + "T3.png"); 
private static final Image T4_IMG = new Image(RESPATH + "T4.png"); 
private static final Image T5_IMG = new Image(RESPATH + "T5.png"); 
private static final Image T6_IMG = new Image(RESPATH + "T6.png"); 

//ObjectType is an enum type 
private final ObjectType OBJECT_ID; 

private Image img; 

public GameObject(ObjectType t) { 
    OBJECT_ID = t; 
    setImage(); 
    setImage(img); 
} 

private void setImage() { 
    switch (OBJECT_ID) { 
     case T2: img = (T2_IMG); 
      break; 
     case T3: img = (T3_IMG); 
      break; 
     case T4: img = (T4_IMG); 
      break; 
     case T5: img = (T5_IMG); 
      break; 
     case T6: img = (T6_IMG); 
      break; 
     case BG: img = (BG_IMG); 
      break; 
     default: img = NULL_IMG; 
      break; 
    } 
} 

我想知道,这是因为我将使用相同的图像的多个ImageViews实现图像的好方法。

我会实现这个另一种方式:

private void setImage() { 
    img = new Image(RESPATH + OBJECT_ID.name() + ".png") 
} 

如果我这样做了,我刚刚摆脱静态图像。

+0

在多个图像视图中重复使用相同的图像实例将节省内存(以及潜在的其他资源)。有可能比您所展示的方法更优雅,但这是一种可行的方法,并且应该表现良好。 –

由于您将所有图像保存在内存中,您的第一种方法会占用更多的内存,但它们可供快速检索。第二种方法即时加载图像,因此可以节省内存,但不会在处理时间内为其付费。

这是标准的缓存折衷。你必须问自己多久图像加载/需要,你需要多快这种情况发生,以及多少内存,你可以备用。如果您可以节省内存,我会使用Map<ObjectType, Image>,如果您使用HashMap,那么它会更清洁,也许更快(请参阅评论),而不是switch查找。

+1

我不是100%确定地图比交换机快。如果你使用了错误的地图类型,它可能会变得更慢......当然,它肯定会更干净...... – f*

+0

@f*那么,切换是O(n)而'HashMap'的'get'通常是O(1) ,最坏的情况是O(n)。这就是我所指的。我编辑了它。否则,我不知道OP如何在'ObjectType'上进行'开关'。 – user1803551

+1

不,它被编译为一个'lookupswitch',它提供了比线性时间更好的搜索......同样对于这样一小部分情况,使用地图的开销可能比在这样一个小的情况列表上搜索... – f*