DMotion - 基于DOTS的动画框架和状态机

news2025/8/2 21:58:54

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

今天推荐的项目来自UWA开源库:
Latios Framework -- UWA问答 | 开源库 | 帮助开发者发现更好的解决方案| 侑虎科技

一、简介

自从Unity推出了DOTS(Data-Oriented Technology Stack,面向数据的技术堆栈)之后,关于其应用一直备受关注。虽然DOTS对性能的提升比较明显,但是由于其不算低的门槛,仍然让许多开发者难以上手。以动画为例,截至目前的Entities 1.0版本仍然没有官方的基于Entities的动画解决方案。本文介绍的插件DMotion就提供了基于DOTS的动画框架和状态机,可以帮助开发者更便捷地使用DOTS制作动画

二、功能概览

DMotion的基础是另一个开源项目Latios-Framework的Kinemation部分。这个项目使用DOTS建立了一些常用模块的框架,包括物理、音频、动画等等,目前仍在频繁更新中,对于希望学习和使用DOTS的开发者也可以作为参考,链接如下:
Latios Framework -- UWA问答 | 开源库 | 帮助开发者发现更好的解决方案| 侑虎科技

由于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-pro/dmotion/wiki/1.1-Getting-Started:-The-Basics

这里只做一些简单的介绍,比如最简单地播放一个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有一定提升,可惜的是目前还不适配移动平台。感兴趣的同学可以关注这个项目的更新情况,也可以尝试在其基础上做进一步的改进。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/367660.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android反射@hide API 方法、变量,支持Android11和Android12

Android源码中现在有大量的方法和变量被hide所修饰,而这些被hide修饰的方法和变量是不允许应用层进行反射获取的,所以富有探索精神的程序员们就开始想尽各种办法绕过系统hide限制来使用hide修饰的方法和变量。1、套娃(适配Android10即之前&am…

Python实现贝叶斯优化器(Bayes_opt)优化Catboost分类模型(CatBoostClassifier算法)项目实战

说明:这是一个机器学习实战项目(附带数据代码文档视频讲解),如需数据代码文档视频讲解可以直接到文章最后获取。1.项目背景贝叶斯优化器(BayesianOptimization) 是一种黑盒子优化器,用来寻找最优参数。贝叶斯优化器是基…

PHPExcel 表格设置

4.5.3。通过行和列设置单元格值 通过设置坐标单元格值可以使用工作表的setCellValueByColumnAndRow方法来实现。 //设置单元格B8 $objPHPExcel->getActiveSheet()->setCellValueByColumnAndRow(1, 8, ‘Some value’); 4.5.4。由列和行中检索的小区 检索的小区的值&#…

Blender——竹篮的制作

效果图前言参考视频:Blender 竹篮建模编制效果3D教程建议Blender版本在v3.0.0或以上,本实验的blender为v3.4.1操作步骤打开一个【常规项目】。点击shading下拉列表,将颜色改为【随机】,背景改为【世界坐标】,勾选【Cva…

Linux期末考试应急

Linux期末考试应急 虚拟机添加硬盘、分区、格式化、挂载、卸载 fdisk -l#查看系统现有分区fdisk <指定磁盘>#指定磁盘分区sudo mkfs.ext3 <指定分区>#格式化磁盘###挂载磁盘1.新建一个目录sudo mkdir /mnt/test2.将指定分区挂载到对应目录sudo mount /dev/sdb10 /…

里程计(一) 数学模型及STM32实现

一、首先确保接线和硬件没问题&#xff0c;并确定控制逻辑 测试单片机-驱动板-电机连线是否接通&#xff1a;控制板IN1,IN2一个接3.3V一个接GND,ENA1接3.3V测左电机&#xff1b;控制板IN3,IN4一个接3.3V一个接GND,ENA2接3.3V测右电机。 在电机已经安装完毕的情况下&#xff0c;…

SAP ABAP中的数据类型 Data Types

简单来说分两种&#xff1a; 数据字典里定义的在ABAP程序里定义的 文章目录1. ABAP数据字典里的1.1 数字型的1.2 字符型1.3 字节型1.4 特殊类型2. 预定义的ABAP数据类型2.1 预定义数字型2.2 预定义字符型2.3 预定义字节型1. ABAP数据字典里的 1.1 数字型的 用在数学计算里的…

IP、MAC和端口号——网络通信中确认身份信息的三要素

目录 &#x1f30f; IP地址 &#x1f30f; MAC地址 &#x1f30f; 端口号 IP、MAC和端口号——网络通信中确认身份信息的三要素 在茫茫的互联网海洋中&#xff0c;要找到一台计算机非常不容易&#xff0c;有三个要素必须具备&#xff0c;它们分别是 IP 地址、MAC 地址和端口…

【Galois工具开发之路】关于ClassFileTransformer的注意点

关于ClassFileTransformer 该接口是javaagent的 Instrumentation.addTransformer 方法的入参之一&#xff0c;用于给加载的类添加一个类转换器&#xff0c;确保在类进入main方法之前&#xff0c;对类进行字节码插桩。 接口函数说明 该接口只有一个方法&#xff0c;即 byte[…

[SSD固态硬盘技术 19] 谁是数据的守护神? 盘内RAID1/RAID5图文详解_盘内数据冗余保护

版权声明&#xff1a; 付费作品&#xff0c;禁止转载前言提到冗余保护&#xff0c;最容易想到的就是RAID(Redundant Arrays of Independent Disks) , 独立冗余磁盘阵列。它是一种把多块独立的物理硬盘按不同方式组合形成一个硬盘组&#xff0c;以此提供比单个硬盘更高的存储性能…

华为OD机试题,用 Java 解【TLV 解码】问题

最近更新的博客 华为OD机试 - 猴子爬山 | 机试题算法思路 【2023】华为OD机试 - 分糖果(Java) | 机试题算法思路 【2023】华为OD机试 - 非严格递增连续数字序列 | 机试题算法思路 【2023】华为OD机试 - 消消乐游戏(Java) | 机试题算法思路 【2023】华为OD机试 - 组成最大数…

数据库浅谈之 LLVM

数据库浅谈之 LLVM HELLO&#xff0c;各位博友好&#xff0c;我是阿呆 &#x1f648;&#x1f648;&#x1f648; 这里是数据库浅谈系列&#xff0c;收录在专栏 DATABASE 中 &#x1f61c;&#x1f61c;&#x1f61c; 本系列阿呆将记录一些数据库领域相关的知识 &#x1f3c…

【CJSON】嵌入式芯片上基于USB HOST的CJSON文件库移植与应用

一 CJSON简介项目遇到了一个需求&#xff0c;就是需要通过U盘或者其他外接设备&#xff0c;与板子&#xff08;嵌入式芯片使用的是LPC1857&#xff09;进行交互。交互的形式有两种&#xff1a;一种是预存在外接U盘中的配置信息CFG&#xff0c;接上U盘之后&#xff0c;嵌入式芯片…

【HTTP——了解HTTP协议及状态码】

一&#xff0c; 什么是通信通信&#xff0c;就是信息的传递和交换。通信三要素&#xff1a;通信的主体&#xff0c;通信的内容&#xff0c;通信的方式现实生活中的通信&#xff1a;我打电话叫小明来我家吃饭【其中通信的主体是&#xff0c;我&#xff0c;小明。通信内容是&…

华为OD机试题,用 Java 解【最小施肥机能效】问题

最近更新的博客 华为OD机试 - 猴子爬山 | 机试题算法思路 【2023】华为OD机试 - 分糖果(Java) | 机试题算法思路 【2023】华为OD机试 - 非严格递增连续数字序列 | 机试题算法思路 【2023】华为OD机试 - 消消乐游戏(Java) | 机试题算法思路 【2023】华为OD机试 - 组成最大数…

【AI写作】《如何利用 RPA 实现自动化获客?》

写一篇文章《如何利用 RPA 实现自动化获客?》,不少于3000字,使用markdown格式。分10各章节,细化到3级目录。 文章目录 1. 什么是 RPA (Robotic Process Automation)?RPA 的应用场景2. RPA 自动化获客实战2.1 RPA 应该领域2.2 自动化选品 – 电商选品2.3 自动化获客 – 百…

Biome-BGC在模拟过程中,如何使用Linux、Python等,完成前处理和后处理工作???

在Biome-BGC模型中&#xff0c;对于碳的生物量积累&#xff0c;采用光合酶促反应机理模型计算出每天的初级生产力(GPP)&#xff0c;将生长呼吸和维持呼吸减去后的产物分配给叶、枝条、干和根。生物体的碳每天都按一定比例以凋落方式进入凋落物碳库&#xff1b;对于水份输运过程…

【C语言】数据的存储

☃️内容专栏&#xff1a;【C语言】进阶部分 ☃️本文概括&#xff1a; C语言中的数据类型及其存储方式。 ☃️本文作者&#xff1a;花香碟自来_ ☃️发布时间&#xff1a;2023.2.24 目录 一、数据类型详细介绍 1.1 基本的数据类型 1.2 整型家族 1.3 构造类型 1.4 指针类型…

压力传感器MPX5700D/MPX5700GP/MPX5700AP产品概述、特征

MPX5700系列压阻式换能器是最先进的单片硅压力传感器&#xff0c;可广泛用于各种应用&#xff0c;特别是采用A/D输入微控制器或微处理器的应用。这一获得专利的单元件传感器集合了高级微加工技术、薄膜金属化、双极工艺&#xff0c;能够提供精确的、与所施加压力成正比的高电平…

Java面向对象:继承特性的学习

本文介绍了面向对象的继承特性: 什么是继承 继承的概念 Java中继承的语法 在继承下父类成员的访问 super和this关键字 父类和子类构造方法 在继承下类中出现初始化代码的执行顺序 父类成员的访问权限对子类的可见性 Java的继承关系 final关键字 认识继承和组合关系 继承特性的学…