Version: 2023.1
iOS 特定优化
优化构建的 iOS 播放器的大小

使用内置性能分析器来衡量性能

注意:内部的性能分析器已被弃用,在 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 活动

属性 功能
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 引擎自动批处理的绘制调用、三角形和顶点的数量。将这些数字与绘制调用和三角形总数比较,就可以知道场景的批处理准备状态。为改善批处理性能,应当在对象之间尽可能多分享材质。

详细 Unity Player 统计信息

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

iOS 特定优化
优化构建的 iOS 播放器的大小