ios - Cocos2d加载纹理内存问题

标签 ios memory-management cocos2d-iphone texturepacker

我正在 cocos2d 中开发应用程序。该应用程序的架构非常简单: 主菜单,您可以从六个子菜单中选择一个。点击子菜单启动后。 在主菜单中有很多高分辨率的纹理(对于 Retina iPad),在 Retina iPad 上加载所有纹理后大约需要 408 MB(最大 450MB,因为我使用的是 removeUnusedTextures 方法)。

现在我有两种优化纹理的场景:

首先:我在应用程序开始时加载最少的一组纹理,当它们需要其他纹理时。

缺点:当应用程序加载纹理时,它会卡住片刻以从磁盘加载数据。 无法使用 GCD 加载纹理,因为并非所有 cocos2d 类都是线程安全的,并且 cocos 提示所有纹理都没有使用相同的 id(CCSprite 没有使用相同的纹理 id)。 (注意:我正在使用 CCSpriteBatchNode

加载 *.pvr.ccz 文件

第二: 在场景的开头加载所有纹理。

缺点:当在内存中切换场景一段时间时,会出现来自两个场景的资源(菜单和子菜单,尤其是从子菜单返回主菜单时)。由于内存增长到 600MB,iOS 杀死了应用程序,崩溃,世界末日。

如何解决这个问题?我试图在 Internet 上找到一些东西,但没有成功。

附言 我使用 TexturePacker 尽可能地优化纹理。

最佳答案

为了避免内存中的两个场景问题,您可以简单地在两者之间添加一个间歇(加载)场景,它除了显示“正在加载”文本或图形外什么都不做。当您切换到加载场景时,旧场景有时间在您加载下一个场景之前解除分配。

您还可以通过将颜色深度从 32 位减少到 16 位来将纹理内存使用量减半。特别是在 Retina 图像上,即使不是不可能,也很难通过适当的颜色抖动来区分。

您还可以使用 CCTextureCache 的 loadImageAsync 方法在后台加载纹理。但是在使用该纹理创建 Sprite 之前,您仍然需要等待加载纹理,因此您并没有真正赢得任何东西。

关于ios - Cocos2d加载纹理内存问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19195361/

相关文章:

ios - 了解临时对象的使用

c - 额外的文件访问或大量的重新分配

iphone - COCOS 2D iPhone - 解析场景之间的变量并在图层中使用

ios - Cocos2d v3 - addChild 方法产生性能问题

ios - 如何使用 TeamCity 为 iOS 构建使用配置证书

ios - Swift IOS 应用程序在哪里实例化 View 和 ViewController?

ios - 如何从异步方法返回多个结果?

IOS:如何使用适用于 ios8 和 ios9 的 Fabric 进行 Twitter 集成

c - 使用不可缓存内存的最佳实践

ios - 在 CCRenderTexture 中使用 OpenGL ES 2.0