大多数游戏物理引擎(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的帮助下构建的——如果有人对这个过程感兴趣,我很乐意谈论它。)
评论 (0)