Unity项目技术方案Dots架构方案简介

这篇具有很好参考价值的文章主要介绍了Unity项目技术方案Dots架构方案简介。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

DOTS全称是Data-Oriented Tech Stack,翻译过来就是多线程式数据导向型技术堆栈(DOTS),它由任务系统(Job System)、实体组件系统(ECS)、Burst Compiler编译器三部分组成。

ECS + JobSystem + BurstCompile = 高性能 + 多线程 +  编译层面优化

DOTS保证相同类型组件在内存中都是顺序排列,极大程度增加缓存的命中率,此外配合任务系统(Job System)让开发者无需头疼多线程同时访问数据需要手动加解锁的麻烦,最终加持Burst Compiler让性能飞起来。

ECS、JobSystem、Burst,这三个组件是可以相互独立使用,并不是说使用一个这三个必须同时用,你可以任意选择其中一个来进行使用,用于不同的应用场景。

如果说我们需要使用JobSystem,其实它跟ECS没有太大的关系,你可以在ECS里面用,也可以不在ECS里面用,只要是需要并行计算的地方都可以使用。

Burst也一样,它也不需要配合ECS使用,不需要跟并行计算捆绑使用,它的作用仅仅是对于一些复杂的计算密集的东西去进行编译器优化,来达到性能提升。

只要是计算密集型的东西,都可以使用Burst,同步方法也是可以的。

关于ECS,一个比较大的误解,可能大家会觉得用ECS之后,所有东西都可以用ECS来写,就会想UI的业务逻辑怎么用ECS实现。大可不必,并不是说用ECS,所有东西全部都要用ECS来做,而是大家可以根据项目需求选择其中适合那部分来用ECS去写,剩下的部分还是使用传统的面向对象的方式去写,没有任何问题,只要用代码稍微结合一下就可以了。

在《黑暗之潮》当中利用ECS的例子,我们通过ECS渲染了大量的怪物。我们游戏里面怪物通常有一个特点,一组怪由几名精英配合一两种大量的存在的爪牙组成的,大家可以看到右面的图只有三种怪,如果说用默认的SkinMeshRenderer的话,就有一个非常严重的问题,没有办法合批了,画面上面有多少个怪,有多少个DrawCall而且Animator开销也不小,还有一个问题,GameObject为.Instantiate开销也是比较大的,如果说我要同时刷出来三四十只怪的话,肯定会卡顿,用ECS就能比较好的解决这三个问题。
 

Unity项目技术方案Dots架构方案简介


使用ECS先把整个动画信息去烘焙到这么一张动画贴图上面,在GPU当中进行蒙皮操作,我们再通过JobSystem和Burst实现视锥剔除和动画系统的更新,最后我们再在面向对象那块业务逻辑那块控制ECS Enity就可以了。也就是说ECS的部分,我们只是提供渲染的和动作的结构,其他部分业务逻辑还是完全用面向对象去实现的,相当于各取所长。
 

Unity项目技术方案Dots架构方案简介


用ECS最大的好处就是性能。

首先第一个,因为我们采用了GPU蒙皮,整个DrawCall的数量下降到有几种怪就是几个DrawCall,这个就非常好了。实例化也是非常快,ECS基本上就是无感的,在极端机上消耗,即便同时刷一千只怪也不足1毫秒,借助Burst力量类似于视锥剔除这些计算量比较大的操作,在低端机上也是可以忽略不计的。

大家可以看到下面的截图,演示我们整个动画更新阶段,也是同样在骁龙450 SoC上测的,100只怪左右的情况,动画整个更新过程只用了0.008毫秒,这就是忽略不计,根本不需要考虑的一个量级。通过ECS,我们画面上怪物的渲染完全取决于GPU本身的渲染性能,CPU的开销完全不需要去考虑了,所以也不会出现卡顿。
 

Unity项目技术方案Dots架构方案简介


第二个,我们通过Jobsystem去实现了怪物击飞的效果,大家可以看到这个怪物被打下悬崖,它如果说碰到墙壁必须要被墙壁挡下来,需要进行一些物理运算,如果直接使用Unity的Ragdoll也就是布娃娃系统,它的物理计算非常复杂,对于低端机会造成比较大的性能负担。我们把这个过程稍微简化了一下,所有的这些怪物在被击飞的时候,使用的是预先制作好的动画,我们只需要计算它的运行轨迹就行了。

我们首先用Job去并行计算这些怪物的分析轨迹,再通过Unity提供的多线程Raycast方法去进行射线检测来判断它是否撞到墙或者碰到地面了。最后如果说我们还有一些非ECS了对象,我们可以在计算完毕之后再通过一个单独的Job把这个所有GameObject的位置给同步一下就可以了。
 

Unity项目技术方案Dots架构方案简介


第三个,我们通过Burst实现的就是射线技能,这个东西看上去很简单,实际上需要对整个场景以及所有的怪物和其他对象产生交互。射线打到墙上能够实时产生反映,我们这个东西需要每帧对整个场景进行射线检测,整个计算过程实际上是开销比较大的。通过Burst我们相当于把这个东西做成了一个Job,通过Job.Run的方法去直接进行调用,就是在当前这个线程进行的操作。

使用起来跟一个静态方法没有太大的差别,还有像大家看到的这个技能,会有大量的子弹,对这些子弹我们同样需要进行运行轨迹的计算。通过Burst非常有效的把这两个计算开销降的非常低,Burst开启之后,它的性能提升基本能上百倍,通过刚才也提到Job.Run的方式实现同步调用,我们在整个计算流程当中不需要开额外的线程,直接在当前线程,单个静态方法直接调用就可以了,也是非常方便的。
 

Unity项目技术方案Dots架构方案简介


大家可以看一下开启和不开启Burst效果的差别,左边是开启,右边是不开启,我们在一个计算体系化模型工具中测试,左边只用241毫秒,右边用了20毫,真是一百倍的差别。而不是说它用了多线程所以更快,大家可以看到每个线程都快了100倍,如果算总耗时,这边用了143秒,这边只用了1秒钟,如果把所有线程的时间加起来,就是100倍的差别,效果非常明显。
 

Unity项目技术方案Dots架构方案简介

什么项目用Dots?

具有大量相同类型运算的项目,例如RTS、SLG、我的世界类型方块沙盒。

Dots这套解决方案,暂时只能对CPU进行优化,GPU方向期待Unity后续计划。

Burst目前还是Preview,正式项目中使用可能会有很多坑 。

https://aladdin.blog.csdn.net/article/details/105081530

Unity DOTS技术浅析_IT善男信女鬼的博客-CSDN博客

[Unity 活动]-Unity DOTS技术详解 - 宣雨松_哔哩哔哩_bilibili

ILRuntime作者林若峰分享:次世代手游渲染怎么做 - GameRes游资网

[Unity 活动]-游戏专场|Unity 2019 新特性在次时代手游 《黑暗之潮》中的应用经验及技术分享_哔哩哔哩_bilibili

Unity2019 Dots初试_Hello Captain-CSDN博客

Unity DOTS学习教程汇总_学无止境的专栏-CSDN博客

ECS的泛泛之谈 - 知乎

一种类ECS设计范式的介绍 链接: https://pan.baidu.com/s/1hH3YwgPvB9m39_e3HzlAcA 提取码: 5wwm  文章来源地址https://www.toymoban.com/news/detail-407191.html

到了这里,关于Unity项目技术方案Dots架构方案简介的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Docker技术--Docker简介和架构

    1.Docker简介   (1).引入         我们之前学习了EXSI,对于虚拟化技术有所了解,但是我们发现类似于EXSI这样比较传统的虚拟化技术是存在着一定的缺陷: 所占用的资源比较多 ,简单的说,就是你需要给每一个用户提供一个操作平台,这一个操作平台就会占用你的资源。这样

    2024年02月10日
    浏览(30)
  • 2-Docker架构和底层技术简介

        

    2024年02月05日
    浏览(29)
  • Unity Dots学习内容记录

    DOTS未来的潜力还是挺多的,目前已经陆续有项目局部投入该技术,追求硬件到软件的极致性能。 主要是记录下学习unity dots技术的过程吧。 DOTS全称Data Oriented Tech Stack,面向数据的技术堆栈。 是由Unity的下面几个技术栈组成 1.Entities(ECS,Entity-Component Data-System) 2.JobSytem(多线程作

    2024年04月15日
    浏览(41)
  • Unity 万人寻路(dots版本)

    时间:2023-7-29 北京下雨,公司停电,回家早了,更新一下。 寻路模块,还是前前后后,打磨了2个月,中间穿插着搞很多其他的功能,有些螺旋迭代的味道。 进入正题: 设计团队,会从游戏性角度考虑,提出很多需求。 1,单位之间的规避,模型不能穿插 2,建筑物规避,模

    2024年02月08日
    浏览(30)
  • Unity DOTS从原理到应用

    什么是DOTS? Unity的DOTS(Data-Oriented Technology Stack)是一种数据驱动的技术堆栈,旨在提高Unity游戏引擎的性能和可伸缩性。它使用C# Job System,Burst Compiler和Entity Component System(ECS)来组合和处理数据,让游戏运行更高效率。DOTS使开发人员可以使用最新技术来开发游戏,并在追求

    2024年02月11日
    浏览(30)
  • Unity DOTS1.0安装

    2023年6月10日更新: 2022.3 Entities1.0 manifest.json添加一句

    2024年02月15日
    浏览(27)
  • PLC原理及PLC+FPGA(SOC)架构方案简介

    工业生产和科技的发展都离不开PLC的自动化控制,PLC可以广义的理解为: 集中的继电器延伸控制柜,实际的生产应用中,PLC大大的节省了工业控制的成本,加强了设备的集中管理和自动控制。 PLC (Programmable Controller,可编程程序控制器)它是一个以微处理器 为核心的数字运

    2024年02月10日
    浏览(38)
  • 项目架构简介

    目录 1 单体应用架构  2 垂直应用架构 3 分布式架构 3.1 RPC 3.2 SOA 4 微服务架构 本文介绍后台应用的各种架构,以及各架构的优缺点对比         将所有的代码功能都写在一个项目中(例如:MVC结构,SSM框架),同时打包,同时部署                 优点:便于管理,减少开发、

    2024年02月13日
    浏览(19)
  • Unity DOTS Baking与Baker详解

    Unity DOTS Baking与Baker详解   最近DOTS终于发布了正式的版本, 我们来分享一下DOTS里面Baking 与Baker的关键概念,方便大家上手学习掌握Unity DOTS开发。   Unity DOTS开发模式,为了让大家在”创作”游戏的时候使用原来组件方式来编辑游戏场景与资源,同时Unity提供了一种Baking机制

    2024年04月17日
    浏览(28)
  • DOTS Unity.Physics物理引擎碰撞事件处理

    最近DOTS发布了正式的版本,同时基于DOTS的理念实现了一套高性能的物理引擎,今天我们给大家分享和介绍一下这个物理引擎的碰撞事件处理以及核心相关概念。 Unity.Physics 物理引擎的主要流程与P ipeline   Unity.Physics物理引擎做仿真迭代计算的时候主要通过以下步骤来执行:   

    2024年01月18日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包