大多数游戏物理引擎(Box2D,box3d,PhysX)都是基于冲击求解器(impulse solvers)和速度约束(velocity constraints)以及预热启动(warm-starting)来构建的。我想要探索设计树中的另一个分支,所以我围绕Melon3D构建了XPBD子步进(Müller et al. 2020)而不是冲击求解器。

交易的结果是真正不同的,而不是“更快/更慢”:

  • 静止侵入是精确为零(位置级约束),而不是缓冲区重叠(slop-bounded overlap)
  • 没有预热状态来重建——对于流式工作负载而言,身体每帧都在生成/消失
  • 两级空间哈希广泛阶段——睡眠/静止身体在一个单独的分层中重建,只有当成员资格发生变化时
  • 确定性多线程——任何线程数(worker count)下的位相同结果(并行路径由岛屿大小选择,而不是线程数)
  • 8-宽SIMD接触包+图形着色(图形着色)的大接触岛屿

诚实的基准测试与box3d(同一硬件,同一编译器标志,README中完整的方法论——box3d在我的测试中以单线程运行,因为其任务回调没有连接起来,我说清楚了):

  • churn(1500个身体,恒定重生):~43%更快
  • rain(1000混合身体):~15%更快
  • 堆栈/塔:平行
  • 金字塔(一个大接触岛屿):box3d获胜~2.9×——其预热启动的求解器在更少的帧中将堆栈安置在一起。没有掩盖这一点。

详细信息、GIF演示和可重现的比较测试程序:
👉 https://github.com/MelonWithGlasses/Melon3D

C风格API,C++17内部,MIT,~5k行,无依赖项。欢迎反馈和PR,尤其是关于XPBD-vs-冲击求解器的交易对于真实游戏工作负载的trade-off。

(在Claude Code的帮助下构建的——如果有人对这个过程感兴趣,我很乐意谈论它。)