内存崩溃与动画预加载cocos2d

时间:2012-07-12 12:55:10

标签: animation cocos2d-iphone ccsprite

我在cocos2d项目中遇到内存管理问题。对于我的应用程序,我需要在交互开始之前构建所有动画。我有三个动画。 每个文件都有20 png文件,分辨率为1300 x 1000像素,大小为200ko。

所以在我的初始化中我刚刚写道:

self.animation = [CCAnimation animation];
[_animation setDelayPerUnit:0.04];
for(int i = 1; i <= 20; i++)
{
   [_animation addSpriteFrameWithFilename:[NSString stringWithFormat:@"image(%d)@2x.png",i]];
}
[[CCAnimationCache sharedAnimationCache] addAnimation:_animation name:@"animationWin"];

这种代码执行三次。如果我运行我的应用程序,它会直接崩溃。如果我只是预加载2个动画,我没有崩溃。 如果我在for循环中设置断点,我可以看到它在其中崩溃。

我不知道如何解决这个问题......你有什么想法吗?

非常感谢你的帮助!

3 个答案:

答案 0 :(得分:2)

以下内容将为您清除内容。

NSLog(@"AppDelegate<applicationDidReceiveMemoryWarning> : before purging all caches");
[[CCTextureCache sharedTextureCache] dumpCachedTextureInfo];
[[CCSpriteFrameCache sharedSpriteFrameCache] removeUnusedSpriteFrames];
[[CCDirector sharedDirector] purgeCachedData];
NSLog(@"AppDelegate<applicationDidReceiveMemoryWarning> : after purging all caches");
[[CCTextureCache sharedTextureCache] dumpCachedTextureInfo];

更改为PVR格式无济于事,因为纹理大小决定了内存量(PVR只会受益于'磁盘'大小和加载时间,而不是运行时所需的RAM)。每个像素的深度将:

+(void) mediumPixelFormat{
    [CCTexture2D setDefaultAlphaPixelFormat:kTexture2DPixelFormat_RGBA4444];
}

您可以随时更改格式。另外我注意到1300x1000,这在POT中非常浪费。这实际上将占用2048x2048纹理的空间。你可以用你的图形艺术家将其削减到1024x1024,或者将3个纹理合并为2个吗?

答案 1 :(得分:2)

  

每个人都有20个png文件,分辨率为1300 x 1000像素和   大小为200ko。

让我们做一些数学,好吗?

假设PNG文件是32位并且您没有启用NPOT(非幂2)支持,每个纹理都会消耗:

1300x1000 =&gt;扩展到2的幂=&gt; 2048x1024 =&gt;像素数=&gt; 2,097,152 =&gt;每个像素的32位(4字节)颜色深度=&gt; 8兆字节=&gt; 20次纹理=&gt; tadaaa ......高达160 MB的纹理内存使用率。

那是你的问题!

PNG的文件大小无关紧要。这是一种压缩格式。但纹理是未压缩的,除非你切换到真正压缩的PVR,但你也会得到文物和变色。

绝对最好的解决方案是调低您尝试加载的艺术作品的大小和/或数量。

答案 2 :(得分:0)

我认为你使用的内存太多了。您应该尝试使用spritesheets / batchnodes,另一种纹理格式,如PVRTC,并尝试使用不同的像素格式。

为了帮助解决上述所有问题,我建议Texture Packer