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

标签 ios cocos2d-iphone sprite-sheet

对于这个包含多个子问题的长问题,我预先表示歉意,但问题确实如标题中所述。接下来是对问题不同方面的详分割解。

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

  1. 贯穿整个游戏过程的角色动画(除了 当用户在菜单中时):对于这些,我假设有图像 在 spritesheet 中将减少运行时内存使用(由于 单个文件的填充到两个字节边界的幂),因此 它们是 Sprite 表的候选者。那是对的吗?
  2. 小图片(约200张),任意显示0到4张 时间,在游戏过程中随机选择。对于这些,我不确定 是否值得将所有 200 张图像加载到内存中 大多数同时使用任意 4 个。所以最好直接 以图像形式访问它们。那是对的吗?
  3. 一些(大约 20 个)小菜单元素,例如仅在静态菜单中使用的按钮:由于菜单项仅在菜单显示期间使用,我认为它们对于通过 spritesheet 改善内存访问没有多大值(value)。那是对的吗?
  4. 一些用作菜单、游戏场景等背景的大图像。这些图像大多数与屏幕分辨率一样大。由于屏幕分辨率大致等于单个图像的最大尺寸(例如,对于 ipad 视网膜,4096 x 4096 图像尺寸与 2048 x 1536 的屏幕尺寸相比),因此使用 spritesheet 并没有多大好处,因为最多 1或 2 个大图像适合一张 Sprite 表。此外,由于每个大文件仅在一个场景中使用,因此预先将所有这些大图像作为 Sprite 表加载到内存中似乎是一种不必要的开销。因此,可以直接将它们作为 Sprite 表访问。这是正确的吗?

一些常见的相关问题:

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

b) 仅在旧设备(iPad 1 和 iPhone 3gs)上玩游戏时会出现卡顿现象。 Sprite 表有助于减少这种卡顿吗?

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

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

谢谢

阿南德

最佳答案

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

  1. 绝对是纹理图集。

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

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

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

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

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

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

有关更多信息,请参阅我的 cocos2d memory optimization blog post .

关于ios - 什么样的图像应该进入 cocos2d ios 应用程序的 spritesheet 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14313613/

相关文章:

ios - 删除 HTML 关键字或标签并在 Swift 3 中转换为普通可读字符串

iphone - 自定义UISlider(跟踪图片高度)

ios - Apple 的 Controller 在 iOS7 中无法正确显示

iphone:如何进行翻页

javascript - 中间点击JS函数

ios - "PixelHeight"和 "PixelWidth"是否始终出现在 ALAssetRepresentation 元数据中?

iphone - 应该设置球的哪些物理属性?

cocos2d-iphone - SimpleAudioEngine Cocos2d 泄漏内存

Java:我不明白这个 Sprite 表读取代码的部分意义是什么?

html - 使用 HTML 5 Canvas 的 Sprite-Sheet BLIT?