根据cocos2d最佳做法,我将我的游戏关键资产打包到4个单独的Sprite工作表中。FWIW,我用TexturePacker创建了这些图纸,并用TinyPng处理了生成的.png。4个中最大的Sprite工作表(包含我的对话框)375KB
很大且2048x2048px
处于-hd
变化形式(aka @2x
)。
我一直在注意游戏中的内存问题,因此Allocations
在中启动了该工具Instruments
。果然,在视网膜设备上(非视网膜设备上)Main scene
正在使用~250MB
内存~95MB
。哇!巨大!更糟糕的是,较旧的视网膜设备(例如,iPhone 4)存在相当大的滞后。
我要做的第一件事是删除一张精灵表,看是否是问题所在。果然,根本不加载单个Sprite表,从而使视网膜记忆降低了60MB
。考虑到有问题的精灵表仅268KB
在文件大小中,我很震惊这是一个很大的问题。
这是我用来(在应用启动过程中)“预加载”精灵表的代码:
- (BOOL)cacheSpriteSheet:(NSString*)sheetName
{
if(!sheetName)
{
return NO;
}
NSString *fpSheet = [[AMAssetManager sharedManager] pathForSpriteSheet:sheetName];
if(fpSheet)
{
[[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:fpSheet];
return YES;
}
else
{
Warn(@"NULL sheet for %@",sheetName);
return NO;
}
}
问题:为什么我的Sprite Sheet占用了如此多的内存,我该如何解决?
到目前为止我尝试过的事情:
[CCTexture2D setDefaultAlphaPixelFormat:kCCTexture2DPixelFormat_RGBA4444]
有助于将内存占用量减少约20%,但我只能将其与某些Sprite工作表一起使用(例如,其他Sprite工作表具有径向渐变,但效果不佳)。[[CCSpriteFrameCache sharedSpriteFrameCache] removeUnusedSpriteFrames]
似乎没有帮助(内存占用量保持不变)文件大小与“核心”大小无关。像素是一个像素,并且最有可能的是,这2048x2048像素中的每个像素都占用32位。您的选择是:
在模拟器上运行时,不要信任仪器。可以肯定的使用
[[CCTextureCache sharedTextureCache] dumpCachedTextureInfo]
知道您的精灵实际上消耗了多少内存。
阅读这篇非常有趣的文章,以了解纹理与内存以及所需的权衡。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句