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

news/2024/4/28 5:16:54/文章来源:https://blog.csdn.net/UWA4D/article/details/129197493

【博物纳新】专栏是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.luyixian.cn/news_show_73459.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

day51【代码随想录】动态规划之回文子串、最长回文子序列

文章目录前言一、回文子串(力扣647)二、最长回文子序列(力扣516)前言 1、回文子串 2、最长回文子序列 一、回文子串(力扣647) 给你一个字符串 s ,请你统计并返回这个字符串中 回文子串 的数目…

数据库防护做不好,分分钟要被勒索比特币,每个接触数据库的都必须知道

公司有个公网数据库被黑了,对方留言勒索0.006比特币,按目前比特币的价值,大概1009元人民币左右,虽然不多,但发生这个事情着实让人丢脸,说明平时对防护还做不到位! 还好公司平时有做数据库防范措…

骨传导耳机靠谱吗,骨传导耳机的原理是什么

很多人刚开始接触骨传导耳机时都会具有一个疑问,骨传导耳机是不是真的靠谱,是不是真的不伤害听力?骨传导耳机传输声音的原理是什么? 下面就给大家讲解一下骨传导耳机传输声音的原理以及骨传导耳机对听力到底有没有伤害。 骨传导…

DeepLabV3+:对预测处理的详解

相信大家对于这一部分才是最感兴趣的,能够实实在在的看到效果。这里我们就只需要两个.py文件(deeplab.py、predict_img.py)。 创建DeeplabV3类 deeplab.py的作用是为了创建一个DeeplabV3类,提供一个检测图片的方法,而…

如何通过jar包得知maven坐标,以及如何替换依赖的依赖的版本

问题一:我只能得到这个jar包的名字,如果得知这个jar包的maven坐标(groupId以及artifactId)? 思路1:将jar包的名字(去除版本号)在mvn仓库中搜索,地址:https:/…

Linux期末考试应急

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

PHPExcel 表格设置

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

什么蓝牙耳机打游戏好?打游戏好用的无线蓝牙耳机

午休或是周末约上好友玩两局游戏&#xff0c;是忙里偷闲的快乐时刻&#xff0c;对于普通游戏玩家&#xff0c;其实耳机够用就行&#xff0c;下面就分享几款打游戏好用的蓝牙耳机。 一、南卡小音舱蓝牙耳机 蓝牙版本&#xff1a;5.3 推荐系数&#xff1a;五颗星 南卡小音舱li…

酷开系统AI人工智能技术,为营销抢夺更多目标消费者

随着越来越多的年轻群体回归家庭&#xff0c;互联网电视产业正在时代的浪潮下快速发展&#xff0c;如今已经有数以万计的家庭消费者倾向于在客厅场景中使用大屏电视观看更多丰富的电视节目&#xff0c;而这一趋势&#xff0c;对于急需线上互动营销渠道的企业和品牌方来说&#…

乘上算力发展的东风,联想这次能否变革突起?

“逆水行舟&#xff0c;不进则退”笔者认为这句话也同样适用到现在的联想集团身上&#xff0c;近3年受到疫情的影响全球电子领域普遍不突出&#xff0c;智能手机出货量上涨乏力&#xff0c;个人电脑&#xff08;PC&#xff09;的销量也波动频繁&#xff0c;联想集团在这种不乐观…

追梦之旅【数据结构篇】——详解C语言实现链栈

详解C语言实现链栈~&#x1f60e;前言&#x1f64c;整体实现内容分析&#x1f49e;1.头文件编码实现&#x1f64c;2.功能文件编码实现&#x1f64c;3.测试函数功能代码&#x1f64c;总结撒花&#x1f49e;&#x1f60e;博客昵称&#xff1a;博客小梦 &#x1f60a;最喜欢的座右…

茂名市 2021 年高中信息技术学科素养展评

没事干&#xff0c;发一下去年去比赛的题目。 目录 第一题 30分 第二题 30分 第一题 30分 题目&#xff1a; “姐姐&#xff0c;乘除法运算太难了&#xff0c;有什么办法能熟练掌握吗&#xff1f;”今年 读小学四年级的表弟向李红求救。为了提高表弟的运算能力&#xff0c;…

Linux 服务器CPU超高如何快速定位

前言 在生产环境中有时会遇见服务器CPU超高的问题&#xff0c;特别是重大版本发布后如果有内存泄露很容出现CPU超高&#xff0c;严重可能会达到100%。现在我们使用的服务器都是多核CPU&#xff0c;当出现CPU告警我们需要及时发现问题代码并处置&#xff0c;不然严重情况下会导致…

HashMap~

HashMap&#xff1a; HashMap是面试中经常被问到的一个内容&#xff0c;以下两个经常被问到的问题&#xff0c; Question1&#xff1a;底层数据结构&#xff0c;1.7和1.8有何不同&#xff1f; 答&#xff1a;1.7数组&#xff0b;链表&#xff0c;1.8数组&#xff0b;(链表|红…

【Redis中bigkey你了解吗?bigkey的危害?】

一.Redis中bigkey你了解吗&#xff1f;bigkey的危害&#xff1f; 如果面试官问到了这个问题&#xff0c;不必惊慌&#xff0c;接下来我们从什么是bigkey&#xff1f;bigkey划分的类型&#xff1f;bigkey危害之处&#xff1f; 二.什么是bigkey&#xff1f;会有什么影响&#xff…

苹果设计可变色Apple Watch表带,智能穿戴玩法多

苹果最新技术专利显示&#xff0c;苹果正在为 Apple Watch 设计一款可变色的表带&#xff0c;可以根据佩戴者所穿着的服装、所在的环境等自动改变颜色。据介绍&#xff0c;这款表带里的灯丝具有电致变色功能&#xff0c;可以通过施加不同的电压&#xff0c;来实现显示多种颜色或…

jvm常识

Jvm工作原理学习笔记0126一、JVM的生命周期1.JVM实例对应了一个独立运行的java程序它是进程级别a)启动。启动一个Java程序时&#xff0c;一个JVM实例就产生了&#xff0c;任何一个拥有public static void main(String[] args)函数的class都可以作为JVM实例运行的起点b)运行。ma…

web中git漏洞的形成的原理及使用

目录 1.Git漏洞的成因 1.不正确的权限设置&#xff1a; 2.代码注入漏洞&#xff1a; 3.未经身份验证的访问&#xff1a; 4.非安全传输&#xff1a; 5.跨站脚本攻击&#xff08;XSS&#xff09;&#xff1a; 2.git泄露环境的搭建 git init&#xff1a; git add&#xff1…

跟小米、特斯拉分“蛋糕”的优必选要IPO

‍数据智能产业创新服务媒体——聚焦数智 改变商业如果要问目前科技界最火的话题是什么&#xff0c;很多人的答案将是ChatGPT。而且&#xff0c;ChatGPT大有“破圈”之势&#xff0c;不仅业界人士在关注&#xff0c;各行各业的普通人也在大量讨论。要说最近科技圈讨论的焦点&a…

C++【模板STL简介】

文章目录C模板&&STL初阶一、泛型编程二、函数模板2.1.函数模板概念2.2.函数模板格式2.3.函数模板的实例化2.4.模板参数的匹配原则三、 类模板3.1.模板的定义格式3.2.类模板的实例化STL简介一、STL的概念、组成及缺陷二、STL的版本C模板&&STL初阶 一、泛型编程…