Ios cocos2d&;TexturePacker:InitWithPriteFrame为一个小文件消耗16 Mb内存
我试图理解为什么通过Ios cocos2d&;TexturePacker:InitWithPriteFrame为一个小文件消耗16 Mb内存,ios,xcode,cocos2d-iphone,Ios,Xcode,Cocos2d Iphone,我试图理解为什么通过initWithSpriteFrame分配5个小型CCSprite资产会在我的应用程序中消耗16Mb内存。这5个小精灵都是.png格式的24Kb,但随后通过压缩压缩成pvr.ccz文件。以下是我的设置: pvr.czz文件的整个大小为2.5 Mb。5个小精灵中的每一个都是66x66px(@2x分辨率)。为了与这些设置相匹配,我在cocos2d初始化中调用以下命令,在启动时预缓存精灵工作表: [CCTexture2D setDefaultAlphaPixelFormat:kC
initWithSpriteFrame
分配5个小型CCSprite
资产会在我的应用程序中消耗16Mb内存。这5个小精灵都是.png格式的24Kb
,但随后通过压缩压缩成pvr.ccz
文件。以下是我的设置:
pvr.czz
文件的整个大小为2.5 Mb
。5个小精灵中的每一个都是66x66
px(@2x分辨率)。为了与这些设置相匹配,我在cocos2d初始化中调用以下命令,在启动时预缓存精灵工作表:
[CCTexture2D setDefaultAlphaPixelFormat:kCCTexture2DPixelFormat_RGBA8888];
[CCTexture2D PVRImagesHavePremultipliedAlpha:YES];
for(NSString *fnSheet in kGlobalSpriteSheets) {
[[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:fnSheet];
}
然后我调用addOrb
来创建资产,它本质上调用CCSprite initwithpriteframe
如下:
- (id)initWithAsset:(NSString*)assetName {
CCSpriteFrame *frame = [[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:assetName];
return [self initWithSpriteFrame:frame];
}
使用探查器,我们可以看到addOrb
函数正在消耗16Mb内存:
注意调用堆栈显示了对addOrb
函数的14次调用,这是正确的,但该函数总共只能加载5种不同的资产
我首先想到的是,探查器似乎指示在调用initWithPriteFrame
之前不会分配PVR纹理,尽管我尝试预加载它(?)
当我的应用程序启动完成时,我分配的内存为225Mb。这是高端的,我正在寻找任何方法来降低这一点
编辑:在“预缓存”之后,
[[CCTextureCache sharedTextureCache]dumpCachedTextureInfo]
给出了以下信息:
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余波[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: 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)
因此,看起来预缓存实际上并没有加载文件,但不管怎样:跳出的是
菜单.pvr.ccz
(其中包含有问题的精灵)正在消耗16Mb
内存,尽管其文件大小为2.5Mb
。我想这只是一个必要的邪恶?我知道文件大小!=内存消耗。文件大小不等于纹理内存使用量。考虑这里的计算:
"menu.pvr.ccz" rc=7 id=6 2048 x 2048 @ 32 bpp => 16384 KB
显然,menu.pvr.ccz的大小为2048x2048,每像素使用4个字节(32 bpp)
因此:
您可能需要在TexturePacker中验证图像大小。尝试将“大小约束”更改为2的幂以外的值,尽管我认为PVR纹理仍然需要壶大小的纹理。不过试试也无妨。文件大小并不等于纹理内存使用量。考虑这里的计算:
"menu.pvr.ccz" rc=7 id=6 2048 x 2048 @ 32 bpp => 16384 KB
显然,menu.pvr.ccz的大小为2048x2048,每像素使用4个字节(32 bpp)
因此:
您可能需要在TexturePacker中验证图像大小。尝试将“大小约束”更改为2的幂以外的值,尽管我认为PVR纹理仍然需要壶大小的纹理。不过试试也无妨。斯蒂芬的评论补充道,文件大小是#像素、每像素位、使用的编码和使用的压缩的函数。另一方面,内存仅取决于像素数和每像素位数。一个像素就是一个像素就是一个像素。一个完全透明的2048x2048映像在8bpp时仍然需要16Mb,但在磁盘上可能会非常小 文件大小和编码类型主要影响加载速度(.pvr是目前最好的)
如果您担心内存占用,请测试(在您打算支持的最低性能设备上),看看您是否能够负担得起“jit”纹理加载策略,即您可以在每次加载小纹理(select.pvr.ccz)时都不影响用户体验 除了Stephen的评论之外,文件大小是#像素、每像素位、使用的编码和使用的压缩的函数。另一方面,内存仅取决于像素数和每像素位数。一个像素就是一个像素就是一个像素。一个完全透明的2048x2048映像在8bpp时仍然需要16Mb,但在磁盘上可能会非常小 文件大小和编码类型主要影响加载速度(.pvr是目前最好的)
如果您担心内存占用,请测试(在您打算支持的最低性能设备上),看看您是否能够负担得起“jit”纹理加载策略,即您可以在每次加载小纹理(select.pvr.ccz)时都不影响用户体验 图像的分辨率是多少?5个精灵中的每一个都是66x66px@2x分辨率(问题已更新以反映此信息)。[[CCTextureCache sharedTextureCache]dumpCachedTextureInfo]告诉您什么?@YvesLeBorg问题已更新此信息!图像的分辨率是多少?5个精灵中的每一个都是66x66px@2x分辨率(问题已更新以反映此信息)。[[CCTextureCache sharedTextureCache]dumpCachedTextureInfo]告诉您什么?@YvesLeBorg问题已更新此信息!谢谢这帮了我很大的忙,但现在我得到了一些警告,可能更多的是对texturepacker团队的一个问题,但仍然是:谢谢!这帮了大忙,但现在我收到了一些警告,可能更多的是针对texturepacker团队的问题,但仍然: