Version: 6000.3
语言: 中文
编写和运行协程
收益率指令参考

分析协程

协程的执行方式与其他脚本代码不同。Unity 中的大多数脚本代码都出现在性能跟踪中的单个位置,位于特定回调调用下方。但是,协程的 CPU 代码始终出现在跟踪的两个位置:

  • 协程中的所有初始代码,从协程方法的开头到第一个yield语句,每当 Unity 启动协程时,就会出现在跟踪中。初始代码最常出现在StartCoroutine方法。Unity 回调生成的协程(例如Start返回IEnumerator) 首先出现在各自的 Unity 回调中。

  • 协程代码的其余部分(从第一次恢复到完成执行)出现在DelayedCallManager行。这是因为 Unity 执行协程的方式。C# 编译器会自动生成支持协程的类的实例。然后,Unity 使用此对象在单个方法的多次调用中跟踪协程的状态。因为协程中的局部作用域变量必须在yield调用时,Unity 会将局部变量的作用域提升到生成的类中,这些类在协程期间仍分配在堆上。该对象还跟踪协程的内部状态:它记住协程在让步后必须在代码中的哪个点恢复。

由于这些原因,协程启动时分配的内存等于固定开销分配加上其局部作用域变量的大小。

启动协程的代码构造并调用一个对象,然后是 Unity 的DelayedCallManager每当协程的yield满足条件。由于协程通常在其他协程之外启动,因此这会将其执行开销分配给yieldcall 和DelayedCallManager.

监视和改进协程性能

您可以使用 Unity分析器帮助您优化游戏的窗口。它显示了在游戏的各个领域花费了多少时间。例如,它可以报告渲染、动画制作或游戏逻辑所花费的时间百分比。更多信息
请参阅术语表
以检查和了解 Unity 在应用程序中执行协程的位置。为此,请在启用深度分析的情况下分析您的应用程序,这将分析脚本代码的每个部分并记录所有函数调用。然后,您可以使用 CPU 使用率分析器模块来调查应用程序中的协程。

DelayedCall 中具有协程的分析器会话
DelayedCall 中具有协程的分析器会话

最佳做法是将一系列作压缩到尽可能少的单个协程数量。嵌套协程对于代码清晰度和维护非常有用,但它们会带来更高的内存开销,因为协程会跟踪对象。

如果协程运行每一帧,并且没有yield在长时间运行的作中,将其替换为UpdateLateUpdate回调。 如果您有长时间运行或无限循环的协程,这非常有用。

其他资源

编写和运行协程
收益率指令参考