Animation 内存崩溃,动画预加载cocos2d

Animation 内存崩溃,动画预加载cocos2d,animation,cocos2d-iphone,ccsprite,Animation,Cocos2d Iphone,Ccsprite,我在cocos2d项目中遇到内存管理问题。对于我的应用程序,我需要在交互开始之前构建所有动画。我有三个动画。 每一个都有20个png文件,分辨率为1300 x 1000 px,大小为200ko 因此,在初始化过程中,我只写了: self.animation = [CCAnimation animation]; [_animation setDelayPerUnit:0.04]; for(int i = 1; i <= 20; i++) { [_animation addSpriteF

我在cocos2d项目中遇到内存管理问题。对于我的应用程序,我需要在交互开始之前构建所有动画。我有三个动画。 每一个都有20个png文件,分辨率为1300 x 1000 px,大小为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"];
self.animation=[cAnimation animation];
[_animationsetdelayperUnit:0.04];

对于(int i=1;i我认为您使用的内存太多了。您应该尝试使用spritesheets/batchnodes,另一种纹理格式,如PVRTC,并尝试使用不同的像素格式


为了帮助您完成以上所有操作,我建议您使用的内存太多。您应该尝试使用spritesheets/batchnodes,另一种纹理格式,如PVRTC,并尝试使用不同的像素格式


为了帮助您完成以上所有操作,我建议您执行以下操作

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];

您可以随时更改格式。我还注意到1300x1000,这在POT中是非常浪费的。这实际上会占用2048x2048纹理的空间。您可以与图形艺术家合作,将其刮至1024x1024,或将3个纹理合并为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];
你可以在任何时候更改格式。我还注意到1300x1000,这在POT中是非常浪费的。这实际上会占用2048x2048纹理的空间。你可以与你的图形艺术家合作,将其刮到1024x1024,或者将3种纹理合并为2种吗

每一个都有20个png文件,分辨率为1300 x 1000 px,并且 有一个200ko的尺寸

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

假设PNG文件为32位且未启用NPOT(非二次幂)支持,则每个纹理消耗:

1300x1000=>扩展到二次幂=>2048x1024=>像素数=>2097152=>每像素32位(4字节)颜色深度=>8MB=>乘以20纹理=>tadaaa…高达160MB的纹理内存使用率

这就是你的问题!

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

当然,最好的解决方案是调整您试图加载的艺术品的大小和/或数量

每一个都有20个png文件,分辨率为1300 x 1000 px,并且 有一个200ko的尺寸

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

假设PNG文件为32位且未启用NPOT(非二次幂)支持,则每个纹理消耗:

1300x1000=>扩展到二次幂=>2048x1024=>像素数=>2097152=>每像素32位(4字节)颜色深度=>8MB=>乘以20纹理=>tadaaa…高达160MB的纹理内存使用率

这就是你的问题!

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


当然,最好的解决方案是调低您试图加载的艺术品的大小和/或数量。

f***。有没有办法删除我不再使用的所有以前的精灵?ccsprite或纹理(png)?如果是第二次您可以尝试删除纹理缓存中的未使用纹理我尝试弹出我的旧场景,然后重新分配我的控制器并删除所有缓存的纹理,然后推送我的新场景…sameUse[[CCSpriteFrameCache sharedSpriteFrameCache]removeUnusedSpriteFrames];:)f***。有没有办法删除我不再使用的所有以前的精灵?ccsprite或纹理(png)?如果是第二次你可以尝试移除纹理缓存中的未使用纹理我尝试弹出我的旧场景,然后重新分配我的导演并移除所有缓存的纹理,然后推送我的新场景。。。sameUse[[CCSpriteFrameCache sharedSpriteFrameCache]删除未使用的SpriteFrames];:)谢谢你的解释。我减少了PNG上的空白,现在很好,谢谢你的解释。我减少了PNG上的空白,现在很好