1

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

我的 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 内存 - 抱歉)。

第一个案例

场景 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,我无法截取显示值的更好屏幕截图 - 抱歉):

第二种情况

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

其次,为什么内存分配达到任何数量(16/26MB)然后下降到2MB?我希望它总是 2MB,因为我正在使用优化的纹理表。

这是 TexturePacker 构建设置:

纹理打包器

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

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

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

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

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

4

1 回答 1

1

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

于 2013-04-01T13:01:00.523 回答