
使用 Unity Tilemap 优化 2D 游戏的性能
这些提示最适合那些对Unity的2D工具集有一定经验的用户。另一个适合专业创作者开发商业2D游戏的优秀资源是我们的电子书,2D游戏艺术、灯光和动画。
如果您是使用Unity开发2D游戏的新手,请从新用户的2D指南开始。

一般性能提示
以下是一些需要考虑的一般性能提示:
- 从一开始就考虑您资产(数据)的性能。如果这些元素性能不佳,您之后几乎无法优化代码。
- 在您最低端的目标设备上进行性能分析。在整个项目开发过程中使用Unity Profiler,以及平台特定的性能分析工具,例如iOS设备的Xcode。
- 在您最低端的目标设备上,不要使用超过可用RAM的三分之一。这确保您的内容能够在广泛的移动设备上良好运行(便宜的安卓手机在移动市场中仍然是最受欢迎的)。
有关更多2D优化技巧,请参阅以下资源:

Tilemap的简要介绍

更少的GameObjects
使用瓦片地图可以减少加载时间,以及内存和 CPU 使用率。
如果你之前开发过 2D 游戏和应用程序,那么你知道你的游戏中可能会有大量的精灵,每个精灵都是单独的游戏对象。每个精灵游戏对象上都有组件,包括变换和渲染器,这些都占用内存。其他组件,如碰撞体,会带来 CPU 开销。
相比之下,瓦片地图为整个地图及其所有瓦片使用一个渲染器。这导致了更少的开销,因为它只处理自己的数据结构,而不是在内存中有多个数据结构。
拥有更少的游戏对象会导致更清晰的层次结构,这意味着你不必在复杂的列表中滚动以找到你需要的东西。

更小的场景大小
Unity 瓦片地图减少场景大小。拥有更少的游戏对象和组件意味着从磁盘加载、反序列化和在运行时保持在内存中的对象更少。
在 Unity 中加载场景是一个两部分的过程:首先,从磁盘读取数据。这是在你的游戏中通常耗时最长的过程,尤其是在安卓设备上。然后数据被反序列化。反序列化是将数据从一种格式转换为另一种格式的过程。本质上,它从保存的状态恢复数据和对象。Unity 在内部进行序列化,因此每当它在编辑器和运行时加载场景文件时,它会将这些保存的文件转换为 Unity 对象。
在上面的图像中,你可以看到两个序列化场景文件的比较,一个使用瓦片地图,另一个使用精灵重新创建。感谢Pixel Reign提供的这个场景,来自他们的游戏Robbie Swifthand。
右侧是一个序列化的Tilemap部分,由四个瓷砖组成。所有瓷砖的规则,包括使用的瓷砖类型,都在Tilemap的顶部设置。每个后续瓷砖声明了诸如使用的瓷砖及其位置等属性。
左侧是一个精灵,带有变换和精灵渲染器组件。
从这个比较中可以清楚地看出,精灵序列化需要做多少工作。特别是,使用精灵的场景在其文件中有370,000行,而使用Tilemaps的场景只有30,000行。较小的项目和仓库大小导致更快的迭代时间和更顺畅的工作流程。
如果要将自己的场景视为文本文件,请进入您的编辑器设置,打开资源序列化模式,点击强制文本,并在.unity场景文件中打开文本编辑器。

更少的碰撞体
您可以将2D瓷砖地图碰撞器与复合碰撞器结合使用。这不仅会减少碰撞器和精灵的数量,还会提高您的生产效率,因为每次更改时无需重建复杂的碰撞形状。复合碰撞器会处理这些。

减少的渲染开销
如前所述,每个精灵都有一个精灵渲染器组件,拥有更多渲染器会要求CPU做更多工作,包括剔除准备和渲染清理的时间。通过使用瓷砖地图,您将拥有更少的渲染器组件,从而节省CPU的一些工作。
降低的剔除成本
场景中有多个相机意味着更多的渲染器。这增加了剔除成本。
在相机视图中,剔除的成本是每个渲染器、每个相机的。每个相机都必须对场景中的每个渲染器组件执行剔除检查,因此如果您为游戏设置了多个相机,使用瓦片地图将帮助您降低成本。

更少的批处理调用
批处理是收集所有可以绘制的几何体,而不需要进行另一个 SetPass 调用。瓦片地图渲染器根据精灵的位置批处理几何体。结果是,瓦片地图渲染器向渲染管线发送的网格数量更少,但几何体更多,而精灵渲染器发送的网格数量更多,但几何体更少。如以下部分的表格所示,基于瓦片地图的场景的批次数显著减少。
您可以通过查看游戏视图中的统计面板来检查批处理情况。您还可以使用 帧调试器 来确定为什么项目没有批处理。

更快的帧率
要达到 60 fps,每帧的渲染时间最多为 16 毫秒。当在旧款 iPhone 7 上分析示例场景时,基于精灵的版本每帧为 244 毫秒,而基于瓦片地图的版本每帧为 13 毫秒。
最后,基于精灵的场景的 RAM 使用量为 1.1 GB,这对于低端安卓手机来说太多了。基于瓦片地图的场景仅使用了 21 MB 的 RAM,使其适合在更广泛的移动设备上运行。
上述比较显示了两个场景之间性能的明显差异。

使用Sprite Atlas打包精灵
精灵图集 是编辑器工具,允许您将精灵打包到纹理中,以优化内存使用和绘制调用。创建一个包含您在瓦片地图中使用的所有精灵的精灵图集资产,以便它们可以通过瓦片地图渲染器在一次绘制调用中批处理(只要所有精灵都适合单个纹理中)。
为2D游戏创作者提供更多资源
提升你的 2D 技能:我们的博客阅读列表提供了有关 2D 游戏开发的有用提示。
面向美术师的 2D 游戏美术、动画和光照:这本免费的电子书提供了利用 Unity 的 2D 工具集的最佳实践。
2D 工具概述:查看我们方便的概述,了解 Unity 为 2D 开发者提供了什么。
使用 Tilemaps 创建程序化图案 – 第一部分 和 第二部分:通过程序生成为您的游戏增添多样性。这些帖子解释了您可以与 Tilemap 和 RuleTile 一起使用的一些算法。