要想优化一个应用,你需要准确地测量出它对硬件的消耗。Unity 2021 LTS 推出了新的 Profiler 扩展功能,新 Profiler 计量器带有一种轻型的自定义机制,允许你为 Unity 应用和软件包设定你自己的性能指标。并且,你还能为 Profiler 添加模块,直接在窗口中可视化这些数据。

请在下方了解怎样使用这些功能来提高你项目的性能。

什么是Unity Profiler?

Unity Profiler 是一款用于记录应用详细性能的工具。它可以记录大多数类别的性能指标,比如内存、音频和渲染。记录下的指标数据既可在 Profiler 窗口中查看,有时也能用脚本查询。有了这些信息,你就能深入了解 Unity 应用如何使用目标平台的硬件资源,找出那些可以优化的地方。

Unity Profiler:

https://docs.unity3d.com/2021.2/Documentation/Manual/Profiler.html

打开网易新闻 查看精彩图片

Profiler计量器

什么是 Profiler 计量器?

Profiler 计量器负责跟踪、测量或计算应用产生的性能分析相关指标,比如,Unity 本身自带的默认 Profiler 计量器会跟踪记录应用所使用的总内存字节数,称为“Total Used Memory(总占用内存)”。这项数据在衡量目标设备上应用的内存足迹时非常重要。Profiler 窗口的 Memory 模块会按时间统计该数据以及其他与内存相关的指标,如下图。

打开网易新闻 查看精彩图片

自定义 Profiler 计量器

通过添加自己的 Profiler 计量器,你就能记录系统或应用内的特定性能指标。这些数据可以在 Profiler 窗口中与内置计量器等其他性能数据一起展示。而你就能直接在 Profiler 窗口中配合其他背景数据来查看应用独特的性能特征。

在下例中,一个自定义 Profiler 计量器会跟踪记录场景内活跃的生物数量。它与内置的 Batches Count 并排展示,后者记录着系统每帧会处理多少批次的渲染。如此一来,我们可以轻松地关联这两个指标,了解生物数量对批量渲染次数的影响。

打开网易新闻 查看精彩图片

左下角为Profiler计量器在游戏UI中的例子

此外,你所有的 Profiler 计量器包括内置自带的计量器都可以在发行版中使用。发行版比开发版更能代表应用的真实性能。

但是出于优化原因,Unity Profiler 并不能添加到发行版的游戏包中。这时,你可以从脚本查询 Profiler 计量器,有选择地监测发行版的重要指标。你可以用这种方法检测连续整合(Continuous Integration)里可能出现的性能倒退。或者,你也可以用 Unity 的 UI 系统在左下角(如下图)等位置显示一块调试界面。更多相关细节详见 Profiler Recorder 文档。

UI 系统:

https://docs.unity3d.com/Manual/UIToolkits.html

Profiler Recorder 文档:

https://docs.unity3d.com/ScriptReference/Unity.Profiling.ProfilerRecorder.html

打开网易新闻 查看精彩图片

在游戏UI的左下角显示的Profiler计量器

如果你只想在开发版中显示 Profiler 计量器,可以参照 Conditional Compilation 文档里的方法用 DEVELOPMENT_BUILD 脚本符号(scripting symbol)将其标出,在发行版中去除 Profiler。

Conditional Compilation 文档:

https://docs.unity3d.com/Manual/PlatformDependentCompilation.html

上手使用

Profiler 计量器目前已随Profiling.Core 包发布于 Unity 2021 LTS 版。Unity 2021 LTS 默认下不安装该软件包,请参考文档中的安装说明在 Package Manager 中查找并安装。

Profiling.Core 包:

https://docs.unity3d.com/Packages/com.unity.profiling.core@1.0/manual/profilercounter-guide.html

在安装完成后,你就能创建 Profiler 计量器(在 API 中叫做 ProfilerCounter 或 ProfilerCounterValue)并依照以下方法更新数据。

using UnityEngine; using Unity.Profiling; public class CreatureCounter : MonoBehaviour { static readonly ProfilerCounterValue k_CreatureCounter = new( ProfilerCategory.Scripts, "Creature Count", ProfilerMarkerDataUnit.Count, ProfilerCounterOptions.FlushOnEndOfFrame); void OnEnable() { k_CreatureCounter.Value += 1; } void OnDisable( ) { k_CreatureCounter.Value -= 1; }}

Profiler模块

什么是 Profiler 的模块?

Profiler 窗口内的模块显示着相应领域或流程中的统计信息,如内存、音频或渲染。每个模块都为特定领域的性能概况提供了详细信息。如下方的 Memory Profiler 模块便展示了内存占用相关的七个关键指标,再下边则是显示某一帧内存分布的详情部分。

打开网易新闻 查看精彩图片

Custom Profiler 自定义模块

Unity 2021 LTS 支持在分析器窗口内定制模块。你可以直接在窗口里显示你自己所选的性能指标。你也可以自定义模块详情界面的可视化方式,让你能以自由地选择性能数据的展示方法。

Profiler Module Editor(模块编辑器)

我们推荐使用Profiler Module Editor来快速创建临时性 Profiler 模块。比如你可以用临时性 Profiler 模块来检验某个新 Profiler 计量器。用 Profiler Module Editor 创建的模块与本地用户的编辑器绑定,不能在其他项目中使用。

打开网易新闻 查看精彩图片

更多详情请参见 模块编辑器文档 。

https://docs.unity3d.com/Manual/profiler-module-editor.html

Profiler 模块的 API

Profiler 模块 API 支持将自定义的模块添加到 Profiler 窗口中,供项目或软件包的所有用户使用。使用该 API 编写的模块会被自动添加到 Profiler 窗口,所有项目或软件包的用户都可使用。

资源商店的发布者或软件包开发者可以在包内直接发布自己设置的 Profiler 模块。用户在安装包的同时也会安装你的 Profiler 模块。这样一来,你就能直接在 Profiler 窗口内展示特定的性能指标。

Unity 的内部团队已经在使用这个 API 编写并发布自定义的 Profiler 模块。目前包含有自定义模块的软件包有 Netcode for GameObjects、Adaptive Performance、Mali System Metrics 等。

使用方法

若想使用该 API 创建一个 Profiler 模块,请参照以下代码在项目或包中新建一份 ProfilerModule 脚本。

using Unity.Profiling; using Unity.Profiling.Editor; [System.Serializable] [ProfilerModuleMetadata("Creature Batches")] public class CreatureBatchesProfilerModule : ProfilerModule { static readonly ProfilerCounterDescriptor[] k_Counters = { new("Creature Count", ProfilerCategory.Scripts), new("Batches Count", ProfilerCategory.Render), }; public CreatureBatchesProfilerModule() : base(k_Counters) { }}

新建的模块将自动出现在 Profiler 窗口内,供所有用户使用。

打开网易新闻 查看精彩图片

关于 API 的更多介绍请参见 Profiler 模块的手册和 API 文档。

手册:

https://docs.unity3d.com/2022.1/Documentation/Manual/Profiler-creating-custom-modules.html

API:

https://docs.unity3d.com/2021.2/Documentation/ScriptReference/Unity.Profiling.Editor.ProfilerModule.html

Profiler 模块的 API 还支持用 UI Toolkit 等 UI 系统为某一帧的性能数据绘制自定义的可视化图形。

例如,Adaptive Performance 的 Profiler 模块就使用了该 API 来展示某一帧的详细性能信息,以及性能瓶颈(Bottleneck)和过热警告(Thermal Warning)等其他背景信息。这些指标可以帮助用户清楚地了解到应用在什么情况下会触发设备的过热保护。所以,你也可以使用该 API 来自定义 Profiler 模块的性能数据可视化方法。

打开网易新闻 查看精彩图片

关于创建自定义 Profiler 模块的细节请参考 Profiler 模块的手册和 API 文档。

额外的背景数据

有时我们需要用 Profiler 模块和计量器来统计更多、更复杂的数据。比如在 Profiler 模块的详情部分展示当前帧的屏幕截图来作参考,如下图。

打开网易新闻 查看精彩图片

要想将图片等其他帧数据传给 Profiler,并在 Profiler 记录内展示,你可以使用 Profiler.EmitFrameMetaData 和 FrameDataView.GetFrameMetaData 这两个 Frame Metadata API。

如果数据在每次分析时只需记录一次,比如游戏的配置,你也可以使用 Profiler.EmitSessionMetaData 和 FrameDataView.GetSessionMetaData 这两个 Session Metadata API。

Profiler.EmitFrameMetaData:

https://docs.unity3d.com/2021.2/Documentation/ScriptReference/Profiling.Profiler.EmitFrameMetaData.html

FrameDataView.GetFrameMetaData:

https://docs.unity3d.com/2021.2/Documentation/ScriptReference/Profiling.FrameDataView.GetFrameMetaData.html

Profiler.EmitSessionMetaData:

https://docs.unity3d.com/2021.2/Documentation/ScriptReference/Profiling.Profiler.EmitSessionMetaData.html

FrameDataView.GetSessionMetaData:

https://docs.unity3d.com/2021.2/Documentation/ScriptReference/Profiling.FrameDataView.GetSessionMetaData.html

结论

本文介绍了怎样自定义性能指标、扩展 Unity Profiler。我们还了解我们怎样用 Profiling.Core 的 Profiler 计量器来添加自定义指标。然后还探索了如何用 Profiler Module Editor 和 Profiler Module API 在窗口中添加自定义模块。最后,我们又解释了怎样向 Profiler 发送图片等额外数据作背景参考。

Profiling.Core:

https://docs.unity3d.com/Packages/com.unity.profiling.core@1.0/manual/profilercounter-guide.html

希望这些扩展功能可以帮助你更好地检测和理解应用的性能。

Unity 官方微信

第一时间了解Unity引擎动向,学习最新开发技巧

每一个“在看”,都是我们前进的动力