分析线程调度

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

  • 帧速率
  • 多线程和线程并行化
  • 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 线程行为,以调查 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 亲和性。