什么样的图像应该进入cocos2d ios应用程序的spritesheet?

时间:2013-01-14 05:18:30

标签: ios cocos2d-iphone sprite-sheet

我为这个长期问题提前道歉,有多个子问题,但问题实际上正如标题中所述。以下所有内容都是对问题不同方面的详细分解。

在我使用cocos2d构建的通用ios游戏中,我有四类图像 - 我想确定哪些应该进入spritesheets,哪些更好地作为单独的图像加载。我目前的猜测是,只有在整个游戏中运行的角色动画才会将值作为spritesheets加载到内存中:

  1. 在整个游戏过程中运行的角色动画(除了 当用户在菜单中时):对于这些,我假设有图像 在spritesheet中将减少运行时内存使用量(由于 因此,将单个文件填充到两个字节边界的幂 他们是spritesheet的候选人。那是对的吗?
  2. 小图像(约200个),其中0到4显示 在游戏过程中随机挑选的时间。对于这些,我不确定 如果值得将所有200个图像加载到内存中仅在 大多数任何4个一次使用。所以直接可能会更好 将它们作为图像访问。那是对的吗?
  3. 一些(大约20个)小菜单元素,例如仅在静态菜单中使用的按钮:由于菜单项仅在菜单显示期间使用,我认为它们在通过spritesheets改善内存访问方面没有多大价值。那是对的吗?
  4. 一些大图像,用作菜单,游戏场景等的背景。这些图像中的大多数都与屏幕分辨率一样大。由于屏幕分辨率大致等于单个图像的最大尺寸(例如,对于ipad视网膜,4096 x 4096图像尺寸与屏幕尺寸为2048 x 1536),因此使用spritesheets时没有太大的好处。大多数1或2个大图像适合一个spritesheet。此外,由于这些大文件中的每一个仅在一个场景中使用,因此将所有这些大图像作为spritesheets在内存中预先加载似乎是不必要的开销。因此,直接访问它们作为spritesheets。这是对的吗?
  5. 一些常见的相关问题:

    a)将不同场景中使用的图像打包到同一个spritesheet中,即使在该场景中只使用了一部分图像,我们也会将它们加载到内存中。我认为这是一个坏主意。正确的吗?

    b)游戏中只有较旧的设备(iPad 1和iPhone 3gs)才会出现断断续续的情况。 spritesheets会帮助减少这种口吃吗?

    c)我认为spritesheets只会有利于运行时内存占用,而不是应用程序存档的磁盘大小。例如,我注意到一组大小为11.8 MB的文件,当放入spritesheet时是11 Mb - 压缩效益不大。这是一个有效的假设吗?

    请告诉我你对我上述理由的看法。

    由于

    阿南德

1 个答案:

答案 0 :(得分:4)

经验法则:一切都在spritesheet(纹理图集)中,除非有充分的理由不这样做。

  1. 绝对是纹理图集。

  2. Cocos2d的缓存机制会导致所有单个图像被缓存并保留在内存中,因此最终它们将比使用纹理图集更多。如果它们很少需要我会使用单个图像(即菜单图标),我也会在它们被添加到场景后将它们从CCTextureCache中删除,以确保它们在离开该菜单屏幕时将从内存中删除

  3. 假设可能是错误的。 320x480图像使用512x512作为内存中的纹理。如果你有多个,你可能最好将它们全部放在一个纹理图集中。除非您在cocos2d中启用了NPOT支持。同样,不要忘记CCTextureCache正在缓存纹理。

  4. 请记住,大型纹理可以从spritebatching中获益良多。因此,即使纹理图集中只有2-3张图像,它也会对性能产生影响。

  5. a)这取​​决于。如果您的应用程序内存不足,您可能需要单独的纹理图集。否则,将图像打包成单个纹理图集(如果可能的话)将是浪费。

    b)这取决于导致口吃的原因。最常见的问题:在游戏过程中加载资源(即图像),或者每帧创建和删除多个节点,而不是重复使用现有节点。

    c)可能。它可能取决于纹理图集工具(我推荐TexturePacker)。这绝对取决于文件格式。如果你可以将多个PNG打包到一个.pvr.ccz纹理图集中,你将节省大量内存(并提高加载速度)。

    有关详细信息,请参阅我的cocos2d memory optimization blog post