ECS 图解

旧系统执行逻辑:

程序开发中有一个很经典的设计模式/框架 :MVC

vc 部分是系统, m 是组件。

我通过名为 index 的索引访问此数据:

现在该组件具有用于读取和写入该数据的数据。

看看源代码中的Entity 。 struct 结构体。 64位索引 (2个32 位 int)。

Index :

实体的ID。

进入内部实体列表的索引。

实体索引在销毁实体时被回收。 销毁实体时,EntityManager会增加版本标识符。 要表示同一实体,Entity对象的Index和Version字段必须匹配。 如果索引相同,但版本不同,则实体已被回收。

Version:

实体的世代版本。generational version

理论上,版本号可以在应用程序的生命周期内溢出和环绕overflow and wrap。 因此,您不能假设具有较大版本的Entity实例是具有较小版本(和相同索引)的实体的最新版本。 用于确定此Entity对象是否仍标识现有实体。

下图是包含内部 组件 。

ECS 也肯定有Update , 比如从t 帧到 t +1 帧

下图就是这一帧之间, 比如 Position和Rotation, Rotation和 Renderer 的两个系统处理

Job 的引入:

如果是四核机器就可以利用起来: 比如之前 JCS 任务都是在主线程上。

接下来是Burst :

https://docs.unity3d.com/Packages/[email protected]/manual/index.html#overview

Burst是一个编译器,它使用LLVM将IL / .NET字节码转换为高度优化的本机代码。

Burst主要用于与Job系统高效协作。

分析Burst生成的程序集: https://gametorrahod.com/analyzing-burst-generated-assemblies/

要更详细的了解这个技术? https://www.youtube.com/watch?v=QkM6zEGFhDY

获得Burst Compiler的幕后花絮。了解从称为High Performance C#的IL / .NET子集生成更好的本机代码所面临的挑战。了解如何开发和测试Burst,它可以带来什么样的优化,以及如何通过使用面向数据的编程方法在项目中利用它。您还将深入了解我们正在做些什么来改进它。演讲者:Alexandre Mutel(Unity Technologies)

ECS 游戏实践最好的是 守望先锋 GDC上的分享:

https://www.youtube.com/watch?v=W3aieHjyNvw

摩尔定律,集成电路的速度:

每24个月翻一番。 CPU以惊人的速度变得很快。 但是现在内存好像成为了瓶颈。

所以数据很重要, 具体说是数据命中高级缓存的 几率很重要。

在移动设备 怎么才能减少热量? CPU 和 GPU 计算。

只要提高性能就可以。

Demo时间, 随机生成1000个cube 比较两种方式的性能。 是否开启Burst, JobSystem 的差别。

因为是Package, 相当于开放源代码:

整体结构, 两个World之间是独立的, 不能别的World的child, 实体只是一个索引。

Archetype 我个人理解这个原型很像Prefab,通过它可以复制无限多个一模一样的副本。 类似于设计模式中的原型模式。

不一样的是, 他是一个链表。 每个单位16千字节的块(就是 Entity)。

特殊的组件 SharedComponent 共享组件。

比如实体中共享组件 AABB

对 World 的更多解释: Initialization, Simulation, Presentation 初始化,模拟,演示, 这三个是什么东西?

三个更新函数处理时机。

每个系统组都有两个缓冲区 和 一个 BIG&ENTITY命令缓冲区。

什么是命令缓冲区?

当我运行某些东西时, 它不完全时结果,而是命令

下面是系统的属性 , 在系统中可以控制顺序 ,

UpdateBeforeAttribute/UpdateAfterAttribute : 在系统之前或之后更新会限制ComponentSystemGroup中这些系统的调度程序排序。

before和after系统都必须是同一ComponentSystemGroup的成员。

下两个两个属性又会发生什么?

UpdateInGroup : 指定的Type必须是ComponentSystemGroup。

在组中更新意味着该系统将由指定的ComponentSystemGroup自动更新。

系统可以使用UpdateBegin和UpdateEnd相对于组中的其他系统进行自我排序,

没有什么可以防止系统出现在多个组中,如果有一个用例,可以添加它

在EntityDebug中可以看到顺序: 和结构:

entity 命令(Command)现在是一个实体缓存 缓冲区, 位于两端, 上图中的 CommandBuffer 结尾的。

Query List : Read Write , Read Only , Exclude

Chuck 现在是绿色和红色? 绿色表示 我要读写这些数据。

蓝色表示 领导姐妹数据, 红色是不包含在内。

Chunk Info : Archetype组成: 8 bytes 大小, PlayerComponent (4bytes)

1338是什么? 如果我将这些数据格式化16k bytes ,我会放几个? Chunk Utilization:块利用率

现在,即使你没有神奇的形状,你也会有一个名为 Entity Cache的文件夹。 这部分就像你在幕后做的那样。

即使它有库存,我也会在没有大问题的情况下重新制作它。

猜你喜欢

转载自blog.csdn.net/s178435865/article/details/129420217
ECS
今日推荐