我试图理解为什么通过CCSprite
分配5个小initWithSpriteFrame
资产在我的应用程序中消耗了16Mb的内存。这5个小精灵每个只是{。1}} .png格式,但随后通过TexturePacker打包到24Kb
文件中。以下是我的设置:
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的内存:
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
个文件大小。我想这只是一个必要的邪恶?我知道文件大小!=内存消耗。
答案 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)时加载,而不会降低用户的体验。