一次加载多个 .plist 时 Cocos2d 游戏崩溃

Posted

技术标签:

【中文标题】一次加载多个 .plist 时 Cocos2d 游戏崩溃【英文标题】:Cocos2d game crashes when loading many .plist at a time 【发布时间】:2011-07-08 09:12:03 【问题描述】:

我目前正在使用的 iphone 游戏是使用 cocos2d 开发的。游戏因错误而崩溃:

Program received 0, Data Formatters, Debugging cannot continue……

在做了一些研究后,我发现它的内存不足。我得到了:

收到内存警告。 Level=1 等。

问题的根源似乎是加载 plists 文件。它仅使用 4.0 MB 来加载大约 23 个 .plist 文件来运行不同的动画。

我想知道如何加载一堆运行不同动画的 plist 文件。该图像是加载 plist 文件及其内存使用情况的代码截图。我使用仪器来获得这个结果。

进一步调试这里是我得到的汇编代码

pop r4, r5, r7, pc
adds    r0, #100  ; 0x64
lsls    r3, r1, #0
--Error--
lsls    r2, r1, #0
add r7, sp, #720
lsls    r4, r1, #0
cbz r4, <0x7a>
lsls    r4, r1, #0

【问题讨论】:

【参考方案1】:
- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application 
//[[CCDirector sharedDirector] purgeCachedData];

尝试注释掉 purgeCachedData,并在退出游戏场景时调用它

【讨论】:

我已经评论过了......这就是我的样子 - (void)applicationDidReceiveMemoryWarning:(UIApplication *)application [[CCTextureCache sharedTextureCache] removeAllTextures]; NSLog(@"删除缓存数据----------"); //[[CCDirector sharedDirector] purgeCachedData]; 我刚刚尝试在游戏结束时添加 purgeCachedData...程序崩溃并显示相同的错误消息。内存警告等【参考方案2】:

对于addSpriteFramesWithFile 的每次调用,Cocos2d 都会加载相关的图像文件(.png),并且您似乎有相当多的精灵表。我将假设这些表中的每一个都不是很大,因为显然加载这么多大的纹理会产生内存警告。

您应该将较小的 sprite sheet 组合成一个或多个较大的 sprite sheet,因为加载多个纹理仍然会受到惩罚,这些纹理最终会在内部被填充到二维的下一个最高幂。更不用说在绘制过程中减少纹理切换所带来的性能节省。

还请注意,您对applicationDidReceiveMemoryWarning 的更改不会阻止Cocos2d 删除纹理,您还需要注释掉对removeAllTextures 的调用以进行测试。

【讨论】:

以上是关于一次加载多个 .plist 时 Cocos2d 游戏崩溃的主要内容,如果未能解决你的问题,请参考以下文章

cocos2d-实现读取.plist文件(使用数组CCArray)

cocos2d,事件处理

Cocos2d - 我可以将多个精灵帧加载到帧缓存中吗

Sprite 帧动画 Cocos2d 3.0

Hashmap 崩溃日食

cocos2d 3.0 中的 spriteWithSpriteFrameName 等效项?