Unity5中的高性能物理组件

来源:互联网 发布:家校互动软件 编辑:程序博客网 时间:2024/05/01 21:18

原文链接

长久以来,我们一直使用PhysX 2.8.3。除了单独使用PhysX之外,我们还在过去的数年中,将Unity工程师开发出的多种补丁与其搭配使用。在我们即将发布的Unity 5.0,则会以PhysX 3.3作为我们新的物理引擎。下面,就让我们来进一步了解该物理组件。

PhysX SDK 3对经典PhysX SDK 2.x大胆地进行了重新设计。PhysX的开发团队保留了2.x最好的创意及功能,并重新编写了SDK。这意味着SDK的代码构架是全新的,接口也是全新的,同时绝大多数功能也是全新的。

现在,我们来试用一下Unity 5.0物理组件。

首先,我们从简单的功能开始。我们将自适应力设置为可切换的,而且在默认状态下是关闭状态。自适应力是PhysX所使用的一项特殊技术,它修正了PhysX在模拟动态状况时的数值偏差。移动静态碰撞体移动静态碰撞体的开销将会大大降低。普通的静态碰撞体只是附有碰撞体组件的游戏对象,但并不附有刚性组件。以前的版本因为假设静态碰撞体均是静止的,所以移动一个静态碰撞体会引发昂贵的AABB 包围盒重建,进而让整体效率也因此大打折扣。

在Unity 5中,我们将使用相同的数据结构来同时处理动态与静态碰撞体的运动。一般来说,静态碰撞体较之动态碰撞体会占用较少的内存空间,但是,由于我们需要动态移动静态碰撞体,所以我们不得不牺牲静态碰撞体的这一特点。

移动静态碰撞体是目前引起性能问题的三大原因之一。因此,我们必须对其进行修改和优化。

碰撞检测
连续碰撞检测效率在新版本中有了大幅度的提升。连续碰撞检测主要用于防止移动速度过快的物体没有经过碰撞检测而直接穿过其他物体的情况。比如,一枚高速运行的子弹穿过一张纸,或者在台球游戏中,一些运动速度很快的球等等。在Unity 5.0当中,SDK会生成所有用于处理快速运动的数据,你只需在编辑器中直接打开连续碰撞检测功能即可。PhysX3主推的算法可以检测对象在目前速度之下是需要进行昂贵的CCD模拟,还是进行默认的连续碰撞检测就足够了。该功能在你开启CCD功能时就会自动激活。

Broadphase上的刚体
PhysX3在broadphase上支持更多刚体。事实上,在桌面或类似桌面的平台上,每一帧均可支持数十万个刚体。在此之前,PhysX最多只支持6万4千个刚体,而这并不是一个能够轻易提高的常量–想要提高这个常量,必须得在SDK上节省更多空间。而对于一些像PS3这样的游戏机而言,他们仍然有这样的限制。同时,物理材质也有限制:就在这篇文章公布之际,你仍然无法在任何平台上使用超过6万4千的材质。
缩放网格碰撞体几乎无性能开销

在Unity 5.0之中,我们降低了缩放网格碰撞体的花费。在此之前,当你在缩放一个网格碰撞体的时候,你必须得重新构架一个嵌入顶点的可缩放的网格。而这一过程需要宝贵的时间开销与内存占用。而PhysX3支持非嵌入式的正倍数缩放,而这种缩放基本上是无性能开销的。
接下来,我们再看看与Unity 4.x版本完全不同的两个子系统:布料与载体模块。

布料组件
我们先看布料组件。在Unity 4之中,布料模拟是通过InteractiveCloth与SkinnedCloth两个组件来支持的。InteractiveCloth组件拥有像布料一样的网格表现。例如:能与其他物理对象交互的“物理布料”,可对其施力等特点。但是,InteractiveCloth组件的计算过程非常耗时,所以Unity 4针对人物的衣物模拟,设计了SkinnedCloth这一组件。

因为SkinnedCloth并不占用主要的模拟管线,所以该组件的性能要优于InteractiveCloth组件。而布料模拟的主要问题是两个组件的模拟效果都非常不稳定,且运行成本也很高。而PhysX3推出的整合布料组件将不再支持InteractiveCloth组件,取而代之的是一个整体的以设计人物衣物为主体的布料组件,Cloth。


在Unity 5.0中,场景中的布料不再对所有碰撞体进行交互,也不再向外界施加反作用力。取而代之的是,我们将创造一个更快的、多线程的、更稳定的人物角色布料模拟方案。当你使用全新的布料组件时,它不再对任何对象进行交互。

这样,布料与外部世界不再互相作用,除非你手动将来自外界的碰撞体添加到布料组件上。需要注意的是,就算你手动加入来自外界的碰撞体,布料模拟过程仍然是单向的:布料会对外界碰撞体做出反应,但并不向其施加反作用力。同时,你只能向布料组件加入三种碰撞体:球形碰撞体、胶囊碰撞体,和由两个球体组成的经典胶囊碰撞体。开发者对其进行了以上改动以提升性能及表现。

Unity 5.0中的布料模拟界面与目前的SkinnedCloth界面类似,而我们将在即将推出的5.x版本中着力改进这一方面。敬请期待在接下来的5.x版本中添加了Mecanim Avatars的整合界面。

全新的布料组件可以通过CUDA在内部支持GPU。但因为种种原因我们决定在之后发布的5.x版本中再加入这一性能。原因在于,首先CUDA只能在Windows系统下的NVIDIA硬件上运行,而我们的用户中有很大一部分都在使用Mac和Linux。其次,我们希望能先集中力量解决核心问题,之后再加入炫酷的组件。

全新的Vehicle SDK
现在,我们来简单介绍一下新版本的车辆模拟功能。PhysX3引用了全新的Vehicle SDK取代我们之前一直在使用的WheelCollider组件。该组件可以实现更具真实感的悬架距离和车胎摩擦力效果。另外,该组件还解决了一系列存在已久的问题。

如果开发者们希望获取一些已经经过精细调试、效果更真实,或更高阶的插件,那么我们建议可以直接去Asset Store上查找相关插件,比如Edy’s Vehicle Package

请看,这是我们用网上下载的免费网格在几小时之内搭建出的场景.

视频

这是一个Edy’s Vehicle Package中专门针对SUV的效果。

视频

Edy目前正在开发新的包含更多炫目效果的效果包。尽管我们想向大家分享所有有关车辆模拟的技术细节,但今天还是先让我们来看一下全新的WheelCollider示意图,进而向你们展示如何设置更具真实感的悬架距离。


在上图中轮圈和车轮直径用绿色标出,而悬架的轨迹部分则用橙色标出,与此同时应力点范围也用绿色标出。在悬架的轨迹部分上,标出了最大压缩位置、最大下垂位置,与目标位置。

正如你所期待的,轮胎只能在最大压缩位置与最大下垂位置之间移动。而目标位置(也被技术人员称作平衡位置)就位于通过弹簧弹力得到平衡的簧上重量之上在受弹力时保持平衡的位置;比如,当车辆静止在水平平面上时的轮胎位置。虽然校准过程看起来很困难,但是实际上最大压缩位置就是你轮胎一开始在网格中所处的位置。

接下来,你可以指定悬架距离和目标位置作为悬挂距离的一小部分。它们仅是两个浮点数,不是大问题!我有没有告诉你全新的车轮碰撞体组件将模拟数据中得到的旋转与位置与箱体碰撞体分开了呢?你甚至不用添加实际的轮胎图形也不用编写轮胎定位代码来复查你的设定。因为这一切都已经内置于引擎中。

性能
目前,我们准备通过多核来运行PhysX3,这是因为其内部计算模型是以多任务的形式而存在,这样我们可以自然地使用多核来执行它们。SDK是通过多线程来执行的,自行处理各项依赖关系并对任务进行最优化分解和安排。

我们期待通过更优的代码构架和经过完善的多线程方式,来让物理的模拟性能翻倍。在某些案例中,其改进令人惊讶,其性能提升甚至达到了十倍以上。
对性能这块感兴趣的开发人员,您可以访问Pierre Terdiman的博客。他是PhysX SDK的主要研发人员。

兼容性
新功能的外观与使用体验都延续了Unity一贯的风格,但在特定情况下,或许有些旧的使用方法将不再被Unity 5所支持,即Unity 5.0的物理组件并不一定100%与Unity 4.x兼容。在你将以前的项目从之前的Unity版本移至最新版本时,稍微改动下项目和重写某些物理组件代码。

除了本文中提到的一些特性之外,Unity 5的物理组件还有更多全新性能。如有疑问,请在留言中提出你的疑问。如果你即将参加再西雅图举行的2014年的Unite开发者大会,我将在大会有关Unity 5.0物理组件深度访谈部分发言,我们可以进行更直接的交流!

关于Unity5的更多信息。
请访问:http://unity3d.com/5?utm_source=unity3d&utm_medium=blog&utm_campaign=Unity_5x_preorder

原文标题:High-performance physics in Unity 5
原文链接:http://blogs.unity3d.com/2014/07/08/high-performance-physics-in-unity-5/

本文来源Unity官方博客,由Unity官方中文社区(unitychina.cn)编译,转载和使用请注出处。



0 0
原创粉丝点击