Unity ECS学习笔记(4)(Chunk)和原型(Archetype)

最近在学习unity的ecs框架,转载几篇写的比较好的文章帮助理解

原文日期 2019-12-5 避免误导未来使用正式版的开发者。

 

1.块(Chunk)

什么是块(Chunk),这是一个很重要的概念。

先来看看一张官方的图:

我们有三个实体:

EntityA:包含了Translation、Rotation、LocalToWorld、Render四个组件。

EntityB:包含了Translation、Rotation、LocalToWorld、Render四个组件。

EntityC:包含了Translation、Rotation、LocalToWorld三个组件。

 

这些组件是什么意思大家不用管,但是,很明显的,EntityA和EntityB拥有的组件是一模一样的。

在ECS中,底层会把这些拥有相同组件的实体放在一起,也就是我们所说的内存块(Chunk)。

这涉及到一种”反正我也听不懂”的原理,把相同类型的数据连续存放在一块内存里,会提高提取数据的效率。

这个”反正我也听不懂”原理是什么呢?大家感兴趣的可以移步官方文档:

https://docs.unity3d.com/Packages/com.unity.entities@0.3/manual/ecs_core.html

本系列是入门教程,不会有过多的原理解说。

OK,于是,EntityA和EntityB是放在一个块(Chunk)里的,而EntityC则放在另一个块(Chunk)里。

这种分块的概念,大家以后会一直接触,因为这是很重要的东西。

 

优点:与同样使用Jobs系统的上一篇案例不同的是,在循环遍历的时候,前者迭代的是实体,而这个案例迭代的是块。内存块,这个块是被一开始基于相同原型分配好了的,也就是说,如果这20个实体有相同的组件,那么他们会被紧密的安排在一、块内存中,从而方便处理器进行操作。这是相对于面向对象的散列内存而言的,在面向对象中要操作内存中的某个对象时,你不得不在整个内存中寻找它,这样会降低读取速度,也不方便批量操作。ECS则会非常紧密地分配实体在内存中的位置,相同的组件会被统一放在块中,读取速度快,也方便批量操作。

 

2.原型(Archetype)

有了块(Chunk)的概念后,很自然地就会有分类的概念了。

来张更厉害的图:

我们刚刚说到,对于组件完全相同的那些实体,会放在一个块(Chunk)里。

但是,块的大小是有上限的,当某个块里的实体数量达到某个程度时,就不能再增加了。

这时候怎么办?简单了——再开一个块(Chunk)。

比如上面那张图,一共有三个块,其实这三个块里存放的都是拥有相同组件的实体,只不过数量太多,所以分开存放到不同的块里了。

而这是存放相同组件的实体的所有块,都属于同一个类型,也就是官方所说的原型(Archetype)。

某个原型(Archetype)下的所有块(Chunk),它们都存放了相同组件的实体。

实际上,原型(Archetype)更多的是一种概念,实际在写代码的过程中,我们可能没法直接对原型进行操作。

对于某种原型下的所有块,它们的大小是一样的。

相当于预先申请了内存空间,不管塞没塞满,都占用一样的内存空间,一个块塞满之后,就又申请一个新的空的块。

好了,本篇就介绍这么多。

 

注意,本系列教程基于DOTS相关预览版的Package包,是预览版,不代表正式版的时候也适用。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
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 ChunkArchetype中的数据块,包含一组连续的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、付费专栏及课程。

余额充值