旧系统执行逻辑:
程序开发中有一个很经典的设计模式/框架 :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/com.unity.burst@0.2/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的文件夹。 这部分就像你在幕后做的那样。
即使它有库存,我也会在没有大问题的情况下重新制作它。