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

最近在学习unity的ecs框架,转载几篇写的比较好的文章帮助理解
原文日期 2019-12-5 避免误导未来使用正式版的开发者。

1.块(Chunk) 什么是块(Chunk),这是一个很重要的概念。
先来看看一张官方的图:
Unity|Unity ECS学习笔记(4)(Chunk)和原型(Archetype)
文章图片

我们有三个实体:
EntityA:包含了Translation、Rotation、LocalToWorld、Render四个组件。
【Unity|Unity ECS学习笔记(4)(Chunk)和原型(Archetype)】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)的概念后,很自然地就会有分类的概念了。
来张更厉害的图:
Unity|Unity ECS学习笔记(4)(Chunk)和原型(Archetype)
文章图片

我们刚刚说到,对于组件完全相同的那些实体,会放在一个块(Chunk)里。
但是,块的大小是有上限的,当某个块里的实体数量达到某个程度时,就不能再增加了。
这时候怎么办?简单了——再开一个块(Chunk)。
比如上面那张图,一共有三个块,其实这三个块里存放的都是拥有相同组件的实体,只不过数量太多,所以分开存放到不同的块里了。
而这是存放相同组件的实体的所有块,都属于同一个类型,也就是官方所说的原型(Archetype)。
某个原型(Archetype)下的所有块(Chunk),它们都存放了相同组件的实体。
实际上,原型(Archetype)更多的是一种概念,实际在写代码的过程中,我们可能没法直接对原型进行操作。
对于某种原型下的所有块,它们的大小是一样的。
相当于预先申请了内存空间,不管塞没塞满,都占用一样的内存空间,一个块塞满之后,就又申请一个新的空的块。
好了,本篇就介绍这么多。

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

    推荐阅读