Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

并行优化

多线程并行(CPU)

现代物理引擎(如Jolt, PhysX, Chaos)都将多线程作为其核心设计的一部分。它们通常采用**作业系统(Job System)任务系统(Task System)**来管理并行执行。

可并行的阶段:

  1. 宽相检测:如果使用基于网格或树的宽相,可以并行地处理不同区域或子树的碰撞查询。

  2. 窄相检测:宽相生成的潜在碰撞对列表可以被分割成多个部分,每个线程处理一部分。由于每个碰撞对的计算是独立的,这个阶段的并行化非常直接。

  3. 积分:更新所有活动物体的速度和位置是一个典型的“embarrassingly parallel”问题,可以简单地将物体列表分段,交给不同线程处理。

  4. 约束求解:这是并行化中最具挑战性的部分。顺序冲量法(SI)本质上是顺序执行的,直接并行化会导致数据竞争(多个线程同时读写同一个物体的速度)和不一致的结果。解决这个问题有几种策略:

    • 基于孤岛的并行:如前所述,不同孤岛之间的求解是完全独立的,因此可以并行地求解不同的孤岛。这是最常用且最有效的并行策略。
    • 图着色(Graph Coloring):在同一个孤岛内部,我们可以构建一个约束图(节点是物体,边是约束)。通过图着色算法,可以将互不相邻的约束(即不共享任何物体的约束)分配到不同的“颜色”组中。同一颜色组内的所有约束都可以安全地并行求解。引擎可以按颜色顺序,逐组并行地求解约束。
    • 原子操作与锁:在一些需要共享数据的地方,使用原子操作或轻量级锁(如自旋锁)来保证线程安全。但这会引入同步开销,需要谨慎使用。

GPU加速

对于那些可以被分解为数千个相同操作的、大规模并行的任务,GPU是比CPU更强大的计算平台。如我们在第五章对PhysX的分析中所见,GPU加速在以下领域大放异彩:

  • 粒子模拟:无论是SPH流体还是简单的视觉特效粒子,每个粒子的计算(邻近搜索、力计算、积分)都可以映射为一个GPU线程。数万甚至数百万粒子的实时模拟成为可能。
  • 布料模拟:布料网格中的每个顶点或每个约束的求解,都可以被并行化到GPU上。
  • 宽相检测:可以使用基于计算着色器(Compute Shader)的排序算法或空间哈希构建,在GPU上高效地完成大规模的宽相检测。

GPU物理的挑战

  • 数据传输:将物理数据从CPU内存传输到GPU显存,以及将计算结果传回,会带来显著的延迟和带宽开销。因此,最适合GPU加速的是那些可以完全在GPU上完成计算和渲染的系统(例如,纯粹的视觉特效粒子)。
  • 与游戏逻辑的交互:游戏逻辑通常在CPU上运行。如果物理模拟在GPU上,那么当游戏逻辑需要查询物理状态(例如,射线检测)或施加力时,就需要一次昂贵的CPU-GPU同步。这使得GPU不适合用于驱动核心玩法的、需要与CPU频繁交互的物理对象。