java - 在 LibGDX 中处置 Assets 管理器

标签 java android libgdx assets asset-management

这是我的 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() 并在有效 Screendispose() 方法中处理所有需要处理的内容。

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

关于java - 在 LibGDX 中处置 Assets 管理器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42049191/

相关文章:

java - 获取异常是 java.net.SocketException : Connection reset

javascript - 如何在 Spring Boot 中的提交表单中将变量传递给 Controller ​​?

java - 致命异常/无法在 Android 中实例化错误

java - libGDX:我如何告诉核心游戏 getIconImageUri() 并将其用作我的游戏中的图像 Actor

java - 将自定义路径添加到 Path 环境变量 - javac 如何查找路径?

java - Alfresco 问题,residual=true 且 "property type"为空,而 "value type"已填充

java - Admob 广告不可见仍然错误 2

java - 关于 ActionBarSherlock 将项目导入 Android Studio 的问题

android - onResume 之后的 Activity "freezed"

java - LIBGDX:InputAdapter 的 keyDown、keyUp 等返回值的含义是什么