Cocos2d纹理质量与内存大小 - 如何获得可接受的结果?

时间:2013-11-18 12:40:33

标签: ios ipad memory-management cocos2d-iphone

我目前正在尝试减少纹理的内存大小。我已经使用了纹理打包器,以及带有RGB565或RGB5551的.pvr.cczs。然而,这通常会导致纹理质量的巨大降低,不可接受。

具体来说,我得到了主角的spritesheet。在尺寸上它大约是4k * 2.5k像素。由于我们有很多不同的动画,我们需要一个可以接受ipad视网膜显示尺寸的角色。因此,当我们在场景中使用时,减少角色精灵的大小会再次导致质量的大幅降低。

所以我当然试图尽可能多地使用16位纹理。使用上面提到的spritesheet作为16位纹理需要大约17 MB的内存。这已经很多了。由于它是角色的spritesheet,纹理需要透明度,因此我需要使用rgb5551作为颜色深度。只有1位的alpha通道,这个角色看起来很丑陋。事实上,所有需要alpha的东西看起来都很难看,而alpha通道只有1位。

然而,如果我使用RGB8888而不是spritesheet使用双倍内存,大约34mb。现在想象一下场景中的几个角色,你最终只能获得100mb内存。添加一般的开销,声音,背景,前景,对象和UI,你最终会得到太多的内存。事实上,就我而言,100mb是“太多的记忆”。

我觉得我在整个过程中忽略了一些东西。像我没有做过的事情或其他事情。 RGB4444也没有解决方案,它真的看起来不可接受。

简而言之:如何获得可接受的纹理质量,包括低于100mb内存的alpha通道? “一点也不”?因为就我所能看到的那种情况来说,这就是它。

1 个答案:

答案 0 :(得分:1)

以'per character / peranimation / per resolution'文件分割主纹理。使用.pvr.ccz是因为它们加载速度更快(速度更快,我在某些设备上的测量速度提高了8倍)。如果您使用的是TexturePacker,那么您应该能够消除“pvr”转换中的大多数(如果不是全部)假象。

在运行场景时,只预加载您知道需要的“下一个”姿势/姿势/战斗。使用完成块试验异步加载,以便在纹理可用时发出信号。尽可能快地转储未使用的纹理。与一次加载所有动画相比,这将使内存要求更加平缓。

最后,你真的需要15帧所有这些动画吗?对于一些动画(空闲,睡着,其他也是如此),我只需要5帧即可。 TexturePacker采用特定帧周围的对称动画,只需指向midPoint +1 ... midPoint + N到MidPoint -N ...... MidPoint -1。