Java 在LibGDX中处理资产管理器

Java 在LibGDX中处理资产管理器,java,android,libgdx,assets,asset-management,Java,Android,Libgdx,Assets,Asset Management,以下是我的OOP设置: 类主游戏扩展了游戏: 类PlayScreen实现屏幕: public PlayScreen(MainGame game, Assets assets) { this.assets = assets; this.game = game; background = assets.getManager().get(assets.getBackground()); hero = new HeroSprite(290, 1100, this,

以下是我的OOP设置:

类主游戏扩展了游戏

类PlayScreen实现屏幕:

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();
}
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
类HeroSprite:

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();
}
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
Sorr如果那里有很多代码,我会尽量减少。我的主要问题是我是否正确处理了这些问题

看起来不错,我的游戏运行良好。但当我退出游戏,重新进入一个黑屏显示。这在桌面和Android上都会发生

一个有效的解决方案是使用超级清洁应用程序清除Android上的内存。因为这是一个记忆问题,我想这与我的错误处理有关

编辑:显示我的资产类别

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();
    }
}
公共类资产{
私人资产管理人;
私人资产描述人背景;
私有资产描述木材;
公共资产管理器getManager(){
退货经理;
}
公共资产描述程序getBackground(){
返回背景;
}
公共资产描述人getWood(){
回归英雄;
}    
公共资产(){
manager=新的AssetManager();
背景=新的AssetDescriptor(“textures/static/bg.png”,Texture.class);
hero=新资产描述器(“textures/static/hero.png”,Texture.class);
...
}
公共空荷载(){
加载(后台);
经理加载(英雄);
...
}
公共空间处置(){
manager.dispose();
}
}
Screen.dispose()
,您应该在退出屏幕且不再需要资产时手动调用dispose。但显然,当您再次需要它们时,您需要再次加载它们,并且需要一个新的AssetManager。因此,如果您的资产不会占用那么多,您应该将其保留在内存中

但在退出时,您需要进行处置
Game.dispose()
会自动调用。在这里,您应该调用
getScreen().dispose()
,并在effective
Screen
dispose()
方法中包含所有需要处理的内容

由于当前看起来不像是在屏幕之间进行处置,这可能是因为您有一个静态AssetManager,因此您应该显示您的
Assets()
类。

Screen.dispose()
,当您退出屏幕并且不再需要这些资产时,您应该手动调用dispose。但显然,当您再次需要它们时,您需要再次加载它们,并且需要一个新的AssetManager。因此,如果您的资产不会占用那么多,您应该将其保留在内存中

但在退出时,您需要进行处置
Game.dispose()
会自动调用。在这里,您应该调用
getScreen().dispose()
,并在effective
Screen
dispose()
方法中包含所有需要处理的内容


由于目前看起来您并不是在屏幕之间处理资产,这可能是因为您有一个静态资产管理器,您应该显示您的
Assets()
类。

从PlayScreen的dispose()方法中处理资产有什么需要?您如何退出游戏?您正在使用Gdx.app.exit()?在桌面上,我单击“X”按钮。在Android上,我将应用程序刷走。我从来没有使用过
Gdx.app.exit()
PlayScreen的dispose()方法处理资产有什么必要?如何退出游戏?您正在使用Gdx.app.exit()?在桌面上,我单击“X”按钮。在Android上,我将应用程序刷走。我从来没有使用过游戏类的dispose()方法中已经处理的
Gdx.app.exit()
assets对象,那么需要调用getScreen().dispose()来处理assets对象吗。由于给定的引用资产对象只能从游戏的create()方法创建一次,所以不能从Screen dispose()方法中释放它。当前所有者已从屏幕的dispose()方法中处置了资产,但他未调用此方法。@AbhishekAryan
SpriteBatch
未被处置。如果你有一个
阶段
,它既不会被处理掉。好吧,我正在努力跟上。首先,我的资产管理器不是静态的。事实上,我的游戏中几乎每个变量都是私有的。另外,SpriteBatch正在Game类中处理。@Madmenyo所有者正在使用Game类的SpriteBatch,该SpriteBatch正在Game类的dispose()方法中处理。在Screen owner的render()方法中提到,他仅使用Game类的SpriteBatch通过注释进行渲染,没有任何阶段。正确。我不是在用舞台。游戏批处理对象用于绘制到屏幕,该屏幕从游戏类传递到屏幕的构造函数中。资产对象已从游戏类的dispose()方法中处理,那么需要调用getScreen().dispose()来处理资产对象。由于给定的引用资产对象只能从游戏的create()方法创建一次,所以不能从Screen dispose()方法中释放它。当前所有者已从屏幕的dispose()方法中处置了资产,但他未调用此方法。@AbhishekAryan
SpriteBatch
未被处置。如果你有一个
阶段
,它既不会被处理掉。好吧,我正在努力跟上。首先,我的资产管理器不是静态的。事实上,我的游戏中几乎每个变量都是私有的。另外,SpriteBatch正在Game类中处理。@Madmenyo所有者正在使用Game类的SpriteBatch,该SpriteBatch正在Game类的dispose()方法中处理。在Screen owner的render()方法中提到,他仅使用Game类的SpriteBatch通过注释进行渲染,没有任何阶段。正确。我不是在用舞台。游戏批处理对象用于绘制到屏幕,该屏幕从游戏类向下传递到屏幕的构造函数中。