注意:内部的性能分析器已被弃用,在 Unity 的未来版本中将不再使用。请改用 Profiler 窗口(菜单:Window > Analysis > Profiler)。
Unity 包含适用于 iOS 和 Android 的内置性能分析器。内置性能分析器每 30 帧会从设备上运行的应用程序发出控制台消息。这些消息可让用户深入了解应用程序的运行状况。这些消息特别有助于确定应用程序是 CPU 密集型还是 GPU 密集型。如果应用程序是 CPU 密集型,则还可以确定脚本代码还是垃圾收集造成了瓶颈。本页详细介绍了如何配置内置性能分析器。
以下是内置性能分析器的输出示例:
iPhone Unity internal profiler stats
frametime> min: 32.5 max: 34.1 avg: 33.3
cpu-player> min: 2.2 max: 4.4 avg: 3.7
batches> min: 3 max: 3 avg: 3
draw calls> min: 3 max: 3 avg: 3
tris> min: 1704 max: 1704 avg: 1704
verts> min: 5088 max: 5088 avg: 5088
dynamic batching> batched draw calls: 0 batches: 0 tris: 0 verts: 0
static batching> batched draw calls: 0 batches: 0 tris: 0 verts: 0
player-detail> physx: 0.0 animation: 0.0 culling 0.0 skinning: 0.0 batching: 0.0 render: 0.0 fixed-update-count: 0 .. 0
scripting-scripts> update: 0.0 fixedUpdate: 0.0 coroutines: 0.0
scripting-memory> information not available on non-development player configuration
所有时间均以毫秒/帧为单位。可以查看最近三十帧的最短时间、最长时间和平均时间。
属性 | 功能 |
---|---|
cpu-player | 显示应用程序在 Unity 引擎中执行代码以及在 CPU 上执行脚本所用的时间。 |
cpu-ogles-drv__(仅限 Android) |显示在 CPU 上执行 OpenGL ES 驱动程序代码所用的时间。这些驱动程序统计信息可能受到多种因素的影响,包括绘制调用的数量、内部渲染状态变化的数量、渲染管线设置以及已处理顶点的数量。| |cpu-present__(仅限 Android) | 在 OpenGL ES 中执行 presentRenderbuffer 命令所用的时间。 |
frametime | 表示一个应用程序帧的总时间。请注意,iOS 硬件的刷新率锁定在 60Hz,因此该属性将始终返回 16.7ms (1000ms/60Hz = 16.7ms) 的倍数。 |
属性 | 功能 |
---|---|
tris # | 为渲染发送的三角形总数。 |
verts # | 为渲染发送的顶点总数。如果应用程序仅使用静态几何体,则应将此数字保持在 10000 以下。如果应用程序使用了很多蒙皮几何体实例,则此数字应该低得多。 |
dynamic/static batching | 引擎自动批处理的绘制调用、三角形和顶点的数量。将这些数字与绘制调用和三角形总数比较,就可以知道场景的批处理准备状态。为改善批处理性能,应当在对象之间尽可能多分享材质。 |
player-detail 部分提供引擎内部情况的详细分类:
属性 | 功能 |
---|---|
physx | 在物理方面所用的时间。 |
animation | 为骨骼生成动画时所用的时间。 |
culling | 剔除摄像机视锥体外的对象所用的时间。 |
skinning | 将动画应用于蒙皮网格所用的时间。 |
batching | 对几何体进行批处理所用的时间。与静态几何体的批处理相比,动态几何体的批处理需要更多的资源。 |
render | 对可见对象进行渲染所用的时间。 |
fixed-update-count | 在此帧期间执行的 FixedUpdates 的最小和最大数量。过多的 FixedUpdates 将大大降低性能。 |
scripting-scripts 部分提供 Mono 运行时期间执行代码所用的时间的详细分类:
属性 | 功能 |
---|---|
update | 脚本中执行所有 Update() 方法所用的总时间。 |
fixedUpdate | 脚本中执行所有 FixedUpdate() 方法所用的总时间。 |
coroutines | 在脚本协程内所用的时间。 |
scripting-memory 部分让您了解 Mono 垃圾回收器如何管理内存:
属性__: |功能__: | |
---|---|
allocated heap | 可用于分配的内存总量。如果堆没有足够的内存用于给定的分配,将触发垃圾收集。如果垃圾收集没有释放足够的内存,那么分配的堆的大小将增大。 |
used heap | 在 allocated heap 中当前已由对象使用的部分。每次创建新类实例(不是结构)时,该数字都会增长,直到进行下一次垃圾收集。 |
max number of collections | 最近 30 帧期间的垃圾收集执行次数。 |
collection total duration | 在最近 30 帧期间发生的所有垃圾收集过程的总时间(毫秒)。 |
在 iOS 上,内部性能分析器默认处于禁用状态。要启用,请打开 Unity 生成的 Xcode 项目,选择 InternalProfiler.h
文件,将以下行
# define ENABLE_INTERNAL_PROFILER 0
更改为
# define ENABLE_INTERNAL_PROFILER 1
或者,访问 iOS 的 Player Settings(菜单:Edit > Project Settings > Player Settings,然后选择 iOS)。在 Debugging and crash reporting 部分中,启用 Enable Internal Profiler (Deprecated) 设置。在构建应用程序时,确保在 Build Settings 中启用了 Development Build。
要显示输出控制台 (GDB),请从 Xcode 的主菜单中选择 __View > Debug Area > Activate Console__,然后运行项目。然后,Unity 每 30 帧就会将统计信息输出到控制台窗口。
要在 Android 上启用内部性能分析器,请访问 Android 的 Player Settings(菜单:Edit > Project Settings > Player Settings,然后选择 Android)。在 Optimization 部分中,启用 Enable Internal Profiler (Deprecated) 设置。在构建应用程序时,确保在 Build Settings 中启用了 Development Build。应用程序在设备上运行时,统计信息将显示在 logcat 中。要查看 logcat,请确保安装了 adb 或 Android Debug Bridge,然后运行 shell 命令 adb logcat
。