# CPU 使用情况性能分析器模块简介

> Investigate the CPU performance of your application and identify performance bottlenecks.

借助 CPU 性能分析器模块，全面了解应用程序的时间消耗情况。

CPU 使用情况性能分析器模块能概览应用程序在哪些方面消耗时间，比如渲染、脚本以及动画。该模块会在窗口顶部的图表中显示应用程序时间消耗信息。您可以选择单个帧，在时间轴中检查数据，也可以在[性能分析器窗口](/engine/6000.0/manual/analysis/profiler/window-reference.md)下半部分的详细信息窗格中，查看各种层级视图。

## 视图

CPU 使用情况性能分析器模块可以在时间轴视图或不同的层级视图中显示性能分析数据。可用的视图包括：

* 时间轴
* 层级视图
* 反向层级视图
* 原始层级视图

若要切换视图，需使用性能分析器窗口下半部分[下拉视图选择器](/engine/6000.0/manual/analysis/profiler/collect-data/visualizing-data/cpu/cpu.md)。


**在 CPU 使用情况性能分析器模块中选择的带有帧的性能分析器窗口。在详细信息窗格中选择时间轴视图。:**
![](/api/media?file=/engine/6000.0/media/images/profiler-cpu-module.png)

### Timeline 视图

时间轴视图是 CPU 使用情况性能分析器模块的默认视图。该视图简单列出了应用程序中所花费的时间情况以及各时间之间的关联情况。该视图会在各自的子部分中，沿相同的时间轴显示来自所有线程的性能数据。

使用时间轴视图可以查看不同线程上的活动在并行执行过程中如何相互关联。时间轴视图还能显示应用程序对不同线程的使用情况，例如[作业系统的](/engine/6000.0/manual/scripting/optimization/job-system.md)工作线程。它还能指示线程上的工作是如何排队的，以及是否有任何线程处于空闲状态（空闲样本）或者在等待另一个线程或作业完成（等待 x 样本）。

### 层级视图

层级视图一次显示一个线程（默认显示主线程）的性能分析数据。此外，这些视图仅显示样本的持续时间，而时间轴视图会显示每个样本发生的时间。

层级视图列出已进行性能分析的所有样本，并按共享的调用栈和[性能分析器标记](/engine/6000.0/manual/analysis/profiler/markers.md)的层级视图将样本一起分组。原始层级视图不会将样本一起分组，因此非常适合在粒度级别上查看样本。

反向层级视图按性能分析器标记对样本进行分组，并使用反向样本栈显示样本。层级视图的第一个级别为每个性能分析器标记显示一个项目。树状结构中的每个子项代表反向样本堆栈的一部分，其数据展示了通过该样本堆栈为汇总后的父项贡献了多少时间或堆内存。

反向层级视图可用于揭示由大量较小的性能影响实例引起的较大性能问题。在时间轴视图或非反向层级视图中可能更难发现此类问题

## 调查托管代码的调用栈和分配情况

[性能分析器标记](/engine/6000.0/manual/analysis/profiler/markers.md)发出一组样本，性能分析器使用这些样本将性能分析信息显示和组织到不同的时间顺序和层级视图中。性能分析器窗口显示的所有样本都是样本栈的一部分。

样本栈与方法的调用栈不同，因为 Unity 不会将每个样本都绑定到特定方法，也不会将每个调用都记录为样本。[深度性能分析](/engine/6000.0/manual/analysis/profiler/collect-data/deep-profiling.md)会在每个函数调用中添加一个性能分析器标记，但不会为原生代码添加任何标记，并且记录这些样本会带来很高的开销。

您可以使用 CPU 使用情况性能分析器模块检查 `GC.Alloc`、`UnsafeUtility.Malloc` 和 `JobHandle.Complete` 发出的样本的完整调用栈。如果您希望在不启用深度性能分析并避免较大开销的情况下跟踪这些样本的发生位置，这将非常有用。有关如何启用调用栈的信息，请参阅[启用完整调用栈](/engine/6000.0/manual/analysis/profiler/collect-data/visualizing-data/cpu/navigating.md)。

### 调查托管分配

您还可以使用 CPU 使用情况性能分析器来调查 Unity 在哪些地方执行了内存清理操作。

每当代码创建新托管对象时，该对象都有可能会不适合当前内存堆，因此 Unity 会执行[垃圾收集](/engine/6000.0/manual/performance-garbage-collector.md)。垃圾收集会暂停所有线程并扫描托管堆以查找未使用的内存。这一过程可能耗时较长，并且会影响帧率。托管垃圾收集在性能分析器中显示为 `GC.Collect` 样本，而托管分配显示为 `GC.Alloc`。

为了防止垃圾回收器影响应用程序的帧率，在应用程序运行时，尽量让 `GC.Alloc` 值保持为零，并控制堆大小保持较小。在[时间轴视图](/engine/6000.0/manual/analysis/profiler/collect-data/visualizing-data/cpu/cpu.md)中，`GC.Alloc` 样本显示为红色/洋红色，代表分配的大小。

要了解代码中托管分配的位置，可以启用 [GC.Alloc 完整调用栈](/engine/6000.0/manual/analysis/profiler/collect-data/visualizing-data/cpu/navigating.md)。有关托管堆的更多信息，请参阅有关[托管内存](/engine/6000.0/manual/analysis/performance-memory-overview/managed-memory.md)的文档。

## 其他资源

* [性能分析器模块简介](/engine/6000.0/manual/analysis/profiler/collect-data/visualizing-data/modules-introduction.md)
* [垃圾收集器概览](/engine/6000.0/manual/analysis/performance-memory-overview/managed-memory/garbage-collector.md)
* [性能分析器标记概述](/engine/6000.0/manual/analysis/profiler/markers.md)
* [性能分析器窗口参考](/engine/6000.0/manual/analysis/profiler/window-reference.md)
