2017-08-26 30 views
0

最近我一直在努力得到一些libgdx項目在Android上工作。 我已閱讀,AssetManager不應該被聲明爲靜態的,因爲這會導致在暫停/恢復的問題。libgdx/assets什麼算作「非靜態」?

但究竟是什麼,你能逃脫?

public AssetManager assetsmanager; 
static public AssetManager assets; 

private void setup() { 

    assetsmanager = new AssetManager(); 
    assets=assetsmanager; 
    .... 

似乎很容易?

回答

1

如果你不讓它靜態的,那麼你必須做兩件事情之一:

  1. 創建AssetManager,然後通過你的屏幕

OR

之間的一個引用
  1. 創建一個新的AssetManager每個屏幕,並在創建屏幕時爲每個屏幕僅加載相關資產。

我傾向於在主類中創建一個AssetManager並加載所有資產。通過你的Main類的參考其它屏幕,以便我可以在那裏訪問assetmanager。

public class Main extends Game { 

    public AssetManager assetManager; // for loading all assets 

    @Override 
    public void create(){ 
     assetManager = new AssetManager(); 
     assetManager.load("assets/data/yourSkin", Skin.class); 
     assetManager.finishLoading(); // load assets (not asynchron for this example) 
     setScreen(new GameScreen(this)); 
    } 

    @Override 
    public void dispose() { 
     assetManager.dispose(); // disposes all assets when the game exits 
    } 
} 

Gdx.app.getApplicationListener() return ApplicationListener instance。所以你可以對你實現的類進行類型轉換,然後輕鬆訪問該類的任何方法或數據成員。

這樣:

((Main)Gdx.app.getApplicationListener()).assetManager // <-- You can use from where you want 
+0

謝謝...最後一個選項,我可以放在哪裏; \t靜態公共AssetManager getAssetManager(){\t \t \t 返回\t((主)Gdx.app.getApplicationListener())assetManager。 \t \t \t} from in main本身?然後我只需要main.getAssetManager()就可以了。 – darkflame

+0

'assetManager'在'Main'類中是非靜態的,所以你不能在靜態方法裏訪問 – Aryan

+1

assetManager是公共的,所以在這裏不需要任何getter,只需要使用'((Main)Gdx.app.getApplicationListener())。 '你沒有參考'Main'類的地方。如果你在上面的代碼中引用了像GameScreen這樣的主類,那麼只需在該類中全局引用,並在該類中全部使用main.assetManager。 – Aryan

2

它實際上是確定有一個靜態參考資產,但是這是氣餒,因爲絕大多數新用戶不瞭解的Android應用程序生命週期不夠好不要造成內存泄漏或丟失「已加載」的資源。在這裏和LibGDX論壇上有很多問題,一些錯誤是由於錯誤地使用靜態引用而導致的。 (但是,如果你的應用有一個動態壁紙,靜態引用絕對不能使用,因爲可以同時運行LibGDX服務實例,因爲動態壁紙預覽運行。)

您發佈的代碼是無關的,因爲沒有足夠的上下文看看你是否做錯了什麼。

我認爲,靜態引用,應避免無論如何,因爲他們可以創建出錯代碼難於調試。通常,人們想要使用它們的唯一原因是爲了避免一點點輸入來傳遞對象引用。在我看來,這不是合理的理由。它會花費你更多的時間在尋找錯誤方面比在打字時節省更多的時間。

與資產靜態引用的主要問題是這樣的:

  1. 許多資產類型(紋理,着色器程序,網格)使用不自動垃圾收集清理本地(JNI)內存。
  2. 一個Android應用程序可以在同一應用程序運行多個活動。如果通過退出Activity來關閉遊戲,那麼通常當您再次打開遊戲時,新的Activity將在同一個應用程序進程中運行,因此前一個會話的靜態引用仍然保留。

人們似乎做出的最典型的錯誤是對資產或SpriteBatch(它也包含一些本機內存對象)使用單例。單例模式通常會延遲加載對象。因此,如果遊戲關閉並重新打開,則資產不會重新加載,並且會導致可視錯誤,以及從先前加載的活動中泄漏資產內存。然而,可以通過適當處置dispose()方法中的所有資產並將靜態引用歸零,以便在下次打開遊戲時加載新對象,從而調整單體模式。在調用dispose()之後,必須小心不要訪問單例對象。

相關問題