乐趣区

关于性能优化:DMotion-基于DOTS的动画框架和状态机

【博物纳新】专栏是 UWA 旨在为开发者 举荐新鲜、易用、乏味的开源我的项目 ,帮忙大家在我的项目研发之余发现世界上的热门我的项目、前沿技术或者令人惊叹的视觉效果,并摸索将其利用到本人我的项目的可行性。 很多时候,咱们并不知道本人想要什么,直到某一天咱们遇到了它。

明天举荐的我的项目来自 UWA 开源库:
https://lab.uwa4d.com/Lab/62b…

一、简介

自从 Unity 推出了 DOTS(Data-Oriented Technology Stack,面向数据的技术堆栈)之后,对于其利用始终备受关注。尽管 DOTS 对性能的晋升比拟显著,然而因为其不算低的门槛,依然让许多开发者难以上手。以动画为例,截至目前的 Entities 1.0 版本依然没有官网的基于 Entities 的动画解决方案。本文介绍的插件 DMotion 就提供了 基于 DOTS 的动画框架和状态机,能够帮忙开发者更便捷地应用 DOTS 制作动画

二、性能概览

DMotion 的根底是另一个开源我的项目 Latios-Framework 的 Kinemation 局部。这个我的项目应用 DOTS 建设了一些罕用模块的框架,包含物理、音频、动画等等,目前仍在频繁更新中,对于心愿学习和应用 DOTS 的开发者也能够作为参考,链接如下:
https://lab.uwa4d.com/Lab/5df…

因为 Latios-Framework 应用了另一种动画压缩计划,即应用了插件 Animation Compression Library,这个插件尽管实践上能够用于挪动端,然而目前还没有进行相应的适配,因而 DMotion 目前只能在 PC 平台上应用。作者提到之后会思考扩大到挪动端上。

目前 DMotion 的次要性能如下:
Current Features (V0.3.4):

  • Fully Bursted Runtime
  • State Machine Visual Editor
  • Transitions: Boolean, Int, Enum And End Time
  • Simple API For Playing Clips Through Code (See Samples)
  • 1D Blend Tree
  • Animation Events
  • Root Motion (With Writegroup Support, If You Need To Override Default Behaviour)
  • Object Attachment
  • Support For Optimized And Non-Optimized Skeletons
  • State Machine Visual Debugging

之后可能会更新的性能:
Planned Features:

  • 2D Blend Tree (Cartesian/Freeform)
  • State Machine Override (A.K.A Animator Override Controller)
  • Substates
  • IK Support
  • Multiple Layers
  • Skeleton Masks

三、应用

Latios-Framework 最新的版本(目前为 0.6.4)曾经反对 Entities 1.0,然而 DMotion 还只反对 Entities 0.51 版本,因而装置 DMotion 的 Package 之后须要装置 Latios-Framework 的旧版本,倡议应用 0.5.8 版本。

DMotion 这个插件的应用整体上是比较简单的,可视化水平高,作者提供了 Sample 和具体的领导,须要应用代码的中央都有例子能够参考。文档链接如下:
https://github.com/gamedev-pr…

这里只做一些简略的介绍,比方最简略地播放一个 Animation Clip。

首先须要创立一个 DMotion 的 Clip。

而后在 Inspector 界面中设置好要用到的 Animation Clip。

再给须要播放动画的对象增加对应的组件,在组件中做一些设置,增加须要应用的 Clip,就能够播放动画了。

点击 Play 即可播放动画。

动画状态机局部可视化水平很高,和 Unity 自身的动画状态机的应用办法很靠近。

首先创立一个动画状态机。

创立一个新的状态。

增加对应的 Animation Clip。

两个动画状态之间能够建设 Transition。

Transition 能够设置一些参数和条件。

这些内容都能够在文档中找到,因而不再赘述。

四、实现原理

DMotion 是一个基于 DOTS 的框架,这里咱们从播放动画的代码开始剖析。

继承 IConvertGameObjectToEntity 是为了调用 Convert 函数把 GameObject 转化为 Entity。继承 IRequestBlobAssets 是为了调用 RequestBlobAssets,把 Animation Clip 转化成 DOTS 反对的格局,这里应用了插件 Latios-Framework 中的 Kinemation 局部,最终会转化成一种 BlobAsset,这是 DOTS 当中针对 Streaming 做了优化的二进制数据结构。

Convert 函数的具体内容,把 GameObject 转化为 Entity 并增加对应的 Component。

应用 RequestBlobAssets 把 Animation Clip 转化成 BlobAsset 的局部。在运行的时候,DMotion 应用的代码都是应用 Burst 编译的。在 System 文件中的代码是运行时对 Entities 的 Component 进行解决的局部,也就是 ECS 中的“S”,能够看到这些代码都是应用 Burst 编译的,并且应用了 Job System。

可见 DMotion 充分利用了 DOTS 零碎,能够预测到其性能体现应该是比拟优良的。

五、性能

首先介绍一下 DOTS 为什么会比传统形式更快。Unity 推出的 DOTS 次要包含三个方面,别离是 ECS、Burst Complier 和 Job System。Entities 是游戏中的事物,或者说是一些数据的汇合。Components 把与 Entity 相干的数据组织起来,Systems 则是把 Components 的数据从以后状态转换为下一个状态的逻辑。下图展现了 ECS 的组织架构。

ECS 架构在执行逻辑时,只会操作须要操作的数据。System 在操作数据的时候只会收集它关怀的 Component 数据,CPU 运行时就会将这一整块内存装入高速缓存中,这样就缩小了 Cache Miss 次数,减少了缓存命中率,整体上进步了程序效率。此外古代 CPU 中应用的 SIMD 技术与这种数据密集的架构相性极好,能够进一步提高性能。

ECS 模式更加适宜古代 CPU 架构,因为它能够做到高效解决数据,而不必把多余的数据字段存入贵重的缓存从而导致屡次 Cache Miss。比方操作 Unity 对象的 Position 属性,会把 GameObject 所有相干数据都退出缓存,节约了贵重的缓存空间。而如果在 ECS 架构下,将只会把 Position 属性放入内存,节俭了缓存空间,也肯定水平上缩小了 Cache Miss。

这种数据结构很适宜并行处理。Burst Complier 是应用 LLVM 从 IL/.NET 字节码转换为高度优化的本机代码的编译器,与 Job System 一起生成多线程并行处理的代码,充分利用 SIMD,多线程操作充分发挥 ECS 的劣势。因而 Unity 的 DOTS 往往比传统形式速度更快。

因为 DOTS 自身的个性,DMotion 的性能体现比 Animator 更为优良。在文档中作者认为性能晋升能够达到大概 6 倍左右,而咱们的理论测试后果为大概快 3 倍左右。

测试环境:
平台:Windows 10 (10.0.19044) 64bit
Unity 版本:2021.3.9f1c1
GPU:Intel(R) UHD Graphics 750/Direct3D 11.0
CPU:3.6ghz/11th Gen Intel(R) Core(TM) I7-11700K @ 3.60ghz
测试工具:UWA GOT Online

测试用例:
应用的 Model 如下,领有 5770 个顶点和 29 个骨骼。

应用的动画是行走的动画,别离应用 DMotion 和 Animator 进行测试。

测试内容:
加载并播放了 2500 个带有动画的模型,测试帧率。

测试后果如下:
DMotion:
均匀帧率为 15.33 帧

Animator:
均匀帧率为 5.5 帧

可见在性能上 DMotion 相比 Animator 有肯定晋升,惋惜的是目前还不适配挪动平台。感兴趣的同学能够关注这个我的项目的更新状况,也能够尝试在其根底上做进一步的改良。

退出移动版