这是我的 OOP 设置:
MainGame 类扩展了 Game:
...
public void create () {
assets = new Assets(); // my custom Assets object (constructor creates manager and AssetDescriptors
assets.load(); // loads Asset Descriptors into manager
assets.getManager().finishLoading();
batch = new SpriteBatch();
setScreen(new PlayScreen(this, assets));
}
...
public void dispose () {
assets.dispose(); // disposes asset manager
super.dispose();
batch.dispose();
}
类 PlayScreen 实现 Screen:
public PlayScreen(MainGame game, Assets assets) {
this.assets = assets;
this.game = game;
background = assets.getManager().get(assets.getBackground());
hero = new HeroSprite(290, 1100, this, assets);
// Create Game camera and Hub also
}
public void render(float delta) {
// Clear screen
// Use game batch to draw to screen
}
public void dispose() {
assets.dispose();
}
英雄 Sprite 类:
public HeroSprite(int x, int y, PlayScreen screen, Assets assets){
this.assets = assets;
this.screen = screen;
// Animation Textures
heroWalking = assets.getManager().get(assets.getWalking()); // This is an Asset Descriptor
walkAnime = new Animation(heroWalking) // my own custom animation class which takes the spritesheet and returns the appropriate frames
...
}
// This does not contain a dispose method
抱歉,如果有很多代码,我会尽量减少。我的主要问题是我的处理方式是否正确?
看起来不错,我的游戏运行良好。但是当我退出游戏并重新进入时,就会出现黑屏。这种情况在桌面版和 Android 上都会发生。
一个有效的解决方案是使用 Super Cleaner 应用程序清除 Android 上的内存。由于这是一个内存问题,我认为这与我处理不当有关。
编辑:显示我的 Assets 类别
public class Assets {
private AssetManager manager;
private AssetDescriptor<Texture> background;
private AssetDescriptor<Texture> wood;
public AssetManager getManager() {
return manager;
}
public AssetDescriptor<Texture> getBackground() {
return background;
}
public AssetDescriptor<Texture> getWood() {
return hero;
}
public Assets(){
manager = new AssetManager();
background = new AssetDescriptor<Texture>("textures/static/bg.png", Texture.class);
hero = new AssetDescriptor<Texture>("textures/static/hero.png", Texture.class);
...
}
public void load(){
manager.load(background);
manager.load(hero);
...
}
public void dispose(){
manager.dispose();
}
}
最佳答案
Screen.dispose()
does not get called automatically ,当您退出屏幕并且不再需要 Assets 时,您应该手动调用 dispose。但显然,当您再次需要它们时,您需要再次加载它们,并且为此需要一个新的 AssetManager。因此,如果您的资源不会占用那么多,您应该将其保留在内存中。
退出时,您需要进行处置。 Game.dispose()
确实会被自动调用。在这里,您应该调用 getScreen().dispose()
并在有效 Screen
的 dispose()
方法中处理所有需要处理的内容。
由于目前看起来您没有在屏幕之间进行处理,这可能是因为您有一个静态 AssetManager,因此您应该显示您的 Assets()
类。
关于java - 在 LibGDX 中处置 Assets 管理器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42049191/