在GDC 2019上,我们宣布将Havok Physics作为预览版资源包加入到Unity资源包管理器,这意味着所有Unity开发者都可以使用这款知名的物理引擎。在当今主机平台中,Havok Physics应用于超过半数的主机游戏大作,出色地满足了用户的物理模拟需求。

unity架构海洋 unity havok_数据

当我们推出面向数据技术栈DOTS,尝试定义物理模拟的未来时,我们决定寻找有相同核心理念和价值观的合作伙伴。通过与Havok进行合作,我们可以利用DOTS提供高度优化、性能高效并基于C#的无状态物理模拟解决方案Unity Physics。

我们了解到部分用户有更复杂的物理模拟需求,需要能够根据状态变化的物理系统。对此,我们认为Havok可以满足这些高端的模拟需求,将其集成到Unity中是一项明智之举。

大家可能会问:为什么要制作两个物理系统,不做成一个?我们知道用户会有各式各样的使用方法,因此我们提供两个物理系统让用户根据需求自行选择。

一般情况下,Unity Physics可以满足大部分需求,而部分用户则希望能够使用到Havok Physics的优势和工作流程。对物理引擎而言,其实并没有什么正确或错误的选择,用户可以在两种物理解算器之间自由切换,无需重新制作所有内容。

集成Havok Physics

性能

Unity中的Havok Physics集成和Unity Physics一样,都使用了C# DOTS框架,而Havok Physics基于闭源专利技术Havok Physics物理引擎,由C++代码编写。

通过多款经典游戏的洗礼,Havok Physics物理引擎已经进行了极大的优化。核心算法打磨多年,提供不活动对象休眠等多种自动缓存策略,该物理引擎将能够让CPU的资源用到刀刃上。

unity架构海洋 unity havok_数据_02

行为

Havok Physics是高效稳定的物理引擎,可用于处理包含许多物理交互的复杂场景,满足大部分游戏在动态场景上的性能需求。在Havok与业界许多合作伙伴超过20年的合作中,遇到并解决了许多实时物理引擎模拟中的难题,而且不断针对问题进行迭代。

Havok对物理引擎的投入取得了稳定的物理刚体堆叠功能,在刚体快速移动时产生的瑕疵会更小,并得到了通常情况下更可控的行为,特别是在使用未优化的碰撞几何体时,效果更为明显。

unity架构海洋 unity havok_物理引擎_03

Havok Physics中稳定堆叠功能的示例

Havok Physics可以缓存不同的状态信息,以执行智能优化过程,因此它可以在大型游戏中实现极佳的性能。例如:开放世界类游戏。Havok Physics还具备高级摩擦力模型,可以更好地处理相互贯穿的对象与近乎无限的堆叠情况,从而提供更多的稳定性。

在下方第二张图中,Unity Physics在一帧中解决了互相贯穿的动态刚体和静态刚体,而在第一张图中,Havok Physics可以在几帧中平滑地解决该情况。

unity架构海洋 unity havok_物理引擎_04

unity架构海洋 unity havok_数据_05

可视化与调试

Havok Visual Debugger可视化调试工具,简称VDB是一款面向Havok Physics模拟的稳定可靠的调试工具。它通过TCP/IP协议连接到开发者的应用上,远程诊断出复杂的行为、性能或崩溃问题。

当连接成功时,应用中将显示出一个功能菜单,你可以根据需要解决的问题来打开或关闭某些功能。在一定的设置下,应用还可以为连接上的VDB用户创建一个服务器,提供必要信息。

unity架构海洋 unity havok_物理引擎_06

Havok可视化调试工具的界面

在每一款使用Havok Physics的游戏上,可视化调试工具一直是开发团队使用的重要工具。你可以选择性地启用模块化查看窗口,从而实现以下功能:

  • 在模拟中暂停,并回滚查看之前的物理交互。
  • 通过图表和文字的形式,查看性能数据。 
  • 查看物理世界中组成刚体的碰撞体。
  • 查看刚体之间的关节和接触。
  • 可视化刚体的持续动作路径。
  • 查看动态刚体的启用或禁用状态。
  • 查看模拟热力图,精准定位到需要立即优化的高昂开销区域。
  • 直接与物理模拟进行交互。

VDB调试工具客户端还可以记录、保存和加载之前模拟结果的截图,以便用于审查。在开发者需要外部支持来帮助调试复杂的物理场景时,这些截图会成为非常有价值的信息。

两个物理引擎,一种数据格式

我们在开始开发DOTS Physics物理时,其中一个关键目标是:让同一种数据表现形式能够在任何模拟后端中使用

通过提供统一的编辑器数据布局,用户可以编写与模拟后端无关的工具、游戏代码或其它系统。我们希望将这种控制权交给创作者,让创作者无需重新制作任何内容便能够使用合适的模拟后端。

下图展示了数据布局模型。

unity架构海洋 unity havok_数据_07

DOTS中的物理数据流

如上图所示,数据可以直接从编写阶段传到模拟系统中。在底层部分,我们将编写的数据抽象化处理,让数据变为与物理系统无关的形式,从而能够在两个模拟后端上构建相同的工具和用户体验。

此后,数据通过转换管线传入Entity Data实体数据。在Entity Data实体数据中,我们有PhysicsCollider、PhysicsVelocity、PhysicsMass、PhysicsDamping、PhysicsGravityFactor及PhysicsCustomTags等运行时组件。

这些组件数据会传入Build Physics World构建物理世界系统,在这第二次转换中,将针对连续访问而优化的数据转换为针对随机访问而优化的数据。然后构建系统会生成Collision World碰撞世界和Dynamic World动态世界,Collision World碰撞世界用于查询当前时间点的世界状态,Dynamic World动态世界包含当前时间步长上模拟物理效果需要的所有信息。

通过分离这两个世界,我们可以对Collision World碰撞世界执行查询操作,同时在Step Physics World物理世界更新Dynamic World动态世界中的数据,最大化利用线程工作。

在上图中还可以看到,Unity Physics与Havok Physics在整个管线中使用的是相同的数据。这样一来,用户不仅可以使用统一的内容管线,还能够使用和物理系统无关的数据协议和表面层API,而且在两种后端之间切换的过程非常轻松。

随着我们推出DOTS Physics物理引擎架构,我们希望Unity在未来可以提供许多模拟后端,满足各种不同的使用需求,同时在这些物理系统中保持一致的创作体验。

unity架构海洋 unity havok_unity 下一帧执行_08

运行模式中物理引擎后端之间的实时切换

使用Havok Physics

开发者可以通过Unity 2019.1及更高版本的资源包管理器,以预览版资源包的形式下载Havok Physics物理引擎集成。

Havok Physics for Unity说明文档:

https://docs.unity3d.com/Packages/com.havok.physics@0.1/manual/index.html