根据cocos2d best practices,我将游戏的关键资产打包成4个单独的精灵表。 FWIW,我使用TexturePacker创建了这些工作表,并使用TinyPng压缩了生成的.pngs。 4的最大精灵表(包含我的对话框)在375KB
变体(2048x2048px
变体(-hd
)中为@2x
大和Allocations
。
我一直在注意游戏中的内存问题,因此我启动了Instruments
中的Main scene
工具。果然,~250MB
在视网膜设备上使用~95MB
内存(在非视网膜设备上60MB
)。哇!巨大!更糟糕的是,旧视网膜设备(例如iPhone 4)存在相当大的滞后。
我做的第一件事是删除其中一张精灵表,看看这是不是问题。果然,根本没有加载单个精灵表单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;
}
}
,我很震惊这是一个很大的问题。
以下是我用来“预加载”精灵表的代码(在应用启动期间):
[CCTexture2D setDefaultAlphaPixelFormat:kCCTexture2DPixelFormat_RGBA4444]
问题:为什么我的精灵表消耗了如此多的内存,我该如何解决?
到目前为止我尝试过的事情:
[[CCSpriteFrameCache sharedSpriteFrameCache] removeUnusedSpriteFrames]
有助于减少约20%的内存占用,但我只能将它用于一些精灵表(其他的有例如径向渐变,这些不好看)。答案 0 :(得分:3)
文件大小与核心'中的任何内容无关。尺寸。像素是像素是像素,并且最有可能的是,这些2048x2048像素中的每一个都占用32位。您的选择是:
在模拟器上运行时不要信任仪器。确定,使用
[[CCTextureCache sharedTextureCache] dumpCachedTextureInfo]
知道你的精灵真正消耗了多少内存。
阅读这篇非常有趣的article来掌握纹理与记忆以及所需的权衡。