cocos2d& TexturePacker:initWithSpriteFrame为一个小文件消耗16 Mb的内存

时间:2014-08-21 16:59:34

标签: ios xcode cocos2d-iphone

我试图理解为什么通过CCSprite分配5个小initWithSpriteFrame资产在我的应用程序中消耗了16Mb的内存。这5个小精灵每个只是{。1}} .png格式,但随后通过TexturePacker打包到24Kb文件中。以下是我的设置:

enter image description here

pvr.ccz文件的整个大小为pvr.czz。 5个小精灵中的每一个都是2.5 Mb px(@ 2x分辨率)。为了匹配这些设置,我在cocos2d初始化中调用以下内容,在启动时预先激活精灵表:

66x66

然后我致电[CCTexture2D setDefaultAlphaPixelFormat:kCCTexture2DPixelFormat_RGBA8888]; [CCTexture2D PVRImagesHavePremultipliedAlpha:YES]; for(NSString *fnSheet in kGlobalSpriteSheets) { [[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:fnSheet]; } 来创建资产,这基本上就像这样调用addOrb

CCSprite initWithSpriteFrame

使用profiler,我们可以看到- (id)initWithAsset:(NSString*)assetName { CCSpriteFrame *frame = [[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:assetName]; return [self initWithSpriteFrame:frame]; } 函数消耗了16Mb的内存:

enter image description here

note 调用堆栈显示addOrb函数的14次调用,这是真的,但此函数只能加载5个不同的资产。

对我跳出的第一件事是Profiler似乎表明在调用addOrb之前没有分配PVR纹理,尽管我试图预加载它(?)

到我的应用启动完成时,我分配的内存为initWithSpriteFrame。这是高端的,我正在寻找任何方法来削减它。


编辑:在“预先缓存”之后,225Mb给了我这个:

[[CCTextureCache sharedTextureCache] dumpCachedTextureInfo]

2014-08-21 10:24:29.060 Aftermath [46067:1115151] cocos2d:CCTextureCache dumpDebugInfo:1个纹理,用于64 KB(0.06 MB)

分配精灵之后:

2014-08-21 10:24:29.060 Aftermath[46067:1115151] cocos2d: "cc_fps_images"   rc=5    id=2    512 x 64    @ 16 bpp => 64 KB

因此,看起来预先缓存实际上并没有加载文件,但无论如何:跳出来的是2014-08-21 10:24:29.060 Aftermath[46067:1115151] cocos2d: "cc_fps_images" rc=5 id=2 512 x 64 @ 16 bpp => 64 KB 2014-08-21 10:24:29.060 Aftermath[46067:1115151] cocos2d: CCTextureCache dumpDebugInfo: 1 textures, for 64 KB (0.06 MB) 2014-08-21 10:25:15.805 Aftermath[46067:1115151] cocos2d: "fonts/cinzel_18.png" rc=33 id=5 512 x 256 @ 32 bpp => 512 KB 2014-08-21 10:25:15.806 Aftermath[46067:1115151] cocos2d: "menu.pvr.ccz" rc=7 id=6 2048 x 2048 @ 32 bpp => 16384 KB 2014-08-21 10:25:15.806 Aftermath[46067:1115151] cocos2d: "cc_fps_images" rc=5 id=2 512 x 64 @ 16 bpp => 64 KB 2014-08-21 10:25:15.806 Aftermath[46067:1115151] cocos2d: "backgrounds/space.png" rc=3 id=4 2048 x 1536 @ 32 bpp => 12288 KB 2014-08-21 10:25:15.806 Aftermath[46067:1115151] cocos2d: CCTextureCache dumpDebugInfo: 4 textures, for 29248 KB (28.56 MB) (包含有问题的精灵)正在消耗menu.pvr.ccz内存尽管有16Mb个文件大小。我想这只是一个必要的邪恶?我知道文件大小!=内存消耗。

2 个答案:

答案 0 :(得分:2)

文件大小不等于纹理内存使用量。考虑一下这里的计算:

"menu.pvr.ccz"    rc=7    id=6    2048 x 2048 @ 32 bpp => 16384 KB

显然,menu.pvr.ccz的大小为2048x2048,每个像素使用4个字节(32 bpp)。

所以:

2048 x 2048 x 4 = 16777216 Bytes (16 MB)

您可能想要在TexturePacker中验证图像大小。尝试将Size Constraint更改为除2的Power之外的其他值,但我认为PVR纹理仍然需要POT大小的纹理。虽然没有伤害。

答案 1 :(得分:0)

除了斯蒂芬的评论之外,文件大小是#像素,每像素位数,使用的编码和使用的压缩的函数。另一方面,存储器仅取决于像素数和每像素位数。像素是像素是像素。完全透明的2048x2048图像在8bpp时仍然需要16Mb,但在磁盘上可能非常小。

文件大小和编码类型主要影响加载速度(.pvr最好,到目前为止)。

如果您担心内存占用,请测试(在您打算支持的最低功能设备上),看看您是否能够负担得起“jit”。纹理加载策略,即您可以在每次加载小纹理(选择.pvr.ccz)时加载,而不会降低用户的体验。