ios - Cocos2d 2.0 : I get a higher memory allocation peak setting default pixel format to kCCTexture2DPixelFormat_RGBA4444

标签 ios memory memory-management cocos2d-iphone

我有点疯了。我从午餐介绍场景那里得到了一个 AppDelegate。我使用 TexturePacker 获取 plist 和 png 文件使用 RGBA4444 像素格式,并在 XCode 中将“压缩 PNG 文件”选项设置为“否”,以保留优化文件。

我的 AppDelegate 配置了默认像素格式 kEAGLColorFormatRGB565:

 CCGLView *glView = [CCGLView viewWithFrame:[window_ bounds]
                               pixelFormat:kEAGLColorFormatRGB565   //kEAGLColorFormatRGBA8
                               depthFormat:0    //GL_DEPTH_COMPONENT24_OES
                        preserveBackbuffer:NO
                                sharegroup:nil
                             multiSampling:NO
                           numberOfSamples:0];

场景 1:我运行我的 AppDelegate 并推送 Introduction 场景而不更改默认像素格式(换句话说,保留默认 AppDelegate 设置)并获得以下分配分析。当从 plist 文件创建第一个 CCSprite 帧时,蓝色峰值对应于 IntroductionScene 中的 16 MB 内存分配(蓝色峰值对应于 16 MB,我无法使用这些值截取更好的屏幕截图显示,其余对应于分配的大约 2MB 内存 - 抱歉)。

First case

场景 2:我在 IntroBackgroundScene 中将默认像素格式设置为 kCCTexture2DPixelFormat_RGBA4444(如下所示)。

@implementation IntroBackgroundScene

-(id) init
{
    if ((self = [super init]))
    {
        [CCTexture2D setDefaultAlphaPixelFormat:kCCTexture2DPixelFormat_RGBA4444];

        [[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"Intro background.plist"];
        background = [CCSprite spriteWithSpriteFrameName:@"Intro background 0.png"];
        background.anchorPoint = CGPointMake(0.5f, 0.5f);
        background.position = CGPointMake(160.0f, 0.0f);
        [self addChild:background];

        foreground = [CCSprite spriteWithSpriteFrameName:@"Intro background 1.png"];
        foreground.anchorPoint = CGPointMake(0.5f, 0.5f);
        foreground.position = CGPointMake(160.0f, 0.0f);
        [self addChild:foreground z:2];

这使我的内存使用量达到峰值 26 MB(即使像素格式设置设置为 kCCTexture2DPixelFormat_RGBA4444)。见下文(蓝色峰值对应 26 MB,我无法截取显示值的更好屏幕截图 - 抱歉):

Second case

我以为它会减少内存分配而不是增加。这是为什么?

其次,为什么内存分配达到峰值(16/26MB)然后下降到 2MB?由于我使用的是优化的纹理表,因此我希望它始终为 2MB。

这是 TexturePacker build设置:

Texture packer

我正在为 Cocos2d 构建并使用激活了 RGBA4444 的 2048*2048 像素表。它应该只消耗每个像素 2 个字节,总共大约 8 MB。 我不明白为什么内存分配在 IntroBackground 初始化方法中达到 16 MB 的峰值,然后又下降到只有 2MB(而不是 8MB)。

任何有关如何分析和理解这一点的见解都将不胜感激。

编辑:来自第 4 代 iPod touch 的纹理哑信息:

cocos2d: "Intro background.png"rc=7 id=3 2048 x 2048 @ 32 bpp => 16384 KB cocos2d:CCTextureCache dumpDebugInfo:2 个纹理,16448 KB(16.06 MB)

看起来纹理表中的所有帧都临时加载到内存中。这是正常的吗? 有什么办法可以避免这种情况吗? (当加载多张场景时,这可能会导致内存泄漏)

最佳答案

我的猜测是(解释峰值)应用程序具有 1) 在核心中加载压缩数据流,2) 在核心中解压缩...因此同时保存压缩和解压缩以及过程中使用的辅助对象... 然后当内存块传递给 GPU 时,内存被释放(并且纹理的内存需求从主进程中扣除)... 假设跟踪是在设备上进行的。模拟器不使用主机的 GPU,因此在模拟器上进行相同的跟踪会显示更高的内存占用,其中包括纹理的内存要求。

关于ios - Cocos2d 2.0 : I get a higher memory allocation peak setting default pixel format to kCCTexture2DPixelFormat_RGBA4444,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15743462/

相关文章:

iOS 标签不会在 Swift 中使用函数更新文本

memory - Kubernetes Pod 内存使用情况分割

C++做堆栈内存分配/解除分配内存整理

ios - 大量 UIWebView 内存泄漏

Swift NSBlockOperation() 泄漏 : cannot make NSBlockOperation() weak

ios - 给定范围的自定义线条样式

ios - 条件绑定(bind)的初始化程序必须具有可选类型,而不是 '[NSObject: AnyObject]' SwiftyJSON

c - 一旦超出范围,C 是否会重用本地 block var 的内存?

IOS - uibutton的动态放置

java - C++ 与 Java 或 C# 中堆内存的回收方式有何区别