分析线程调度

为了确定您的游戏进程线程是否得到适当利用和调度以获得最佳性能,需要考虑以下几点。

  • 帧速率
  • 多线程和线程并行化
  • CPU核心亲和性

多线程

许多游戏和游戏引擎使用多线程将CPU工作划分为逻辑任务,这些任务可以相对独立地运行。一个典型的配置是:一个用于输入和游戏逻辑的游戏线程,一个用于准备和提交要绘制的对象的渲染线程,以及用于其他子任务(例如动画或音频)的工作线程。

我们建议并行化线程以利用多线程的性能提升。一个例子是游戏和渲染线程在不同核心上部分或完全并发运行的情况。这并非总是可行,例如在共享数据依赖的情况下;但是,在可能的情况下,这可能会导致更低的CPU时间,从而可能提高帧率。

Game with a well-parallelized main and render thread, as well as a worker thread and audio thread
图1.具有良好并行化的主线程和渲染线程以及工作线程和音频线程的游戏

CPU核心亲和性

一个显著影响CPU工作负载性能的因素是它们如何在核心上调度。这可以分为两个组成部分:

  • 您的游戏线程是否在最适合其工作负载的核心上运行。
  • 您的游戏线程是否频繁地在核心之间切换。

现代设备通常使用称为异构计算的架构,其中核心具有不同级别的性能:

  • 一个或几个核心提供最高的峰值性能,但功耗更大。这些有时被称为“大”核心。
  • 其他核心具有较低的峰值性能,但更节能。这些有时被称为“小”核心。
  • 可选:一个或多个核心在性能和功耗之间取得平衡。这些有时被称为“中”核心。

通过在进行跟踪时在配置文件中启用CPU,您可以在CPU使用率下调查CPU线程行为。通过放大跟踪的<200毫秒的部分,您可以查看在设备CPU核心上运行的单个进程。通常,较小的核心对应于较小的索引(例如,CPU“0”到“3”),而较大的核心对应于较高的索引(例如,CPU“6”到“7”),如果存在中间核心,则将占据中间的索引(例如,CPU“5”到“6”)。这是常见的约定,但并非保证。

如果您发现某些线程正在被调度到不满足其性能或功耗需求的CPU上,请考虑手动设置这些线程的CPU亲和性。

Game with main and render thread primarily running on the large cores (CPU 6-7), shown in light blue
图2.主线程和渲染线程主要在大型核心(CPU 6-7)上运行的游戏,以浅蓝色显示

您还可以观察线程是否在核心之间切换。这种核心切换会产生上下文切换的一些开销以及核心缓存/寄存器状态的丢失。

Game with main (Thread-7) and render thread (Thread-8) that switch between cores, shown in purple
图3.主线程(线程-7)和渲染线程(线程-8)在核心之间切换的游戏,以紫色显示

为线程设置CPU亲和性会指示系统在您的游戏处于前台时将其调度到给定的核心。这样做时,需要考虑几个因素:

  • 平台软件无法动态调整任务放置以适应运行时因素,例如负载和热限制。
  • 在不同设备上的性能测试可能会产生非常不同的性能特性,尤其是在设备在价格或发布日期上差异很大的情况下。

    较新或更昂贵的设备可能会在一个小型核心上轻松运行给定的工作负载,但较旧或更经济实惠的设备可能需要一个大型核心才能满足该相同工作负载的期限。

  • 通过强制将亲和性设置为大型核心,您可能会不必要地增加电池消耗和热负载。

由于这些原因,通常最好避免手动设置CPU亲和性。