1

我正在使用 Cocos2d 框架在 android 中开发一个游戏,最新版本来自 github(Weikuan Zhou)。

在我的游戏中,我使用了很多图像(总图像大小约为 11MB)。

问题:当我玩游戏超过 3 次时,我得到的是黑匣子而不是图像。

哪些步骤将重现该问题?1. 当我通过游戏的“再玩一次”功能玩游戏超过 3 次时。

什么是预期的输出?你看到了什么呢?- 图像应正确显示,而不是"BLACK BOX".

在我的 logcat 中,我看到堆内存大约为 13Mb。

  • 我已经通过下面的方法发布了纹理

CCTextureCache.sharedTextureCache().removeAllTextures();

我也尝试过手动删除精灵。removeChild()方法。

但到目前为止还没有成功找到任何解决方案。

如果有人对此有解决方案,请告诉我。

4

2 回答 2

0

当您在运行时加载资源时会发生此问题。所以最好在场景开始之前加载资源。你可以这样做。

  1. 在游戏中使用精灵表获取资源。
  2. 在您的类的构造函数中实现您的 Ui。
  3. 在您的层中的覆盖方法 onEnter() 中实现您的功能。
  4. 完成场景后,您必须卸载精灵表。

这是我正在遵循的程序。谢谢。

于 2013-08-13T12:45:57.597 回答
0

根据您的描述,您遇到的问题与我遇到的完全相同,即 cocos2d for android 在处理大量单独加载的单个精灵时确实存在问题。

解决此问题的最佳途径是从此处获取(除非您有 mac)zwoptex 的免费 flash 版本http://zwopple.com/zwoptex/static/downloads/zwoptex-flashversion.zip

这将让您建立 spritesheets,我建议将尽可能多的 sprite 关联到每张表上,同时尝试将它们合理地分组。

这主要是因为 cocos 对 spritesheet 中的所有 sprite 进行了一次渲染,而不是对普通 sprite 每个 sprite 进行一次渲染,因此大大减少了处理时间,并减少了内存使用量。

然后,您可以使用以下代码加载 spritesheet(不能保证此代码会执行,因为我正在从结构化项目中获取代码片段,但它会引导您找到正确的解决方案)

CCSpriteFrameCache.sharedSpriteFrameCache().addSpriteFrames("menus.plist");  // loads the spritesheet into the frame cache
CCSpriteSheet menuSpriteSheet = CCSpriteSheet.spriteSheet("menus.png", 20); // loads the spritesheet from the cache ready for use

.... // menu is a CCLayer
    CCSprite sprite = CCSprite.sprite(CCSpriteFrameCache.sharedSpriteFrameCache().spriteFrameByName("name of sprite from inside spritesheet.png"));

menuSpriteSheet.addChild(sprite, 1, 1); /  you add the sprite to its spritesheet
menu.addChild(menuSpriteSheet, 1);  // then add the spritesheet to the layer
于 2012-04-26T14:53:29.467 回答