libgdx/assets什么算作“非静态”?

问题描述:

最近我一直在努力得到一些libgdx项目在Android上工作。 我已阅读,AssetManager不应该被声明为静态的,因为这会导致在暂停/恢复的问题。libgdx/assets什么算作“非静态”?

但究竟是什么,你能逃脱?

public AssetManager assetsmanager; 
static public AssetManager assets; 

private void setup() { 

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

似乎很容易?

如果你不让它静态的,那么你必须做两件事情之一:

  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

它实际上是确定有一个静态参考资产,但是这是气馁,因为绝大多数新用户不了解的Android应用程序生命周期不够好不要造成内存泄漏或丢失“已加载”的资源。在这里和LibGDX论坛上有很多问题,一些错误是由于错误地使用静态引用而导致的。 (但是,如果你的应用有一个动态壁纸,静态引用绝对不能使用,因为可以同时运行LibGDX服务实例,因为动态壁纸预览运行。)

您发布的代码是无关的,因为没有足够的上下文看看你是否做错了什么。

我认为,静态引用,应避免无论如何,因为他们可以创建出错代码难于调试。通常,人们想要使用它们的唯一原因是为了避免一点点输入来传递对象引用。在我看来,这不是合理的理由。它会花费你更多的时间在寻找错误方面比在打字时节省更多的时间。

与资产静态引用的主要问题是这样的:

  1. 许多资产类型(纹理,着色器程序,网格)使用不自动垃圾收集清理本地(JNI)内存。
  2. 一个Android应用程序可以在同一应用程序运行多个活动。如果通过退出Activity来关闭游戏,那么通常当您再次打开游戏时,新的Activity将在同一个应用程序进程中运行,因此前一个会话的静态引用仍然保留。

人们似乎做出的最典型的错误是对资产或SpriteBatch(它也包含一些本机内存对象)使用单例。单例模式通常会延迟加载对象。因此,如果游戏关闭并重新打开,则资产不会重新加载,并且会导致可视错误,以及从先前加载的活动中泄漏资产内存。然而,可以通过适当处置dispose()方法中的所有资产并将静态引用归零,以便在下次打开游戏时加载新对象,从而调整单体模式。在调用dispose()之后,必须小心不要访问单例对象。