Cocos2d加载纹理内存问题

时间:2013-10-05 07:51:10

标签: ios memory-management cocos2d-iphone texturepacker

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

现在我有两种优化纹理的方案:

首先:我在应用开始时加载了最小的纹理集,当他们需要其他纹理时。

缺点:当加载纹理时,应用程序冻结了一段时间从磁盘加载数据。 无法使用GCD加载纹理,因为并非所有cocos2d类都是线程安全的,并且cocos抱怨所有纹理都没有使用相同的id(CCSprite is not using the same texture id)。 (注意:我正在使用CCSpriteBatchNode

加载* .pvr.ccz文件

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

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

如何解决这个问题?我试图在互联网上找到一些但没有运气的东西。

P.S 我使用TexturePacker尽可能地优化纹理。

1 个答案:

答案 0 :(得分:1)

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

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

您还可以使用CCTextureCache的loadImageAsync方法在后台加载纹理。但是你仍然需要等待纹理加载才能使用该纹理创建一个精灵,所以你不会在那里赢得任何东西。