您想找什么?
Hero background image

使用 Unity Tilemap 优化 2D 游戏的性能

获取提示以改善您使用Unity Tilemap开发的2D游戏和移动应用的性能。这里涵盖的主题包括场景大小、序列化、渲染器开销和批处理。
为方便起见,此网页已进行机器翻译。我们无法保证翻译内容的准确性或可靠性。如果您对翻译内容的准确性有疑问,请参阅此网页的官方英文版本。

这些提示最适合那些对Unity的2D工具集有一定经验的用户。另一个适合专业创作者开发商业2D游戏的优秀资源是我们的电子书,2D游戏艺术、灯光和动画

如果您是使用Unity开发2D游戏的新手,请从新用户的2D指南开始。

Unity编辑器的截图
来自UNITY 2D项目LOST CRYPT的图像

一般性能提示

以下是一些需要考虑的一般性能提示:

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

有关更多2D优化技巧,请参阅以下资源:

Unity - 使用 Tilemap 快速创建 2D 关卡
瓦片地图示例

Tilemap的简要介绍

Tilemap组件允许您使用网格覆盖上的瓷砖高效创建2D关卡。它由多个元素组成,包括:

您可以使用精灵和游戏对象的组合创建2D关卡,并控制诸如排序层、Tilemap碰撞体和动画瓷砖等属性。您还可以绘制方形六边形等距精灵

使用Tilemap绘制您的关卡,以便在应用于Tilemap游戏对象时,Tilemap Collider 2D组件会根据瓷砖的碰撞体类型设置自动生成一个碰撞体。

让我们看看与使用精灵构建的场景相比,您从Tilemap中获得的性能提升。

具有较少对象的瓦片地图
UNITY 2D 演示 DRAGON CRASHERS 中的瓦片地图

更少的GameObjects

使用瓦片地图可以减少加载时间,以及内存和 CPU 使用率。

如果你之前开发过 2D 游戏和应用程序,那么你知道你的游戏中可能会有大量的精灵,每个精灵都是单独的游戏对象。每个精灵游戏对象上都有组件,包括变换和渲染器,这些都占用内存。其他组件,如碰撞体,会带来 CPU 开销。

相比之下,瓦片地图为整个地图及其所有瓦片使用一个渲染器。这导致了更少的开销,因为它只处理自己的数据结构,而不是在内存中有多个数据结构。

拥有更少的游戏对象会导致更清晰的层次结构,这意味着你不必在复杂的列表中滚动以找到你需要的东西。

Unity - 使用 Tilemap 的更小的场景
两个序列化文件的比较,一个使用精灵(左侧),另一个使用瓦片地图(右侧)

更小的场景大小

Unity 瓦片地图减少场景大小。拥有更少的游戏对象和组件意味着从磁盘加载、反序列化和在运行时保持在内存中的对象更少。

在 Unity 中加载场景是一个两部分的过程:首先,从磁盘读取数据。这是在你的游戏中通常耗时最长的过程,尤其是在安卓设备上。然后数据被反序列化。反序列化是将数据从一种格式转换为另一种格式的过程。本质上,它从保存的状态恢复数据和对象。Unity 在内部进行序列化,因此每当它在编辑器和运行时加载场景文件时,它会将这些保存的文件转换为 Unity 对象。

在上面的图像中,你可以看到两个序列化场景文件的比较,一个使用瓦片地图,另一个使用精灵重新创建。感谢Pixel Reign提供的这个场景,来自他们的游戏Robbie Swifthand

右侧是一个序列化的Tilemap部分,由四个瓷砖组成。所有瓷砖的规则,包括使用的瓷砖类型,都在Tilemap的顶部设置。每个后续瓷砖声明了诸如使用的瓷砖及其位置等属性。

左侧是一个精灵,带有变换和精灵渲染器组件。

从这个比较中可以清楚地看出,精灵序列化需要做多少工作。特别是,使用精灵的场景在其文件中有370,000行,而使用Tilemaps的场景只有30,000行。较小的项目和仓库大小导致更快的迭代时间和更顺畅的工作流程。

如果要将自己的场景视为文本文件,请进入您的编辑器设置,打开资源序列化模式,点击强制文本,并在.unity场景文件中打开文本编辑器

Unity - 使用 Tilemap 减少碰撞体
2D瓷砖地图碰撞器与2D复合碰撞器结合使用

更少的碰撞体

您可以将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 一起使用的一些算法。