2017-07-31 25 views
1

我正在用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

在多個圖像視圖中重複使用相同的圖像實例將節省內存(以及潛在的其他資源)。有可能比您所展示的方法更優雅,但這是一種可行的方法,並且應該表現良好。 –

回答

1

由於您將所有圖像保存在內存中,您的第一種方法會佔用更多的內存,但它們可供快速檢索。第二種方法即時加載圖像,因此可以節省內存,但不會在處理時間內爲其付費。

這是標準的緩存摺衷。你必須問自己多久圖像加載/需要,你需要多快這種情況發生,以及多少內存,你可以備用。如果您可以節省內存,我會使用Map<ObjectType, Image>,如果您使用HashMap,那麼它會更清潔,也許更快(請參閱評論),而不是switch查找。

+1

我不是100%確定地圖比交換機快。如果你使用了錯誤的地圖類型,它可能會變得更慢......當然,它肯定會更乾淨...... – fabian

+0

@fabian那麼,切換是O(n)而'HashMap'的'get'通常是O(1) ,最壞的情況是O(n)。這就是我所指的。我編輯了它。否則,我不知道OP如何在'ObjectType'上進行'開關'。 – user1803551

+1

不,它被編譯爲一個'lookupswitch',它提供了比線性時間更好的搜索......同樣對於這樣一小部分情況,使用地圖的開銷可能比在這樣一個小的情況列表上搜索... – fabian

相關問題