跳到主要内容

ammo.js 替代方案

ammo.js 是知名且常用的 JavaScript 物理引擎,功能灵活,支持高保真模拟,但性能和内存要求也较高。因此需要评估它是否最适合应用;例如 2D 游戏可能更适合专用 2D 物理引擎。

以下列出替代方案,开发较活跃者排在前面,后面是基本不再维护但仍可使用的旧引擎:

物理引擎语言JS 构建WASM 构建2D3D确定性PlayCanvas 集成
RapierRust✔️✔️✔️✔️
JoltC++✔️✔️✔️✔️
Box3DC✔️✔️✔️
PhysXC++✔️✔️
box2d.jsC++✔️✔️✔️
Matter.jsJavaScript✔️✔️
p2.jsJavaScript✔️✔️有
cannon.jsJavaScript✔️✔️
Oimo.jsJavaScript✔️✔️

非 JavaScript 引擎通过独立绑定项目编译到浏览器:Rapier 使用 @dimforge/rapier2d 和 @dimforge/rapier3d,Jolt 使用 JoltPhysics.js,Box3D 使用 box3d.js,PhysX 使用 physx-js-webidl。只有 Rapier 和 Jolt 绑定由对应引擎作者维护。

多数只提供 WebAssembly。Jolt 和 box2d.js 也提供 JavaScript 构建,因为 Emscripten 可生成 asm.js。asm.js 无需 WebAssembly 支持,可在 JavaScript 环境运行,但比对应 WASM 更慢、更大,因此除非有特别需求,应优先使用 WebAssembly。

确定性

表中的确定性表示跨平台确定性,即不同设备产生完全相同的模拟结果,适用于锁步联网和重放。它取决于构建设置,使用前应确认:

  • Rapier 官方 WebAssembly 包默认具有跨平台确定性。
  • Jolt 需要编译时启用 CROSS_PLATFORM_DETERMINISTIC,预编译 JoltPhysics.js 包未启用。
  • PhysX 只保证同一平台与构建的确定性,明确不支持跨架构确定性。

引擎物理组件不会直接调用 ammo.js。刚体、形状、关节、射线和接触报告经过 PhysicsWorld 后端层,内置 ammo.js 是其中一种实现。此层标记为 Alpha,API 仍可能变化,但它是集成其他引擎的预期接口:Rapier 或 Jolt 后端实现相同类,即可保留现有 rigidbody 和 collision 组件。较早的 PlayCanvas p2.js 集成早于该层,通过自己的脚本组件封装物理引擎。

另请参阅​