剑杆物理引擎

2020-08-28 06:12:02

在我们上周的声明中,我们简要地提到了我们在过去5个月中一直在研究的这个新的物理引擎。今天我们将首次正式发布它:Rapier项目;一套用于游戏、动画和机器人的2D和3D物理模拟的100%Ruust库Rapier2d和rapier3d。

剑杆是物理学的继承者,注重性能第一,就像物理一样,它被分成两个板条箱:二维和三维物理的剑杆2d和3d。它从一开始就被设计成快速和多线程的。它还被设计为需要较少的增量编译时间,因为它定义的数据结构不是通用的。

在发布模式下,Rapier的运行速度比nPhysical快5到8倍,使其性能接近NVIDIA PhysX的(CPU版本)NVIDIA PhysX,略快于Box2D,如您将在基准部分中看到的。剑杆才刚刚起步,很多特色还没有找到。但是,一些性能优化,如并行性和SIMD,从一开始就集成在一起。

已经有几个关键的特点使剑杆脱颖而出。由于它们可能会影响编译时间和/或性能,因此它们在默认情况下处于禁用状态,需要通过货物功能显式启用:

串行化:如果启用了Rapier的串行化功能,每个物理组件都可以使用serde串行化。这意味着您可以对物理状态进行深入的快照,并在以后恢复它。此快照甚至可以保存在磁盘上或通过网络发送。

跨平台确定性:如果启用了Rapier的增强确定性功能,它将在符合IEEE 754-2008浮点标准的所有平台上以位级跨平台确定性方式运行。这意味着,如果您在两台不同的机器(或浏览器)上以相同的初始状态运行相同的模拟,您将得到完全相同的结果。这里的位级确定性意味着,如果您在两台不同的机器上序列化相同数量的时间步之后的物理状态,您将获得两个完全相同的字节数组:您可以计算两个快照的校验和,它们将是相同的。所有这些都不适用于指针大小小于32位的平台,也不适用于不严格遵守IEEE 754-2008标准的平台。

编写物理引擎很难。没有太多的选择,而且大多数都是用C++编写的。通过nPhysical,我们希望为铁锈社区提供一个开源的100%锈蚀物理解决方案,而通过Rapier,我们想更进一步,为尽可能多需要物理引擎的社区做出贡献。这就是为什么我们在“剑客”故事一开始就提供以下内容的原因:

WASM版本的Rapier的官方JavaScript绑定。这些绑定是使用wasm_bindgen生成的,并作为包@dimforge/rapier3d和@dimforge/rapier2d发布到NPM。虽然已经存在多种针对JavaScript的物理解决方案,但它们要么很慢(因为它们是用JS手动编写的,比如canon.js或oimo.js),要么是由原始开发人员维护得不够高效(因为它们是使用Emscripten从C++移植过来的,比如box2d.wasm、ammo.wasm或Phyx.wasm)。通过提供官方的wasm构建和JS绑定,我们确保为JS社区提供最好的支持、文档和持续更新。

Bevy游戏引擎的官方插件。它们以bevy_rapier2d和bevy_rapier3dcrates的形式提供。Bevy游戏引擎最近作为一个高效、快速编译且易于使用的面向数据的游戏引擎发布。它仍处于早期状态,缺乏任何物理特征。我们相信物理支持是游戏引擎中非常有价值的功能。通过提供官方插件,我们希望确保Bevy社区能够快速轻松地从Rapier物理引擎中获益。

我们想要为更多的社区做贡献,但是现在没有人力支持所有的社区,其他的集成和语言会在将来出现。

我们还计划为紫晶游戏引擎创建官方插件,但还没有开始。我们正在等待紫晶向军团ECS解决方案的迁移,然后再开始这方面的工作。

GitHub上提供了使用2DJS绑定的示例:2D和3D。您可以看到这些演示在那里运行2D,那里运行3D。在这些演示中,物理模拟在Web Worker中运行,渲染由PixiJS和Three.js执行。

Rapier还没有nPhysical有很多功能,但它也有一些nPhysical没有的功能。下面是两个物理引擎的对比表:

今天的物理比剑士更成熟。在接下来的几个月里,我们的第一个目标是在保持显著的性能改进和更好的精确度的同时,将剑杆带到与nPhysical特性相同的水平。

好的,我们声称Rapier几乎和PhysX的CPU版本一样快,比nPhysical快5到10倍,比Box2D稍微快一点。现在是时候使用基准来证明这些说法了。

在随后的基准测试中,我们使用四个不同的物理引擎运行了一组压力测试:

与选定的物理引擎无关,所有场景始终以完全相同的方式(相同的身体、相同初始位置的相同碰撞器)并使用以下参数进行初始化:

解算器:PGS的变体。(PhysX 4.0 TGS解算器尚未进行基准测试。我们使用默认的EPGS解算器。)。

在这个基准测试中,我们不使用多线程。启用多线程、只涉及多线程物理引擎的基准测试将成为另一篇博客文章的主题。

每个3D基准在两台不同的计算机上运行,因为我们观察到PhysX和Rapier之间的性能差异取决于处理器:

MacBook Pro(插在电源插座上),运行Mac OS,配备英特尔酷睿i7 7920HQ,3.1 GHz。

2D基准测试仅在AMD Ryzen 9 3900X CPU上运行(相对性能与InterCore i7CPU相同)。

在此基准测试中,有几条关于PhysX的注意事项。首先,对于剑杆和物理X,我们不使用相同的迭代次数。对于剑杆和物理,我们使用4次速度迭代和1个位置迭代。PhysX的情况正好相反:1次速度迭代和4次位置迭代。这是最合理的配置,因为:

PhysX开发人员建议增加位置迭代次数以获得更好的稳定性,并将速度迭代次数保留为1。

PhysX本身(独立于此基准)默认使用1个速度迭代和4个位置迭代,比使用4个速度和1个位置产生更稳定的模拟,没有性能差异。

Rapier和nPhysical使用与PhysX不同的求解器。使用我们的求解器,建议增加速度迭代次数而不是位置迭代次数,并将位置迭代次数保留为1。

一条性能曲线,使用其默认的ePATH摩擦模型。这是一个简化的摩擦模型,计算速度更快,但不太现实。剑杆和物理还没有实现类似的模型。

一条性能曲线使用他们的eTWO_方向摩擦模型。这与Rapierand nPhysical使用的摩擦模型相似。

在这个基准中,有8000个球落在同样由球组成的地面上。最后,它们形成400个独立的小球。

在这个基准中,大约有3000个小立方体以完全无序的方式落在一个大立方体地板上。

在这个基准中,有一组4900个盒子以这样的方式下落,它们最终形成了一个大金字塔。

在此基准中,地板被建模为由800个三角形组成的三角形网格。有1500个小盒子和1500个小球落在这个网上。

在这个基准中,5230个矩形刚体被用来组成一个塔,很像用真实的KEVA木板可以实现的效果。在模拟过程中,塔破裂,最后形成一大堆。请注意,由于此模拟只使用了4次速度迭代,因此塔发生了故障。在大约15次速度迭代的情况下,使用剑杆时塔体将保持稳定。

在这个基准测试中,我们有略低于20.000个球关节(又名。球形连接)。这些接头以这样的方式连接刚体,我们最终得到一个像织物一样的大薄片。

在这个基准中,我们有20.000个固定的关节,以防止所有的球移动。彼此之间。

在此基准中,我们有8.000个旋转运动类型,它们以形成几个独立链的方式连接。

PhysX和Rapier都比nPhysical快4到8倍。在启用多线程的情况下,差距会更大(速度快5到10倍)。

剑杆和PhysX的性能相近。当瞄准Ryzen 9CPU时,Rapier在几种情况下会稍微快一些。然而,当瞄准英特尔CPU时,PhysX最终会比Rapier稍微快一些。

在模拟质量方面,PhysX和Rapier非常相似。PhysX的关节看起来稍微僵硬,因为固定关节的收敛速度更快。来自Rapier和PhysX的关节都比来自nPhysical的关节约束稳定得多。

在这个基准中,有12.500个球落在由球组成的地面上。这里的Box2D时间非常嘈杂。我们怀疑这是由于它们的广泛实施造成的。

在这个基准中,大约有3.380个小立方体以完全无序的方式落在一个大立方杯上。

在这个基准中,有一组5.050个盒子以这样的方式下落,它们最终形成了一个单一的大金字塔。

在此基准中,我们有不到20.000个球面运动类型(与2D中的旋转运动类型相同)。这些连接以这样一种方式连接刚体,我们最终得到一个像织物一样的大薄片。Box2D的性能在这个基准上变得非常疯狂,因为它的模拟失败了(缺乏数值稳定性)。

在这个基准中,我们有28.840个固定的关节,以防止所有的球移动。彼此之间。

在此基准中,我们有12.500个转动关节以形成几个独立链的方式连接。已启用较低的关节限制。

在这些基准中,剑杆通常比Box2d略快,特别是在涉及关节的情况下。

来自剑杆的关节约束比长方体2d稳定得多。具体地说,Box2d中的棱柱关节会受到抖动的影响,而球关节的场景则完全爆炸。

如果您想要查看这些基准在您自己的计算机上的执行情况,您可以手动运行它们:

对于2D基准测试,在Rapier存储库的examples2d目录上执行命令Cargo Run--Release--Feature SIMD-Nighthly--Feature Other-Backends-BANKE。

对于3D基准测试,在Rapier存储库的examples3d目录上执行命令Cargo Run--Release--Feature SIMD-Nighthly--Feature Other-Backends-BANKE。

如果您使用的是稳定版本的Rust编译器,则必须将其替换为--特性SIMD-夜间替换为--特性SIMD-STRATE,这样它才能正确编译。

基准测试将运行,并且输出将作为在当前目录上创建的CSV文件写入。每个模拟场景将有一个CSV文件。一个CSV文件将包含多个列,每个运行的物理引擎一个列。

剑杆织机的研制仅在五个月前就开始了,已经显示出非常有希望的结果。只要你不需要基于GPU的解决方案,它的性能使其成为PhysX的100%锈蚀解决方案的绝佳替代品。对于2D,它的性能通常略好于Box2D,但它仍然缺乏一些功能,无法完全取代它。与物理学相比,Rapieris在性能和关节约束稳定性方面处于完全不同的水平。最后,由于它的JavaScriptbinations,Rapier是NPM上最高效且数值稳定的Web物理引擎。

快照和位级跨平台决定论等可选功能使Rapier对多玩家和协作使用颇具吸引力。

在接下来的8个月里,我们的目标是在剑杆上实现目前物理上存在的所有功能,包括CCD、简化坐标关节和软体。如果您需要一些特殊的功能(即使是物理上没有的功能),请随时与我们联系。

如果您愿意支持我们开发剑杆,请考虑在GitHub赞助商上赞助我们。