Unity 5 中的高性能物理

ANTHONY YAKOVLEV / UNITY TECHNOLOGIESContributor
Jul 8, 2014|8 Min
Unity 5 中的高性能物理
为方便起见,此网页已进行机器翻译。我们无法保证翻译内容的准确性或可靠性。如果您对翻译内容的准确性有疑问,请参阅此网页的官方英文版本。
我们想重点介绍一下您在Unity 5.0 中可以期待的一些3D物理变化。

我们已经使用 PhysX 2.8.3 有一段时间了。我们不只是使用了普通的 PhysX,还利用Unity工程师多年来制作的大量补丁对其进行了扩展。时间过得真快,我们要感谢 PhysX 2 为我们带来这么多鱼。正如在 GDC'14 上宣布的那样, Unity 5.0 已升级至 PhysX 3.3。让我们仔细看看。

PhysX SDK 3 是对旧版 PhysX SDK 2.x 的彻底重新设计。基本上,PhysX 团队从 2.x 中采用了最好的想法和最佳方法,并从头开始重写了整个 SDK。这意味着整个代码库都不同,所有接口都不同,并且大多数功能都不同。

现在让我们让您体验一下使用Unity 5.0 物理的感觉。

首先从简单的事情开始,我们默认将自适应力设置为可切换和关闭。自适应力是 PhysX 中的一种特殊技术,用于在模拟堆栈时补偿数值误差。然而,来自Unity开发人员的反馈告诉我们,自适应力对游戏内容的整体不稳定性影响很大。期望你的类似堆栈的东西将来会表现得更好。

移动静态碰撞器

移动静态对撞机的成本会低很多。静态对撞机只是一个带有对撞机组件的游戏对象,但没有刚体组件。以前,由于 SDK 假定静态碰撞器不会移动,因此移动静态碰撞器会触发昂贵的 AABB 树重建,从而严重影响整体性能。

在Unity 5 中,我们将使用相同的数据结构来处理动态和静态碰撞器的运动。不幸的是,我们将失去静态对撞机比动态对撞机消耗更少内存的优势。然而,目前,移动静态碰撞器相关的成本是Unity游戏性能问题的三大原因之一。我们想改变这种状况。

碰撞检测

连续碰撞检测得到了数量级的提高。连续碰撞检测用于防止快速移动的物体在没有检测到任何碰撞的情况下穿过其他物体。想象一下一颗子弹射向一张纸,或者一场台球比赛中有些球的移动速度比其他球快。

在Unity 5.0 中,SDK 生成处理快速移动所需的所有数据。您只需启用连续碰撞检测即可。PhysX3 具有一种算法,用于检测在当前身体速度下是否真的需要昂贵的 CCD 模拟,或者默认的离散模拟就可以了。一旦启用 CCD,它就会被激活。

台球桌
宽相上的刚体

PhysX3 在广义上支持更多的刚体 (Rigidbody)。事实上,您可以在桌面和类似桌面的平台上的单个框架上拥有数十万个主体。以前,主体数量固定限制为 64k。这不是一个我们可以轻易增加的常数——这是在整个 SDK 中节省大量位的结果。某些主机目标,例如PlayStation 3 仍会有此限制。物理材料也有限制:在撰写本文时,任何平台上的材料都不能超过 64k。

缩放网格碰撞器是免费的(或多或少)

在Unity 5.0 中,我们降低了扩展网格碰撞器的成本。以前,在缩放网格对撞机时,您必须创建一个将比例融入顶点的新网格,这需要宝贵的时间和内存。利用 PhysX3 我们能够支持非负缩放而无需任何烘焙。基本上是免费的。

接下来,让我们看一下两个与Unity 4.x 版本有很大差异的子系统,您可以将它们视为新的子系统:布料和车辆模块。

布料组件

让我们从布料开始。Unity 4 通过 InteractiveCloth 和 SkinnedCloth 组件支持布料模拟。InteractiveCloth 具有类似布料的网格行为,即“物理布料”,可以与其他物理体相互作用,施加力等等。InteractiveCloth 的计算成本很高,因此Unity 4 还有另一个解决方案 SkinnedCloth,用于角色服装。

由于 SkinnedCloth 与主模拟管道分离,因此它的性能比 InteractiveCloth 更好。布料的主要问题是两个组件都相当不稳定并且成本很高。随着 PhysX3 集成的到来,我们决定放弃对 InteractiveCloth 的支持,只提供一种布料组件,简称为 Cloth,其设计时考虑到了角色服装。

在Unity 5.0 中,Cloth 不再对场景中的所有碰撞器做出反应,也不会向世界施加力量。相反,我们有一个更快、多线程、更稳定的角色服装解决方案。当您添加它时,新的 Cloth 组件不再对任何物体做出反应。

因此,除非您手动将来自世界的碰撞器添加到 Cloth 组件,否则 Cloth 和世界无法相互识别或看到对方。即使在此之后,模拟仍然是单向的:布料对这些物体做出反应,但不会施加反作用力。此外,您只能与布料一起使用三种类型的碰撞器:球体,胶囊和使用两个球体碰撞器构建的圆锥形胶囊碰撞器。引入这些变化都是为了提高性能。

Unity 5.0 中的创作界面与 SkinnedCloth 界面类似,我们正在努力在 5.x 中对其进行改进。期望看到在 5.x 周期内添加与 Mecanim 化身集成等功能。

新的 Cloth 组件在内部通过 CUDA 支持 GPU,但出于多种原因,我们决定在 5.x 周期的后期发布它。首先,CUDA 仅适用于 NVIDIA 硬件上的 Windows,而我们在 Mac 和 Linux 上也占有重要地位。其次,我们确实希望首先集中精力修复核心内容上的错误,然后再继续集成一些花哨的东西。

新的车辆 SDK

现在,谈谈车辆。PhysX3 有一个闪亮的全新 Vehicle SDK,我们用它来实现我们的 WheelCollider 组件。新组件提供了更加真实的悬架和轮胎摩擦力。此外,它还解决了许多其他长期存在的问题。

在Unity 5.0 中,新组件可以开箱即用,以生成简单的行为。我只希望当开发人员想要一些已经经过微调、逼真或先进的东西时,他们才会去 Asset Store 上购买车辆包,比如 Edy 的车辆包

看看我使用从网上下载的免费网格在几个小时内能够设置的内容(大部分时间都花在Blender中准备模型):

以下是 Edy 车辆套装中的一款 SUV:

Edy 目前正在开发他的软件包的新版本,它将带来更多令人惊奇的东西。直接联系他 以了解更多详细信息。

我想与你们分享很多有关车辆的精彩技术细节,但是现在,我们先来看一下新的 WheelCollider 小玩意。这也会让您了解悬架是如何工作的。

轮子小玩意

上图中,车轮圆周和车轮直径用绿色标记,悬架行程段用橙色标记,施力点球用绿色标记。在悬架行程段上,有最大压缩位置、最大下垂位置和目标位置的标记。

正如您所预料的,车轮只能在最大压缩位置和最大下垂位置之间移动。目标位置(专业术语中也称静止位置)恰好位于簧载重量与弹簧力达到平衡的位置,即车辆刚好静止在平坦路面上时车轮所在的位置。调整起来可能有点棘手,但实际上,最大压缩位置就是车轮在网格中原来的位置。

接下来,您将悬挂距离和目标位置指定为悬挂距离的一部分。只需两个浮点数即可统治它们全部,没什么大不了的!我是否告诉过您,新的轮子小工具现在可以根据开箱即用的模拟数据更新旋转和位置?您甚至不需要添加实际的车轮几何形状并编写车轮定位代码来预览您的设置。一切都是内置的。

表现

PhysX3 现在可以运行在多核上,因为内部计算模型被组织成可以在不同核心上执行的任务。SDK 完成所有的多线程处理,自行处理所有依赖关系并提供最佳的作业分解。

从目前的情况来看,由于拥有更好的代码库和改进的多线程,可以合理地预期性能会翻倍。在某些情况下,改进是显著的,甚至可达到十倍的改善。

对更多数据感兴趣的性能忍者应该访问 Pierre Terdiman 的博客。他是 PhysX SDK 的核心开发人员。

兼容性

新功能看起来和感觉起来很像 Unity,但仍然存在行为不同、参数含义不同或在某些情况下不再支持旧行为的情况。因此, Unity 5.0 物理与Unity 4.x 并不 100% 兼容。从以前的Unity版本迁移时,请准备好重新调整旧项目并重写一些物理代码。

关于Unity 5 中的物理细节还有很多,我无法在这篇文章中分享。请在评论中随意提问,或者如果您今年参加我们的 Unite 2014 开发者大会,请听我对Unity 5.0 物理的深入讨论,然后过来打个招呼聊一聊。

关于Unity 5 的更多信息