type
status
date
slug
summary
tags
category
icon
password
OOP大部分人都很熟悉,那DOP呢,其实也就是object变成了data,但DOTS(多线程式数据导向型技术堆栈。)的核心思想就是DOP,这里主要不说DOTS,因为我自己也没用过,但其核心组成就是ECS挺有意思,有点想学,但目前还只停留在了解的阶段。
ECS(Entity-Component-System)
ECS是一种常见的游戏开发架构模式,主要用于管理游戏对象(Entities)、数据(Components)和行为(Systems)。ECS的核心思想是将数据和行为分离,以提高代码的灵活性、可维护性和性能.
- Entity(实体):实体是游戏中的基本对象,通常只是一个唯一的标识符(如整数ID)。实体本身不包含任何数据或行为,它只是一个“容器”,用于关联组件。
- Component(组件):组件是纯粹的数据结构,用于描述实体的某个属性或状态。例如,一个“位置”组件可能包含
x
和y
坐标,一个“生命值”组件可能包含当前生命值和最大生命值。一个实体可以拥有多个组件。
- System(系统):系统是处理逻辑的部分。每个系统负责处理一组具有特定组件的实体。例如,“渲染系统”会处理所有具有“位置”和“渲染”组件的实体,并将它们绘制到屏幕上。
ECS的原理
ECS是一种常见的游戏开发架构模式,主要用于管理游戏对象(Entities)、数据(Components)和行为(Systems)。ECS的核心思想是将数据和行为分离,以提高代码的灵活性、可维护性和性能.
- 创建实体:首先创建一个实体,通常只是一个唯一的ID。
- 添加组件:为实体添加所需的组件。例如,为一个玩家实体添加“位置”、“生命值”、“渲染”等组件。
- 系统处理:系统会遍历所有具有特定组件的实体,并执行相应的逻辑。例如,“移动系统”会遍历所有具有“位置”和“速度”组件的实体,并根据速度更新它们的位置。
简单的ECS示例
核心设计说明:
- 组件 (Component)
- 使用结构体存储数据(值类型更符合ECS内存友好特性)
- 通过
IComponent
接口标记组件类型
- 实体 (Entity)
- 使用字典存储组件集合
- 提供组件查询的泛型方法
- 系统 (System)
- 通过继承抽象类实现具体逻辑
- 在Update中筛选具有特定组件组合的实体
- 世界 (World)
- 统一管理所有实体和系统
- 驱动所有系统的更新
感觉ECS其实比较适合大型复杂的游戏,尤其是有大量的游戏对象的项目,可以用ecs管理其复杂的交互逻辑,同时也适合需要高性能和高灵活性的项目,总之这套开发架构很好用,不过有上手成本,作者本人也还在摸索中~
- Author:lzzd
- URL:https://lazy-zed.com/article/u3d_15
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!