advance

Aspect

RotationSystem.cs

  • Aspect 是一些 Component 的组合

  • 算是一个语法糖

  • 当 Query Asect 的时候相当于同时 Query 这些 Component

  • 起到一个封装的作用, 基本没什么用

structure-change

ReparentingSystem.cs

ecs 结构改变需要非常的谨慎

  • 在遍历过程中禁止结构改变

  • 在多线程并发时禁止结构改变

所以, 在很多并发或遍历 API 里不支持结构改变,

  • 结构改变的实现最基础的方式是用 EntityManager 写在主线程里

  • 更好点的方式是用 ecb 在多线程里记录操作, 在 playback 统一处理结构体改变

  • 再好一点是所有 system 的操作都用同步点 system 的 ecb 处理

Hybird

GameObjectSync

  • 混合使用 ECS 和 GameOjbect

  • 通常是将 ECS 的数据同步给 GameObject 并渲染

ecs 控制 GameObject 方式

Init System 创建 ManagedComponentData 持有 GameObject

Simulate System Query ManaedComponentData 并更新

JobQuery

CollisionSystem.cs

JobQuery 中有一些特别的用法

JobEntity

MoveProjectilesSystem.cs

MovementSystem.cs

LocalToWorld2DSystem.cs

在 Job 里通过指针读写数据, 而不是 NativeArray

ComputeChildLocalToWorldJob 基本用到了所有常用的 Job 使用方式

ComponentLookup 通过多线程读取和写入

特指 chunk 中符合筛选标准的 entity

  • System 写入 Chunk 时会将全局最新的 Version 写入 Chunk

  • 在 System 更新自己 Version 到全局最新 Version 前, 检查如果 Chunk 的 Version 比自己大, 说明 Chunk 有最新数据而自己没有处理过

ComponentData 两种获取方式

TypeHandle 方式效率比 Lookup 高

Buffer 两种获取方式

三种 Entity 状态改变方案

  • 值改变

  • Set Enable

  • 结构改变

搜索距离最近的 Entity

  • 遍历

  • 基于轴的排序和二分搜索

  • KD 树

同时使用了优先队列数据结构

NativePriorityHeap.cs

最后更新于

这有帮助吗?