@dcl/ ecs (中文(简体) )
Decentrand场景的核心实体组件系统包。 执行基于 CRDT 的ECS 架构,用于网络化场景状态.
安装
npm install @dcl/ecs
使用量
import { engine } from '@dcl/ecs'
// Create entity
const entity = engine.addEntity()
// Define and add component
const Health = engine.defineComponent(1, {
current: Number,
max: Number,
regeneration: Number
})
Health.create(entity, {
current: 100,
max: 100,
regeneration: 1
})
// Create system
engine.addSystem((dt: number) => {
for (const [entity, health] of engine.mutableGroupOf(Health)) {
if (health.current < health.max) {
health.current = Math.min(health.max, health.current + health.regeneration * dt)
}
}
})
技术概览
定义
构件以独特的ID和计划来定义. 计划用于:
- 生成类型脚本
- 创建二进制序列器/ 剪接器
- 设置 CRDT 操作
CRDT 执行
ECS使用 CRDTs(无冲突重复数据类型),可以在多个引擎实例中实现确定状态更新:
- 组件更新是带有逻辑时间戳的 CRDT 操作
- 通过交换 CRDT 操作可以同步多个引擎实例
- 解决冲突使用时间戳和实体身份证,以确保一致性
- 二进制传输格式最小化网络间接费用
网络实体
对于多人场景 syncEntity 方法标记各个同行之间应当同步的实体.
在背景中,它创建了一个网络实体和一个同步组件,并配有通过网络同步实体所需的所有信息.
import { engine, NetworkEntity } from '@dcl/ecs'
// Create a networked entity
const foe = engine.addEntity()
NetworkEntity.create(foe)
// Components on this entity will be synced across peers
Health.create(foe, { current: 100, max: 100, regeneration: 1 })
每个对等方都维持自己的引擎实例. 使用网络实体时 :
- 拥有者同伴可以修改实体的组件
- 其他同行收到只读的复制件
- 利用CRDT操作通过网络传输层传播更新
示例运输信息:
{
entityId: number
componentId: number
timestamp: number
data: Uint8Array // Serialized component data
}
性能特征
- 零分配组件
- 用于高效更新的肮脏状态跟踪
- 网络运输二进制序列化
- 断层部分业务
发展
# Build
make build
# Test
make test
# Clean and reinstall
make clean && make install