【DOTS学习笔记】DOTS中的ECS架构与概念术语

目录

  • 前言
  • Entity-Component-System
    • 游戏引擎架构演变
  • DOTS1.0中的ECS
  • DOTS下关于ECS的专有名词
  • Entities and Components术语


前言


本文是Metaverse大衍神君的《DOTS之路》系列课程的学习笔记

Entity-Component-System


  • 实体组件系统(ECS)架构
    • 遵循组合优于继承的原则
    • 面向数据设计
    • 弱耦合
    • 常被应用在游戏开发上

游戏引擎架构演变

【DOTS学习笔记】DOTS中的ECS架构与概念术语_第1张图片

  • 基于对象继承的架构
    • 早期的游戏引擎或游戏架构多以此方式来组织
    • UE3之前的版本就是用这种架构

【DOTS学习笔记】DOTS中的ECS架构与概念术语_第2张图片

  • 基于Actor-component对象组合架构
    • Actor为容器,具体功能为具体的component来负责
    • 对象几乎没有多态,做到了对象间的解耦
    • Unity、UE3之后的版本都是这种架构

【DOTS学习笔记】DOTS中的ECS架构与概念术语_第3张图片

  • 基于ECS的面向数据设计架构
    • ECS架构的本质组合的数据数组而非对象数组
    • Entity
      • 虽然名为实体,但并非对象
      • 也不是一个容器
      • 是一个对象索引的id或标识符
      • 不包含任何数据与逻辑
    • Component
      • 它才是容器
      • 但并非对象容器,仅是一个数据容器
      • 其中不包含任何逻辑
    • System
      • 负责对数据进行操作
      • 对具有特定组件的特定实体执行的操作

DOTS1.0中的ECS

  • ECS架构一直在演变
  • 应用场景不同,各家实现和工作流有差异
  • DOTS1.0中的ECS与老版本变化较大,不要看老资料
  • 开放心态去接受

DOTS下关于ECS的专有名词

【DOTS学习笔记】DOTS中的ECS架构与概念术语_第4张图片

  • Archetypes(原型)

    • 依然不是个对象,依然是一个标识符
    • 表示的是所有具有相同Component的组合的实体类型
    • 如图EntityA与EntityB的组件完全相同则他们共享一个原型
    • 而EntityC比EntityA和EntityB缺少了RigidBody这个Component所以它属于另外一个原型
    • 这里可以将原型理解为不同的Entity在内存上的layout布局
    • 如下图所示的26个Entity被分为了8种原型
      【DOTS学习笔记】DOTS中的ECS架构与概念术语_第5张图片
      【DOTS学习笔记】DOTS中的ECS架构与概念术语_第6张图片
  • Archetype Chunk

    • 每个Archetype所标记的内存会被分成固定大小连续的非托管内存块,被称为Chunk
    • Chunk中包含共享同一原型的实体组件数组
    • 默认设置下,每个Chunk为16kb
      • 如果实体组件数组填充不满的情况下,也要有留白
    • 存在的目的
      • 方便数据做并行计算
      • 方便做缓存的Prefetch
      • 在数据对齐的同时又可以匹配缓存的Cache Line
      • 无论使用主线程查询工作线程并行查询还是按Chunk查询
        • 都可以利用其在Component的数组纵向维度上分块对齐的方式来做Slice切片
    • 总之,它是面向缓存友好的重要概念
  • World

    • 是一系列Entity的组合
    • 每一个Entity在一个World中是唯一的,统一受到World中的EntityManager结构的管理
  • EntityManager

    • 负责创建、销毁、修改世界中的实体
  • Structural Change

    • 所有导致需要重新组织内存块或内存块内容的操作都称为Structural Change
      • 改变结构
      • 改变内容
      • 这两种改变都只能在主线程中做,不能在工作线程中做
      • 是资源密集类型的操作,效率很差
      • 例如:
        • 添加或删除一个Entity对应的组件导致所属原型发生变化就属于Structural Change
        • 创建或销毁Entity实体,设置Shared Component的值也会被视为Structural Change
    • 要尽量避免
    • 当我们明确我们一定不会有Structural Change的操作时
      • 可以在编辑时做Baked操作
        • 虽然会降低运行时的逻辑灵活性
        • 但会提高运行时效率
          【DOTS学习笔记】DOTS中的ECS架构与概念术语_第7张图片
          【DOTS学习笔记】DOTS中的ECS架构与概念术语_第8张图片
          【DOTS学习笔记】DOTS中的ECS架构与概念术语_第9张图片

Entities and Components术语

  • Entity
  • Component
  • World
  • EntityManager
  • Archetype
  • Chunk
  • Structural change
  • Backing
    • SubScene
    • Baker
    • Authoring component
    • Baking system
  • Query
    • Shared component filter
    • Version filtering
  • QueryBuilder
  • SystemAPI
    • SystemAPI.Query
  • ISystem
  • BlobAssets
  • SystemBase
  • Entities.ForEach(EFE)
  • Prefab entity(a.k.a. Entity prefab)
  • Lookup
  • Singleton component
  • EntityStorageInfo
  • EntityCommandBuffer(ECB)
    • Temporary Entities
    • EntityCommand

你可能感兴趣的:(DOTS学习笔记,架构)