0

如果我调用sprite.getTexture().dispose();从 aTexture中检索到的a ,则TextureAtlas整个屏幕都会变黑。

public class PlayState extends State {
   // The falling objects from the sky
   private Array<FallingObject> objects;

   private AssetManager assetManager;
   private TextureAtlas textureAtlas;

   private Sprite background;

   public PlayState() {
      assetManager = new AssetManager();
      assetManager.load("assets.pack", TextureAtlas.class);
      assetManager.finishLoading();
      textureAtlas = assetManager.get("assets.pack");

      background = new Sprite(textureAtlas.get("background"));

      // Add some falling objects
      objects.add(new FallingObject(textureAtlas.findRegion("kitty")));
      objects.add(new FallingObject(textureAtlas.findRegion("leaf")));
      ojbects.add(new FallingObject(textureAtlas.findRegion("dog")));
   }

   @Override
   public void update(float deltaTime) {
      for (FallingObject object : objects) {
         object.update(deltaTime);

         if (object.reachedBottom()) {
            object.dispose(); // <------------ THIS CAUSES THE ERROR
            objects.remove(object);

            objects.add(new FallingObject(textureAtlas.findRegion(getRandomRegionName()));
         }
      }
   }

   @Override
   public void render(SpriteBatch batch) {
      batch.begin();

      // Draw the background
      background.draw(batch);

      // Draw the falling objects
      for (FallingObject object : objects) {
         batch.draw(object.getSprite(), object.position.x, object.position.y);
      }

      batch.end();
   }

   @Override
   public void dispose() {
      assetManager.dispose();
      textureAtlas.dipose();

      for (FallingObject object : objects) {
         object.dispose();
      }
   }

}

坠落的物体

public class FallingObject extends GameObject {
    private Sprite sprite;

    public FallingObject(TextureRegion region) {
       sprite = new Sprite(region);
    }

    public void dispose() {
       sprite.getTexture().dispose(); // <-- HERE, when this is called, the whole screen becomes black
    }
}

我已经设法解决了这个问题,方法是不调用从课堂disposetexture检索到的sprite内容。FallingObject我通过声明NULL精灵来清除引用:

public class FallingObject extends GameObject {
   private Sprite sprite;

   public void dispose() {
      sprite = null;
   }
}

但现在我害怕内存泄漏!这是处置 Sprite 的正确方法吗?

4

1 回答 1

3

来自纹理图集的精灵都共享相同的纹理,因此在完全处理完从该纹理图集派生的任何精灵之前,您不得处置该纹理。

Sprites 不实现 Disposable,因此这是您无需担心处置单个 sprites 的线索。将它们设置为 null 很好,但它们派生的纹理最终需要在完成后处理。

此外,任何通过 AssetManager 加载的内容都不应直接处理。相反,您应该调用assetManager.unload(myDisposableObject);,以便资产经理可以正确跟踪它。或者,assetManager.dispose()如果您完全完成了使用该资产管理器加载的所有对象,您可以调用。

于 2015-11-23T20:50:42.810 回答