我有点疯了。我从那里得到了一个 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)
看起来纹理表中的所有帧都临时加载到内存中。这是正常的吗?有没有办法避免这种情况?(这可能会在加载多张纸的场景时导致内存泄漏)