使用内置分析器测定性能

Unity iOS 和 Android 都带有内置分析器。它包含在附加元件的所有版本中,而专业版独有的功能。(但专业版附加元件确实配有更加高级的分析器。)内置分析器从设备上正在运行的游戏中发出控制台消息。这些信息每 30 秒写入一次,让您深入了解提供 游戏运行方式。理解这些信息的含义并非易事,但它们至少可以让您快速确定游戏是 CPU 还是 GPU 绑定,或者如果是 CPU 绑定,那么是 CPU 脚本代码还是降低运行速度的 Mono 垃圾集合。您可以在本页稍后了解如何配置内置的分析器。

分析器能告诉您什么

下面是一个内置分析器输出的实例。

iPhone/iPad Unity internal profiler stats:
cpu-player>    min:  9.8   max: 24.0   avg: 16.3
cpu-ogles-drv> min:  1.8   max:  8.2   avg:  4.3
cpu-waits-gpu> min:  0.8   max:  1.2   avg:  0.9
cpu-present>   min:  1.2   max:  3.9   avg:  1.6
frametime>     min: 31.9   max: 37.8   avg: 34.1
draw-call #>   min:   4    max:   9    avg:   6     | batched:    10
tris #>        min:  3590  max:  4561  avg:  3871   | batched:  3572
verts #>       min:  1940  max:  2487  avg:  2104   | batched:  1900
player-detail> physx:  1.2 animation:  1.2 culling:  0.5 skinning:  0.0 batching:  0.2 render: 12.0 fixed-update-count: 1 .. 2
mono-scripts>  update:  0.5   fixedUpdate:  0.0 coroutines:  0.0 
mono-memory>   used heap: 233472 allocated heap: 548864  max number of collections: 1 collection total duration:  5.7

所有时间都是以毫秒/帧为单位。您可以查看最后 30 帧内的最小、最大和平均时间。

General CPU Activity

cpu-player显示游戏 Unity 引擎内部执行代码以及在 CPU 执行脚本所花费的时间。
cpu-ogles-drv显示在 CPU 上执行 OpenGL ES 驱动程序代码所花费的时间。很多因素都可以影响驱动程序统计,如绘制调用的数目、内部渲染状态的数目变化、渲染管线的设置,甚至是处理顶点的数目。
cpu-waits-gpu显示等待 GPU 完成渲染期间,CPU 的闲置时间。如果这个数字超过 2-3 毫秒,就最有可能说明应用程序是填充率/GPU 处理绑定。如果这个值太小,配置文件将跳过显示此值。
msaa-resolve应用抗锯齿所需时间。
cpu-present在 OpenGL ES 中执行 presentRenderbuffer 命令花费的时间量。
frametime代表游戏帧花费的总时间。请注意,iOS 硬件始终锁定为 60Hz 刷新率,所以您总会得到 ~16.7ms (1000ms/60Hz = ~16.7ms) 的倍数时间。

渲染统计

draw-call #每帧绘制调用的数量。尽可能保持低值。
tris #用于渲染的三角形总数。
verts #用于渲染的顶点总数。如果仅使用静态几何体,建议将这一数值保持在 10000 以下。但如果使用大量蒙皮几何体,则应保持更低的值。
batched引擎自动批处理的绘制调用、三角形和顶点数量。将这些数字与绘制调用和三角形总数对比,您将了解场景准备批处理的好坏程度。在对象中分享尽可能多的材质,以提高批处理。

详细的 Unity 播放器统计信息

播放器详情 (player-detail) 部分提供 引擎内部运行的详细分解:-

physx物理花费的时间。
animation骨骼动画花费的时间。
culling摄像机视景外剔除对象花费的时间。
skinning应用动画至蒙皮网格花费的时间。
batching批处理几何体花费的时间。批处理动态几何体比静态几何体成本要更加昂贵。
render渲染可见对象花费的时间。
fixed-update-count此帧中执行的 FixedUpdates 的最小和最大数量。过多的 FixedUpdates 将严重影响性能。此处提供 了一些简单的指引,帮助您设置较好的固定时间增量值。

详细的脚本统计信息

mono-scripts 部分提供 了 Mono 运行时执行代码所花费时间的详细分解:

update在脚本中执行全部 Update() 函数花费的时间。
fixedUpdate在脚本中执行全部 FixedUpdate() 函数花费的时间。
coroutines脚本协同程序内部花费的时间。

脚本分配的内存的详细统计信息

mono-memory 部分向您介绍了 Mono 垃圾回收器如何管理内存:

allocated heap可供分配的内存总量。如果给定的分配堆中内存不足,将触发垃圾回收。如果在回收之后,内存依然不够,那么分配堆的容量将扩展。
used heap当前对象用完的分配堆中的部分。每次创建新的类实例(不是结构体),这个数字都将增长,直到下一次垃圾回收。
max number of collections最后 30 帧垃圾回收通过的数量。
collection total duration最后 30 帧,所有垃圾回收通过的总时间(毫秒)。

配置

iOS

iOS 默认禁用分析器。如需启动,必须打开 Unity 生成的 XCode 工程。选择 iPhone_Profiler.h 文件并将

#define ENABLE_INTERNAL_PROFILER 0

一行更改为

#define ENABLE_INTERNAL_PROFILER 1

在 XCode 菜单栏中选择查看 (View) > 调试区 (Debug Area) > 激活控制台 (Activate Console),显示输出的控制台 (GDB),然后运行您的工程。Unity 将每 30 帧向控制台窗口输出统计信息。

Android

Android 默认启用分析器。只需在构建时勾选播放器设置中的开发构建 (Development Build),启动设备时,统计资料将显示在 logcat 中。如需查看 logcat,您需要 adb 或 Android Debug Bridge。若符合条件,运行 shell 命令adb logcat 即可。

Page last updated: 2013-06-28