Ios COCOS2D2.0:我得到了更高的内存分配峰值设置,默认像素格式为kCCTexture2DPixelFormat_RGBA4444

Ios COCOS2D2.0:我得到了更高的内存分配峰值设置,默认像素格式为kCCTexture2DPixelFormat_RGBA4444,ios,memory,memory-management,cocos2d-iphone,Ios,Memory,Memory Management,Cocos2d Iphone,我有点疯了。我有一个AppDelegate,在那里我吃了一顿介绍会。我使用TexturePacker使用RGBA4444像素格式获取plist和png文件,并在XCode中设置为“否”,以选择“压缩png文件”,以保留优化的文件 我的AppDelegate配置为默认像素格式kEAGLColorFormatRGB565: CCGLView *glView = [CCGLView viewWithFrame:[window_ bounds]

我有点疯了。我有一个AppDelegate,在那里我吃了一顿介绍会。我使用TexturePacker使用RGBA4444像素格式获取plist和png文件,并在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并在不更改默认像素格式的情况下推送简介场景(换句话说,保留默认的AppDelegate设置),并获得以下分配分析。当从plist文件创建第一个CCSprite帧时,蓝色峰值对应于IntroductionScene中的16 MB内存分配(蓝色峰值对应于16 MB,我无法用显示的值拍摄更好的屏幕截图,其余对应于大约2MB的内存分配-抱歉)

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

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

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

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

以下是TexturePack生成设置:

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

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

编辑: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)


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

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

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

我在这里写了一些关于您的2MB的内容。如果您真的想了解各种图形对象消耗了多少内存,请使用[[CCTextureCache sharedTextureCache]dumpCachedTextureInfo]@伊夫斯勒堡,谢谢。我得到了2个纹理,总共使用了16MB内存,这对应于Introduction background.plist文件中的两个纹理,每个纹理为640*960。我想弄明白你的答案。根据您所说,这些图像在加载时会被“缓存”,但之后会被删除。所以应该没有办法避免这种高内存分配峰值。我在这里写了一些关于2MB的东西。如果您真的想了解各种图形对象消耗了多少内存,请使用[[CCTextureCache sharedTextureCache]dumpCachedTextureInfo]@伊夫斯勒堡,谢谢。我得到了2个纹理,总共使用了16MB内存,这对应于Introduction background.plist文件中的两个纹理,每个纹理为640*960。我想弄明白你的答案。根据您所说,这些图像在加载时会被“缓存”,但之后会被删除。因此,应该没有办法避免这种高内存分配峰值。是的,跟踪是在真实设备(iPodtouch第四代)上进行的。我真的不确定“压缩数据”指的是什么,我也不知道在我使用plist和png文件作为介绍背景sprite表时,在哪里可以使用它。所以基本上在一段时间内,spritesheet中的所有纹理都加载到GPU内存块中,导致内存达到峰值?啊。。。我以为您使用的是texture packer的.pvr.gz输出格式(我会在设备上更快地加载,更精简的纹理,甚至可能避免峰值…正如我在另一篇文章中显示的那样)。实际上,它们被保存在主进程内存中,直到被处理成PowerVR GPU可以使用的格式。因此,如果您使用pvr输出格式,图形处理器可以立即使用它,因此它从磁盘到处理器的速度非常快。没有什么是免费的,您必须预期内存中的瞬态,cpu使用率
@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];