【博物纳新】专栏是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有肯定晋升,惋惜的是目前还不适配挪动平台。感兴趣的同学能够关注这个我的项目的更新状况,也能够尝试在其根底上做进一步的改良。