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")
}
如果我这样做了,我刚刚摆脱静态图像。
由于您将所有图像保存在内存中,您的第一种方法会占用更多的内存,但它们可供快速检索。第二种方法即时加载图像,因此可以节省内存,但不会在处理时间内为其付费。
这是标准的缓存折衷。你必须问自己多久图像加载/需要,你需要多快这种情况发生,以及多少内存,你可以备用。如果您可以节省内存,我会使用Map<ObjectType, Image>
,如果您使用HashMap
,那么它会更清洁,也许更快(请参阅评论),而不是switch
查找。
我不是100%确定地图比交换机快。如果你使用了错误的地图类型,它可能会变得更慢......当然,它肯定会更干净...... – f*
@f*那么,切换是O(n)而'HashMap'的'get'通常是O(1) ,最坏的情况是O(n)。这就是我所指的。我编辑了它。否则,我不知道OP如何在'ObjectType'上进行'开关'。 – user1803551
不,它被编译为一个'lookupswitch',它提供了比线性时间更好的搜索......同样对于这样一小部分情况,使用地图的开销可能比在这样一个小的情况列表上搜索... – f*
在多个图像视图中重复使用相同的图像实例将节省内存(以及潜在的其他资源)。有可能比您所展示的方法更优雅,但这是一种可行的方法,并且应该表现良好。 –