2

我为这个冗长的问题预先道歉,有多个子问题,但问题确实如标题中所述。接下来是对问题不同方面的详细分解。

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

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

几个常见的相关问题:

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

b) 仅在较旧的设备(iPad 1 和 iPhone 3gs)上玩游戏时会出现口吃。spritesheets 会帮助减少这种卡顿吗?

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

请让我知道您对上述理由的看法。

谢谢

阿南德

4

1 回答 1

4

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

  1. 绝对是纹理图集。

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

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

  4. 请记住,大型纹理从 spritebatching 中受益匪浅。因此,即使纹理图集中可能只有 2-3 张图像,它也可以在性能上产生差异。

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

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

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

有关更多信息,请参阅我的cocos2d 内存优化博客文章

于 2013-01-14T20:43:02.503 回答