我在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循环中设置断点,我可以看到它在其中崩溃。
我不知道如何解决这个问题......你有什么想法吗?
非常感谢你的帮助!
答案 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