Unity DOTS学习日记(1)

这是我的DOTS学习日记,写于笔下加深记忆,并与感兴趣的小伙伴一起分享。

目录

Unity DOTS

Burst Complier

Native

JobSystem

为什么要用DOTS?

性能高

解耦合

效果演示

资讯


Unity DOTS

Unity DOTS就是Unity官方基于ECS架构开发的一套包含Burst Complier技术和JobSystem技术面向数据的技术栈,它旨在充分利用SIMD,多线程操作充分发挥ECS的优势。

不知道什么是ECS的小伙伴可以转战下文链接:

https://zhuanlan.zhihu.com/p/30538626

Burst Complier

Burst是Unity的一个编译器技术,用于在运行时编译C#代码将之直接转换成Native代码(往常的方式是编译成中间代码,在运行时进行JIT编译成Native代码),以提高性能(因为除去了JIT编译的开销)。
它是基于LLVM技术的,并使用了SIMD指令来加速数学和向量操作。
Burst使用了多种优化技术,例如循环展开、常量传播和内联,以生成高效的机器代码。
Burst还提供了一些工具,例如性能分析器和调试器,以帮助开发人员更好地优化和调试他们的代码。
 

Native

编译是将源代码转换为可执行代码的过程,而编译成Native代码是将源代码编译成与特定硬件平台相关的机器码,以便能够直接在该硬件上运行。Native代码相对于其他形式的代码(如中间代码)具有更高的性能和更好的优化能力,因为它直接针对特定的硬件平台进行优化

JobSystem

C# Job System是Unity从2018开始提供给用户的一个非常强大的功能,它允许用户以一种低成本的方式书写高效的多线程代码,并且内部配合Burst Complier进行SIMD优化。 你可以把JobSystem和Unity的ECS一起用,两者配合可以让为所有平台生成高性能机器代码变得简单。

为什么要用DOTS?

性能高

Unity的官方语言是C#,其数据分为值类型和引用类型。引用类型类似与C/C++的指针。你可以想象这样一个场景,当你进行申请空间的操作时,程序检查内存块,找到一块连续的空间分配给你,这块空间的大小>=你所需要的大小。当你进行若干次操作之后,尽管你的引用(或者说指针)们存放在相连的一块区域(栈区),但是实际上,真正的数据部分,是存放在堆区。它们很有可能东一块、西一块,你之所以能将这些天南地北的数据在同一个代码块中使用,不过只是因为你手中握有它们的地址罢了。

class A{
    public int result;
}
/*
以上是类的定义,以下是代码块
*/

A[] array= new A[] {new A(),new A(),new A() };

array[0].result=0;
array[1].result=1;
array[2].result=2;

 但是,我们都知道,计算机读数据是用代价的。从cache中读数据非常快,但cache很小;从磁盘中读数据非常慢,但磁盘特别大。而内存比较中庸。而基于代码时空局限性的理念: 

  • 时间局部性就是被引用过一次的存储器位置在未来会被多次引用(通常在循环中)
  • 空间局部性就是如果一个存储器的位置被引用,那么将来他附近的位置也会被引用。

cache往往为将刚刚访问的数据,连同其附近的块一起,放入cache中,以提高读写效率。

可是啊,我们刚才说过了,即使你连续申请了多个堆区的空间,但它们很有可能在空间上并不连续的。如上,计算机在访问array[0].result的时候,cache中没有这个数据,它从内存中读进来;而它访问array[1].result的时候,cache中很有可能也没有这个数据,它又得从内存中读进来。

另外,假设你现在要移动一个GameObject的对象gameObject,我们往往只需要访问它的transform的position。但是当你根据其引用去访问内存块的时候,你不仅得到了gameObjec.transform.position,你还得到了gameObject.transform.scale、gameObject.transform.gameObject等,甚至gameObject下其他组件的所有数据,这都是你当前阶段不需要的数据。

而使用DOTS,你采用的是ECS架构,保存的数据属于值类型,它们的空间是连续的,不必在堆区中东一块、西一块地申请。这样,可以极大的提高cache命中率。同时,也不会出现过多的读取不必要数据的情况。

解耦合

耦合性是程序设计中非常重要的一个考虑因素。过高的耦合性会导致不易扩展、不易移植、不易维护、不易开发等多种问题。我们可以通过良好的类设计、委托和事件、逻辑和显示分离等方式降低耦合性。而面向数据同样也是一种降低耦合性的方式。面向数据设计的初衷就是为了解耦合, 你见过谁在设计数据库时出现"耦合度"问题吗?实际上 ECS 的编码过程就是设计数据的过程, 用好数据库的第一第二范式就能设计出相对良好的程序结构, ECS world 里的数据也可以完全和副作用说拜拜。

效果演示

以下项目源码取自Unity官方学习社区课程——《DOTS之路》

以下分别采用了传统面向方式和Unity DOTS来实现201*201个对象规律得进行上下移动。

        面向对象方式

 可以看到,传统方式的帧率在每秒14帧左右。实际上最高也就15.9帧。

 

         DOTS方式

而使用Job System的帧率能达到将近21帧。仅从帧率上分析的话,性能将近提升50%。但是需要注意的是,ECS方式并不能作为提升任意问题的万能药。Job System在处理大量对象相似规律的情况往往能有优异的表现,而在UI以及AI的表现上并不突出。所以是否采用ECS来实现需求,还需要根据实际问题来考虑

资讯

以下有几个有关DOTS和ECS的链接小伙伴们不妨看看:

DOTS1.0更新了什么

 守望先锋ECS架构

 

 

 

Unity DOTS(DOTS: Data-Oriented Technology Stack)是Unity的一种数据导向技术堆栈,它旨在提高游戏性能和可扩展性。它基于实体组件系统(Entity-Component-System,ECS)的概念,其中游戏对象被拆分为实体(Entity)和组件(Component),并通过系统(System)进行处理。 在Unity DOTS中,可以使用实体组件系统来管理和处理游戏对象。通过将游戏对象转换为实体和组件的形式,可以实现高效的数据处理和并行计算。例如,在创建实体时,可以使用GameObjectConversionUtility.ConvertGameObjectHierarchy函数将GameObject转换为Entity,并使用IConvertGameObjectToEntity接口进行自定义转换。然后,可以使用系统(System)对实体和组件进行处理,例如旋转方块事件。 Unity DOTS的优势包括更高的性能,更好的可扩展性和更方便的并行计算。通过采用数据导向的设计,可以减少内存访问和数据处理的开销,从而提高游戏的帧率和响应性。 总而言之,Unity DOTS是一种数据导向的技术堆栈,通过实体组件系统和并行计算来提高游戏性能和可扩展性。它可以通过转换游戏对象为实体和组件的形式,并使用系统进行处理来实现。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [UnityDots技术入门](https://blog.csdn.net/m0_37920739/article/details/108181541)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [Unity DOTS简明教程](https://blog.csdn.net/mango9126/article/details/105219215)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

北方有相思_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值