【问题标题】:Massive memory consumption with cocos2d sprite sheetscocos2d sprite sheet 消耗大量内存
【发布时间】:2014-01-16 15:13:39
【问题描述】:

根据cocos2d best practices,我已将我的游戏关键资产打包到 4 个单独的精灵表中。 FWIW,我用TexturePacker 创建了这些表格,并用TinyPng 处理了生成的.pngs。 4 个中最大的 sprite 表(包含我的对话框)是 375KB large 和 2048x2048px -hd 变体(又名 @2x)。

我注意到我的游戏中有内存问题,所以我在Instruments 中启动了Allocations 工具。果然,Main scene 在视网膜设备上使用了~250MB 内存(在非视网膜设备上使用~95MB)。哇!巨大的!更糟糕的是,较旧的视网膜设备(例如 iPhone 4)存在相当大的延迟。

我做的第一件事是删除一个精灵表,看看这是否是问题所在。果然,只是不加载单个精灵表会使视网膜内存下降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;
    }
}

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

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

  1. [CCTexture2D setDefaultAlphaPixelFormat:kCCTexture2DPixelFormat_RGBA4444] 帮助减少了约 20% 的内存占用,但我只能将它与一些精灵表一起使用(例如,其他有径向渐变,效果不佳)。
  2. [[CCSpriteFrameCache sharedSpriteFrameCache] removeUnusedSpriteFrames] 似乎没有帮助(内存占用保持不变)

【问题讨论】:

    标签: ios iphone cocos2d-iphone


    【解决方案1】:

    文件大小与“核心”大小无关。一个像素就是一个像素,最有可能的是,这些 2048x2048 像素中的每一个都占用 32 位。您的选择是:

    • 拆分您的精灵表,并在您需要精灵时“及时”加载。
    • 在模拟器上运行时不要相信仪器。可以肯定的是,使用

      [[CCTextureCache sharedTextureCache] dumpCachedTextureInfo]

    了解精灵真正消耗了多少内存。

    • 模拟器上的内存分配只会给您很少有用的指示。构建您的发布版本,以设备为目标,并监控进程大小。在收到可怕的内存警告之前,这更有可能是决定性因素。
    • 不要使用仪器/模拟器来获得对性能和用户体验的任何欣赏。他们说谎。使用您计划支持您的应用的最低设备作为试金石
    • 即使您移除未使用的精灵帧,如果单个精灵帧(已使用)引用纹理,它仍将保留。

    阅读这篇非常有趣的article,了解纹理与内存以及所需的权衡。

    【讨论】:

    • 那篇文章非常好,谢谢。我使用仪器的唯一原因是该游戏在 iPhone4 上的表现不佳(因此,我确实是在设备上使用它,而不是在模拟器上)。我只是按照文章中的建议,重新打包我的所有纹理,并将内存使用量减少了 90%(说真的,它从 ~200MB 到 ~15MB!)
    猜你喜欢
    • 2022-01-16
    • 2014-01-04
    • 2012-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-02
    • 1970-01-01
    相关资源
    最近更新 更多