Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/108.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios cocos2d&;TexturePacker:InitWithPriteFrame为一个小文件消耗16 Mb内存_Ios_Xcode_Cocos2d Iphone - Fatal编程技术网

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团队的问题,但仍然: