我正在 cocos2d 中开发应用程序。该应用程序的架构非常简单: 主菜单,您可以从六个子菜单中选择一个。点击子菜单启动后。 在主菜单中有很多高分辨率的纹理(对于 Retina iPad),在 Retina iPad 上加载所有纹理后大约需要 408 MB(最大 450MB,因为我使用的是 removeUnusedTextures 方法)。
现在我有两种优化纹理的场景:
首先:我在应用程序开始时加载最少的一组纹理,当它们需要其他纹理时。
缺点:当应用程序加载纹理时,它会卡住片刻以从磁盘加载数据。
无法使用 GCD 加载纹理,因为并非所有 cocos2d 类都是线程安全的,并且 cocos 提示所有纹理都没有使用相同的 id(CCSprite 没有使用相同的纹理 id
)。 (注意:我正在使用 CCSpriteBatchNode
第二: 在场景的开头加载所有纹理。
缺点:当在内存中切换场景一段时间时,会出现来自两个场景的资源(菜单和子菜单,尤其是从子菜单返回主菜单时)。由于内存增长到 600MB,iOS 杀死了应用程序,崩溃,世界末日。
如何解决这个问题?我试图在 Internet 上找到一些东西,但没有成功。
附言 我使用 TexturePacker 尽可能地优化纹理。
最佳答案
为了避免内存中的两个场景问题,您可以简单地在两者之间添加一个间歇(加载)场景,它除了显示“正在加载”文本或图形外什么都不做。当您切换到加载场景时,旧场景有时间在您加载下一个场景之前解除分配。
您还可以通过将颜色深度从 32 位减少到 16 位来将纹理内存使用量减半。特别是在 Retina 图像上,即使不是不可能,也很难通过适当的颜色抖动来区分。
您还可以使用 CCTextureCache 的 loadImageAsync 方法在后台加载纹理。但是在使用该纹理创建 Sprite 之前,您仍然需要等待加载纹理,因此您并没有真正赢得任何东西。
关于ios - Cocos2d加载纹理内存问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19195361/