UNITY笔技--DOTS/ECS

DOTS

Data-Oriented Technology Stack (DOTS, 数据导向型技术栈) ,其包含了 C# Job System、the Entity Component System (ECS) 和 Burst,是基于ECS架构开发的一套包含Burst Complier技术和JobSystem技术面向数据的技术栈,它旨在充分利用SIMD,多线程操作充分发挥ECS的优势。

ECS现状

ECS(Entity Component System) 出来好久了,不过 至今20220426 还一直在频繁更新(preview)中,据说就快稳定了,参考DOTS Development Status And Next Milestones

  • Unity 2020 LTS and Unity 2021 LTS 及以下:Entities 0.50;
  • 2022 Tech Stream :Entities 1.0 (还未发布),与0.5x 会有巨大不同。

EntityComponentSYSTEM

ECS安装(0.50)

  • Package installation

    • Add package from git URL… , “com.unity.entities”;
    • Edit the Packages\manifest.json .
  • IDE support

    • Entities 0.50 uses the Microsoft Source Generator feature for its code generation. Because of this, you should use an IDE that’s compatible with source generators. Previous IDE versions might experience slow-downs or mark valid code as errors. The following IDEs are compatible with source generators:
      • Visual Studio 2022+
      • Rider 2021.3.3+
  • 打包

ECS原理

ECS为什么会快

计算机组成原理前置知识

  • 首先明确几个知识点
    CPU处理数据的速度非常快,往往会出现CPU处理完数据在那干等着的情况,所以需要设计能跟上CPU的高速缓存区来尽量保证CPU有事干,同时也提高了数据访问效率。CPU自身有三级缓存,俗称高速缓存,CPU访问第一级(L1)缓存最快,容量最小,第三级(L3)缓存最慢,容量最大。我们常说的内存是指CPU拿取数据的起源点,CPU访问内存所需的时钟周期远大于访问高速缓存所需的时钟周期。CPU操作数据会先从一,二,三级缓存中取得数据,速度非常快,尤其在一级缓存处速率基本可以满足CPU的需求(即不让CPU歇着),但是有些情况下我们请求的数据不在这三级缓存中(即Cache Miss,实际上如果没有在一级缓存中找到数据都算作是Cache Miss,但是在高速缓存中的CacheMiss惩罚并不严重,所以这里说的Cache Miss指的是高级缓存全部没有命中,需要从内存取数据的过程),就需要寻址到内存中的数据(包含这个数据的一整块数据都将被存入缓存),并且把目标数据放到高速缓存中,提高下一次的访问速度(因为这一次调用的数据块往往在不久的将来还会用到)。
  • ECS的数据组织与使用形式
    ECS架构在执行逻辑时,只会操作需要操作的数据:System在操作数据的时候只会收集它关心的Component数据,CPU运行时就会将这一整块内存装入高速缓存中,这样就减少了Cache Miss次数,增加了缓存命中率,整体上提高了程序效率。对于此部分更加详细的内容参见:浅谈Unity ECS(二)Uniy ECS内存管理详解:ECS因何而快 此外现代CPU中的使用数据对齐的先进技术(自动矢量化 即:SIMD)与这种数据密集的架构相性极好,可以进一步提高性能。
  • ECS有什么优势
    对比传统的面向对象编程,ECS模式无疑更加适合现代CPU架构,因为它可以做到高效的处理数据而不用把多余的数据字段存入宝贵的缓存从而导致多次Cache Miss。 举个例子就是传统模式下我们操作Unity对象的Position属性,他会把GameObject所有相关数据都加入缓存,浪费了宝贵的缓存空间。 而如果在ECS模式下,将只会把Position属性集放入内存,节省了缓存空间,也一定程度上减少了Cache Miss,即常说的提高缓存命中率。
  • ECS在实践中真有那么神吗
    我的答案是否定的,或许它的理念是没有问题,甚至是完美的,但是当理论应用到实践,就会有很多想不到的问题暴露出来
    • 内存管理,其中包括内存的分配,回收和内存对齐,这是最重要的一点,如果没有做到良好的内存管理,就没有办法享受到ECS的高性能,可以看看Unity ECS为内存管理做了多少事情(Archetype的chunk内存分配都是以指针+unsafe代码的方式进行的);
    • 编码规范,代码必须是无引用的形式,不然就会破坏Cache友好,这也是为什么Unity ECS的Component中的数据不支持引用类型的一个重要原因之一,但是无引用的形式势必会导致一些烦恼,比如自己处理数据的拷贝和移动;
    • 如果没有做到上面两点,基本上性能和传统OOP没有什么区别,这就是把ECS当成一个编程范式,这当然也是极好的,它比组件式编程更上一层楼,更利于解耦和维护;
    • 开发思想的转变,从OOP到ECS思路需要有很大的转变,在OOP下,A对B发起攻击,就是一个Utility函数处理这个过程,但是在ECS下,你得提供一个专门用来伤害处理的数据类Component与一个System,在System里进行所有此类Component的收集与处理

思维导图

desc

示例

几个术语

  • concurrency 并发,是指能处理多个同时性活动的能力,并发事件之间不一定要同一时刻发生;
  • parallelism 并行是指 同时 发生的两个并发事件,具有并发的含义,而并发则不一定并行。
  • Custom Job Type 自定义Job类型,默认JobType仅为Single和ParallelFor(包括ParallelForBatch,分批执行),
  • JobReflectionData :a pointer to the data which will be copied to the jobs.because the native code which uses it does not know about the type?镜像数据
       JobsUtility.CreateJobReflectionData(typeof(T), JobType.ParallelFor, (ExecuteJobFunction)Execute);
    
  • JobRanges contain the batches and indices a ParallelFor job is supposed to process
  • Work stealing in this context means that when one job is done it will look at the other jobs running and see if any of them still have a lot of work left. If it finds a job which is not complete it will steal some of the batches that it has not yet started; to dynamically redistribute the work.如果当前workthread已完成,而其他workthread未完成,会窃取部分未开始的批次来执行。
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值