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

> Use and configure the built-in profiler for iOS.

\*\*注意：\*\*内部的性能分析器已被弃用，并将在 Unity 的未来版本中移除。请改用 [性能分析器窗口 (Profiler window)](/engine/6000.0/manual/analysis/profiler/window.md)。（菜单：**窗口 (Window)** > **分析 (Analysis)** > **性能分析器 (Profiler)**）请参阅[在 iOS 设备上收集性能数据](/engine/6000.0/manual/platform-specific/iphone/ios-developing/ios-testing-and-debugging/ios-profile-device.md)，以了解如何对 iOS 设备进行性能分析。

Unity 提供了一个适用于 iOS 的内置性能分析器，用于深入了解应用程序的运行情况。每 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
```

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

## 常规 CPU 活动##general-cpu-activity

| **属性**                        | **功能**                                                                              |
| ----------------------------- | ----------------------------------------------------------------------------------- |
| **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) 的倍数。      |

## 渲染统计信息##rendering-statistics

| **属性**                      | **功能**                                                                              |
| --------------------------- | ----------------------------------------------------------------------------------- |
| **tris #**                  | 为渲染发送的三角形总数。                                                                        |
| **verts #**                 | 发送用于渲染的顶点总数。如果应用程序仅使用静态几何体，建议将该值保持在 10000 以下；如果应用程序包含大量蒙皮几何体实例，则该值应更低。              |
| **dynamic/static batching** | 引擎自动批处理的绘制调用、三角形和顶点的数量。通过与绘制调用和三角形总数进行对比，可以评估场景的批处理优化程度。为了提高批处理效率，建议在对象之间共享尽可能多的材质。 |

## 详细 Unity Player 统计信息##detailed-unity-player-statistics

**player-detail** 部分提供了引擎内部运行的详细分解：

| **属性**                 | **功能**                                                   |
| ---------------------- | -------------------------------------------------------- |
| **physx**              | 在物理方面所用的时间。                                              |
| **animation**          | 为骨骼生成动画时所用的时间。                                           |
| **culling**            | 剔除摄像机视锥体外的对象所用的时间。                                       |
| **skinning**           | 将动画应用于蒙皮网格所用的时间。                                         |
| **batching**           | 批处理几何体所用的时间。动态几何体的批处理比静态几何体更消耗资源。                        |
| **render**             | 对可见对象进行渲染所用的时间。                                          |
| **fixed-update-count** | 在此帧期间执行的 FixedUpdates 的最小和最大次数。过多的 FixedUpdates 会显著降低性能。 |

## 详细脚本统计信息##detailed-script-statistics

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

| **属性**          | **功能**                          |
| --------------- | ------------------------------- |
| **update**      | 执行脚本中所有 `Update()` 方法的总时间。      |
| **fixedUpdate** | 执行脚本中所有 `FixedUpdate()` 方法的总时间。 |
| **coroutines**  | 在脚本协程内所用的时间。                    |

## 按脚本分配的内存的详细统计信息##detailed-statistics-on-memory-allocated-by-scripts

**scripting-memory** 部分展示了 Mono 垃圾回收器的内存管理情况：

| **属性**：                       | **功能**：                                                            |
| ----------------------------- | ------------------------------------------------------------------ |
| **allocated heap**            | 可用于分配的总内存量。如果堆内存不足以满足分配需求，将触发垃圾回收。如果垃圾回收未能释放足够内存，分配的堆大小将增加。        |
| **used heap**                 | 在 **allocated heap** 中当前已由对象使用的部分。每次创建新类实例（非结构体）时，该值会增加，直到下一次垃圾回收。 |
| **max number of collections** | 最近 30 帧期间的垃圾收集执行次数。                                                |
| **collection total duration** | 在最近 30 帧期间发生的所有垃圾收集过程的总时间（毫秒）。                                     |

## 配置##configuration

在 iOS 上，内部性能分析器默认禁用。要启用它，请使用以下任一方法：

### Xcode 项目##xcode-project

要从 Xcode 项目中启用内部性能分析器，请按照以下步骤操作：

1. 打开 Unity 生成的 Xcode 项目。
2. 选择 `InternalProfiler.h` 文件。
3. 修改以下代码：

```
#define ENABLE_INTERNAL_PROFILER 0
```

更改为

```
#define ENABLE_INTERNAL_PROFILER 1
```

### 播放器设置 (Player settings)##player-settings

要在 Unity 中启用内部性能分析器，请使用以下步骤：

1. 在主菜单中，转到**编辑 (Edit)** > **项目设置 (Project Settings)** > **播放器设置 (Player Settings)**> **iOS**。
2. 在 **Debugging and crash reporting** 部分中，启用 **Enable Internal Profiler (Deprecated)** 选项。

**注意**：确保在构建应用程序时从**构建设置 (Build Settings)** 中启用**开发构建 (Development Build)** 选项。

## 显示控制台##display-the-console

在 Xcode 中，依次选择**查看 (View)** > **调试区 (Debug Area)** > **激活控制台 (Activate Console)** 以显示输出控制台，然后运行项目。Unity 每 30 帧会将统计信息输出到控制台窗口。
