我为这个长期问题提前道歉,有多个子问题,但问题实际上正如标题中所述。以下所有内容都是对问题不同方面的详细分解。
在我使用cocos2d构建的通用ios游戏中,我有四类图像 - 我想确定哪些应该进入spritesheets,哪些更好地作为单独的图像加载。我目前的猜测是,只有在整个游戏中运行的角色动画才会将值作为spritesheets加载到内存中:
一些常见的相关问题:
a)将不同场景中使用的图像打包到同一个spritesheet中,即使在该场景中只使用了一部分图像,我们也会将它们加载到内存中。我认为这是一个坏主意。正确的吗?
b)游戏中只有较旧的设备(iPad 1和iPhone 3gs)才会出现断断续续的情况。 spritesheets会帮助减少这种口吃吗?
c)我认为spritesheets只会有利于运行时内存占用,而不是应用程序存档的磁盘大小。例如,我注意到一组大小为11.8 MB的文件,当放入spritesheet时是11 Mb - 压缩效益不大。这是一个有效的假设吗?
请告诉我你对我上述理由的看法。
由于
阿南德
答案 0 :(得分:4)
绝对是纹理图集。
Cocos2d的缓存机制会导致所有单个图像被缓存并保留在内存中,因此最终它们将比使用纹理图集更多。如果它们很少需要我会使用单个图像(即菜单图标),我也会在它们被添加到场景后将它们从CCTextureCache中删除,以确保它们在离开该菜单屏幕时将从内存中删除
假设可能是错误的。 320x480图像使用512x512作为内存中的纹理。如果你有多个,你可能最好将它们全部放在一个纹理图集中。除非您在cocos2d中启用了NPOT支持。同样,不要忘记CCTextureCache正在缓存纹理。
请记住,大型纹理可以从spritebatching中获益良多。因此,即使纹理图集中只有2-3张图像,它也会对性能产生影响。
a)这取决于。如果您的应用程序内存不足,您可能需要单独的纹理图集。否则,将图像打包成单个纹理图集(如果可能的话)将是浪费。
b)这取决于导致口吃的原因。最常见的问题:在游戏过程中加载资源(即图像),或者每帧创建和删除多个节点,而不是重复使用现有节点。
c)可能。它可能取决于纹理图集工具(我推荐TexturePacker)。这绝对取决于文件格式。如果你可以将多个PNG打包到一个.pvr.ccz纹理图集中,你将节省大量内存(并提高加载速度)。
有关详细信息,请参阅我的cocos2d memory optimization blog post。