Unity ECS学习(11)

文章讨论了DOTS中Entity的Component修改如何引发内存块的重组(structuralchanges),包括添加或删除Entity、组件以及sharedcomponent的情况。同时介绍了如何通过EntityCommandBuffers来优化Syncpoints的执行,减少游戏性能影响。
摘要由CSDN通过智能技术生成

我们上次提到了DOTS在处理内存的时候是会根据每个entity里的Component区分为不同的Archetype,然后再存储在分配的chunk中,那么问题来了,当我修改了某个entity里面的Component,会发生什么呢?

structural changes

当我们修改了某个entity里面的Component的时候,会重新组织内存块或内存块内容的操作,这个操作被称为structural changes。
那么到底哪些时候会发生structural changes呢

  • 添加或者删除Entity
  • 添加或删除组件
  • 设置shared component内的数值

添加或者删除Entity的时候,相当于 对chunk做了修改,导致需要对chunk里的数据重新排列或者对对应的Archetype添加新的chunk。

添加或删除组件的时候,相当于修改了这个Entity所在的Archetype,甚至会生成的新的Archetype,自然需要对对应的Archetype进行修改,重新排列。

而shared component就有一些特殊了,首先shared component的存储方式和普通的component不太一样,他会独立存储在外部,然后每个使用到该shared component的chunk会有一个指针指向存储位置,然后,当你生成或者修改shared component的时候,会先监测有没有完全相同的shared component存在,如果存在则不生成,我们上面说过了,每个chunk会有一个指针指向对应数值的shared component的存储位置,那当你的entity更改了他的shared component,那就代表当前chunk的shared component和他不同,就需要把他放到对应的chunk里,或者新建chunk进行存储,自然就会触发structural changes。
这个讲解shareComponent的视频还是很清楚直白的,贴到这

后果

当发生structural changes的时候,会发生Sync points,他会停掉你当前所有线程的工作,直到structural changes结束。因为structural changes会导致chunk的重新排布, 可能使已计划的其他作业失效。

解决

我们没办法完全避免structural changes发生,但是我们可以通过修改它的执行时间,让他在所有线程完成后,也就是帧的最后位置去执行,这样,我们的Sync points,就会从每次执行中断的多个,变成帧最后执行的一个。
方法就是通过使用 entity command buffers对需要进行的structural changes进行排队,然后在EntityCommandBufferSystem(每帧开始或最后执行)把所有的structural changes全部执行掉。

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
 一: 什么是ECS?       ECS是一种新的架构模式(当然是针对Unity本身来说),这是一个取代GameObject / Component 的模式。 其模式遵循组合优于继承原则,游戏内的每一个基本单元都是一个实体,每个实体又由一个或多个组件构成,每个组件仅仅包含代表其特性的数据(即在组件中没有任何方法)。系统便是来处理拥有一个或多个相同组件的实体集合的工具,其只拥有行为(即在系统中没有任何数据)。       ECS旨在比GameObject / MonoBehaviour更容易处理大量物体。ECS由于是面向数据的设计,所以很容易并行高速处理,以及与Unity开发的C#JobSystem/Burst Compiler一起工作,从而获取更高的项目运行性能。二:ECS总体发展历史       目前Unity公司由Mike Acton 大佬主持DOD(Data Oriented Design 面向数据设计)的全面改革与推进工作,目的是旨在进一步推进Unity系统本身与Unity项目的执行效率。    ECS总体发展:    A: 在Unity2018引入Entities之前,其实ECS框架早已经出现,但是ECS还是因为守望先锋采用了这个框架才被我们所熟知,后来Git上面出现了一个Entitas的插件可以直接用在Unity上面。Entitas-Unity(有多个语言的port版本,Entitas-Unity下统一称为Entitas) 是 Unity的一个ECS(Entity/Component/System)框架,是在github上面的一个开源项目。    B: 经过Unity公司的认可与改造,目前Unity2018.x 版本已经通过 Package Manager 提供了Unity版本的ECS插件,名称为:“Entities”。    C: Unity2019.x 版本,对“Entities”插件的API进行了进一步改造与完善,以更规范的API实现更加高效的与规范的编程模式。 三:ECS(一)轻松入门篇       本“ECS入门篇”旨在全面讲解ecs 的相关理论与简单Hello World 的编程模式,且通过Unity2018.x与Unity2019.x 两个不同API的编程模式,初步讲解ECS的编程规范与模式规范。        需要进一步学习ECS的小伙伴们,可以关注后续“ECS(二)小试牛刀”篇的进一步讲解。   《Unity ECS(二) 小试牛刀》https://edu.csdn.net/course/detail/27096 
Unity ECS(Entity Component System)是Unity引擎的一种编程范式,它是一种数据驱动的编程模型,它将游戏对象(Entity)分解为数据和行为两个部分,其中数据由组件(Component)来表示,行为则由系统(System)来实现。相对于传统的面向对象编程模型,ECS提供了更高效、更灵活的编程方式,可以有效地提高游戏的性能和扩展性。 下面是我学习Unity ECS时的笔记: ## Entity Entity是ECS中最基本的概念,它表示游戏对象。每个Entity由一个唯一的ID来标识,可以通过EntityManager来创建、销毁、查询和管理Entity。 ## Component Component是Entity的数据部分,用来描述Entity的属性和状态。每个Component包含一些数据成员和一些方法,用来操作这些数据成员。Component是以结构体(struct)的形式定义的,通常只包含数据成员,不包含方法。 ## System System是Entity的行为部分,用来实现游戏逻辑和操作Component。System可以访问和操作EntityManager和Component,但不能直接访问Entity。每个System包含一个或多个Component,表示它所处理的数据类型。System是以类(class)的形式定义的,通常包含一个Update方法,用来实现游戏逻辑。 ## Job Job是一种轻量级的线程,用于并行执行System中的任务。Job可以访问和操作Component,但不能直接访问Entity和EntityManager。Job通常是以结构体(struct)的形式定义的,不包含方法。 ## Archetype Archetype是Entity的集合,包含一组具有相同Component类型的Entity。Archetype可以用来优化数据的访问和处理,可以在不同的System之间共享。 ## Chunk Chunk是Archetype中的数据块,包含一组连续的Entity和它们的Component数据。Chunk可以用来优化内存的分配和访问,可以在Job中进行并行处理。 ## Buffer Buffer是一种Component类型,用来存储可变长度的数据,例如数组或列表。Buffer可以在System和Job中进行修改和访问。 以上是我学习Unity ECS时的笔记,希望对你有所帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值