使用cocos2d精灵表的大量内存消耗

时间:2013-12-29 16:50:43

标签: ios iphone cocos2d-iphone

根据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]

问题:为什么我的精灵表消耗了如此多的内存,我该如何解决?

到目前为止我尝试过的事情:

  1. [[CCSpriteFrameCache sharedSpriteFrameCache] removeUnusedSpriteFrames]有助于减少约20%的内存占用,但我只能将它用于一些精灵表(其他的有例如径向渐变,这些不好看)。
  2. {{1}}似乎没有帮助(内存占用保持不变)

1 个答案:

答案 0 :(得分:3)

文件大小与核心'中的任何内容无关。尺寸。像素是像素是像素,并且最有可能的是,这些2048x2048像素中的每一个都占用32位。您的选择是:

  • 拆分精灵表,并及时加载'当你需要精灵。
  • 在模拟器上运行时不要信任仪器。确定,使用

    [[CCTextureCache sharedTextureCache] dumpCachedTextureInfo]

知道你的精灵真正消耗了多少内存。

  • 模拟器上的内存分配将为您提供非常有用的指示。构建发布版本,定位设备并监控流程大小。在获得可怕的内存警告之前,这更可能是决定性的因素。
  • 不要使用乐器/模拟器来获得对性能和用户体验的任何评价。他们说谎。使用您计划支持的最低级设备作为试金石
  • 即使你删除了未使用的精灵帧,如果一个精灵帧(已使用)引用一个纹理,它仍然会被保留。

阅读这篇非常有趣的article来掌握纹理与记忆以及所需的权衡。