ECS
ECS
ContinECS(Entity Component System)
ECS 是一种软件架构模式,由三个元素组成:实体 (Entity)、组件 (Component) 和系统 (System)。游戏程序分为这三个主要元素,并且通过定义每个系统的责任和关系来管理游戏。
主要元素
实体(Entity)
- 代表游戏世界中的事物。
- 实体本身没有特定功能,通过组件来定义其功能。
- 可以将实体看作一个什么都没有的 GameObject。在 Unity 中,GameObject 含有 Transform 组件,这里可以将其看作没有 Transform 的 GameObject。
组件(Component)
- 附加到事物的数据,包含状态信息。
- 重点是数据,极致的数据,没有任何方法和逻辑,只包含数据。
- 例如,在移动游戏角色时,位置、速度等每个状态都将成为一个组件部分,并与称为“角色”的实体相关联。
- 修改角色状态时,只需要修改其单独的数据组件,不会触碰角色的逻辑。
系统(System)
- 处理数据的系统,其中只有方法,没有任何数据。
- 例如,在移动角色时,速度、位置等数据都存放在组件中,通过遍历实体的组件来修改数据。
世界(World)
- 世界是实体的集合,实体 ID 在世界中是唯一的。
- 世界包含一组实体、组件和系统,是一个独立的环境。
- 世界负责系统的运行,在开发中可以创建多个世界,每个世界都是独立的,互不影响,但往往一个世界就足够了。
原型(Archetypes)
- 由一组组件类型(Component Types)构成,表示具有相同组件集合的实体的类型。
- 频繁的更改组件会导致程序性能降低。
结构变化
- 创建销毁实体、添加删除组件、设置共享组件都会导致结构变化。
- 结构变化可能会导致大量资源占用,影响性能,只能在主线程中操作。
ECS 的好处
1. 模块化设计
- 组件化:ECS 将对象的特性分解为独立的组件,每个组件只包含特定的属性和数据。这种模块化设计使得代码更易于维护和扩展。
- 系统分离:系统包含操作组件的逻辑,分离了数据和行为。这种分离提高了代码的可重用性和灵活性。
2. 高性能
数据局部性:ECS 通过将相同类型的组件数据连续存储在内存中,提高了 CPU 缓存的命中率,从而优化了性能。
- CPU 在读取数据时,首先会去 CPU 缓存中寻找。如果缓存中没有需要的数据,就会去内存中查找。访问内存的速度比访问缓存的数据慢很多,因此为了提高缓存命中率,避免频繁去内存中查找,我们尽量使用连续的数据结构进行处理。
并行处理:ECS 将逻辑分散在多个独立的系统中,可以更容易地实现并行处理,提高多线程环境下的性能。
3. 灵活性和可扩展性
- 动态行为:通过添加或移除组件,可以动态改变实体的行为。这种灵活性使得 ECS 特别适合处理复杂的游戏逻辑和仿真场景。
- 可扩展性:可以轻松添加新的组件和系统,而不会对现有代码造成破坏。
4. 简化的状态管理
- 明确的状态分离:ECS 将状态信息存储在组件中,系统只负责处理相关的逻辑。这使得状态管理更清晰、更易于调试。
评论
匿名评论隐私政策