@esengine/ecs-framework 2.1.15 → 2.1.17
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +288 -193
- package/index.d.ts +230 -537
- package/index.js +1 -1
- package/index.js.map +1 -1
- package/index.umd.js +1 -1
- package/index.umd.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -3,53 +3,45 @@
|
|
|
3
3
|
[](https://badge.fury.io/js/%40esengine%2Fecs-framework)
|
|
4
4
|
[](https://opensource.org/licenses/MIT)
|
|
5
5
|
|
|
6
|
-
|
|
6
|
+
TypeScript ECS (Entity-Component-System) 框架,专为游戏开发设计。
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
> 🤔 **什么是 ECS?** 不熟悉 ECS 架构?建议先阅读 [ECS 架构基础](docs/concepts-explained.md#ecs-架构基础) 了解核心概念
|
|
9
9
|
|
|
10
|
-
|
|
11
|
-
- 📡 **类型安全事件系统** - 增强的事件总线,支持异步事件、优先级、批处理和装饰器
|
|
12
|
-
- ⏰ **定时器管理系统** - 完整的定时器管理,支持延迟和重复任务
|
|
13
|
-
- 🔍 **智能查询系统** - 支持复杂的实体查询,流式API设计
|
|
14
|
-
- ⚡ **高性能优化** - 组件索引、Archetype系统、脏标记机制三重优化
|
|
15
|
-
- 🛠️ **开发者友好** - 完整的TypeScript支持,丰富的调试工具
|
|
16
|
-
- 📦 **轻量级设计** - 最小化依赖,适用于各种游戏引擎
|
|
10
|
+
## 特性
|
|
17
11
|
|
|
18
|
-
|
|
12
|
+
- 🔧 **完整的 TypeScript 支持** - 强类型检查和代码提示
|
|
13
|
+
- 📡 **[类型安全事件系统](docs/concepts-explained.md#事件系统)** - 事件装饰器和异步事件处理
|
|
14
|
+
- 🔍 **[查询系统](docs/concepts-explained.md#实体管理)** - 流式 API 和智能缓存
|
|
15
|
+
- ⚡ **[性能优化](docs/concepts-explained.md#性能优化技术)** - 组件索引、Archetype 系统、脏标记
|
|
16
|
+
- 🎯 **[实体管理器](docs/concepts-explained.md#实体管理)** - 统一的实体生命周期管理
|
|
17
|
+
- 🧰 **调试工具** - 内置性能监控和调试信息
|
|
18
|
+
|
|
19
|
+
> 📖 **不熟悉这些概念?** 查看我们的 [技术概念详解](docs/concepts-explained.md) 了解它们的作用和应用场景
|
|
20
|
+
|
|
21
|
+
## 安装
|
|
19
22
|
|
|
20
23
|
```bash
|
|
21
24
|
npm install @esengine/ecs-framework
|
|
22
25
|
```
|
|
23
26
|
|
|
24
|
-
##
|
|
27
|
+
## 快速开始
|
|
25
28
|
|
|
26
|
-
###
|
|
29
|
+
### 基础设置
|
|
27
30
|
|
|
28
31
|
```typescript
|
|
29
|
-
import { Core,
|
|
32
|
+
import { Core, Scene, Entity, Component, EntitySystem } from '@esengine/ecs-framework';
|
|
30
33
|
|
|
31
|
-
//
|
|
32
|
-
const core = Core.create(true); //
|
|
34
|
+
// 创建核心实例
|
|
35
|
+
const core = Core.create(true); // 调试模式
|
|
33
36
|
|
|
34
37
|
// 创建场景
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
// 场景初始化逻辑
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
// 在游戏循环中更新框架
|
|
42
|
-
function gameLoop() {
|
|
43
|
-
Core.emitter.emit(CoreEvents.frameUpdated);
|
|
44
|
-
}
|
|
38
|
+
const scene = new Scene();
|
|
39
|
+
Core.scene = scene;
|
|
45
40
|
```
|
|
46
41
|
|
|
47
|
-
###
|
|
42
|
+
### 定义组件
|
|
48
43
|
|
|
49
44
|
```typescript
|
|
50
|
-
import { Component, Entity } from '@esengine/ecs-framework';
|
|
51
|
-
|
|
52
|
-
// 定义组件
|
|
53
45
|
class PositionComponent extends Component {
|
|
54
46
|
constructor(public x: number = 0, public y: number = 0) {
|
|
55
47
|
super();
|
|
@@ -62,18 +54,37 @@ class VelocityComponent extends Component {
|
|
|
62
54
|
}
|
|
63
55
|
}
|
|
64
56
|
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
57
|
+
class HealthComponent extends Component {
|
|
58
|
+
constructor(
|
|
59
|
+
public maxHealth: number = 100,
|
|
60
|
+
public currentHealth: number = 100
|
|
61
|
+
) {
|
|
62
|
+
super();
|
|
63
|
+
}
|
|
64
|
+
}
|
|
69
65
|
```
|
|
70
66
|
|
|
71
|
-
###
|
|
67
|
+
### 创建实体
|
|
72
68
|
|
|
73
69
|
```typescript
|
|
74
|
-
|
|
70
|
+
// 基础实体创建
|
|
71
|
+
const player = scene.createEntity("Player");
|
|
72
|
+
player.addComponent(new PositionComponent(100, 100));
|
|
73
|
+
player.addComponent(new VelocityComponent(5, 0));
|
|
74
|
+
player.addComponent(new HealthComponent(100, 100));
|
|
75
75
|
|
|
76
|
+
// 批量创建实体
|
|
77
|
+
const enemies = scene.createEntities(50, "Enemy");
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
### 创建系统
|
|
81
|
+
|
|
82
|
+
```typescript
|
|
76
83
|
class MovementSystem extends EntitySystem {
|
|
84
|
+
constructor() {
|
|
85
|
+
super();
|
|
86
|
+
}
|
|
87
|
+
|
|
77
88
|
public process(entities: Entity[]) {
|
|
78
89
|
for (const entity of entities) {
|
|
79
90
|
const position = entity.getComponent(PositionComponent);
|
|
@@ -91,236 +102,320 @@ class MovementSystem extends EntitySystem {
|
|
|
91
102
|
scene.addEntityProcessor(new MovementSystem());
|
|
92
103
|
```
|
|
93
104
|
|
|
94
|
-
###
|
|
105
|
+
### 游戏循环
|
|
106
|
+
|
|
107
|
+
ECS框架需要在游戏引擎的更新循环中调用:
|
|
108
|
+
|
|
109
|
+
```typescript
|
|
110
|
+
// 统一的API:传入deltaTime
|
|
111
|
+
Core.update(deltaTime);
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
**不同引擎的集成示例:**
|
|
115
|
+
|
|
116
|
+
```typescript
|
|
117
|
+
// Laya引擎
|
|
118
|
+
Laya.timer.frameLoop(1, this, () => {
|
|
119
|
+
const deltaTime = Laya.timer.delta / 1000; // 转换为秒
|
|
120
|
+
Core.update(deltaTime);
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
// Cocos Creator
|
|
124
|
+
update(deltaTime: number) {
|
|
125
|
+
Core.update(deltaTime);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
// Unity (C#)
|
|
129
|
+
void Update() {
|
|
130
|
+
Core.Update(Time.deltaTime);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
// 原生浏览器环境
|
|
134
|
+
let lastTime = 0;
|
|
135
|
+
function gameLoop(currentTime: number) {
|
|
136
|
+
const deltaTime = lastTime > 0 ? (currentTime - lastTime) / 1000 : 0.016;
|
|
137
|
+
lastTime = currentTime;
|
|
138
|
+
Core.update(deltaTime);
|
|
139
|
+
requestAnimationFrame(gameLoop);
|
|
140
|
+
}
|
|
141
|
+
requestAnimationFrame(gameLoop);
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
## 实体管理器
|
|
145
|
+
|
|
146
|
+
EntityManager 提供了统一的实体管理接口:
|
|
95
147
|
|
|
96
148
|
```typescript
|
|
97
149
|
import { EntityManager } from '@esengine/ecs-framework';
|
|
98
150
|
|
|
99
|
-
// 使用EntityManager进行高级查询
|
|
100
151
|
const entityManager = new EntityManager();
|
|
101
152
|
|
|
102
|
-
//
|
|
103
|
-
const
|
|
153
|
+
// 流式查询 API
|
|
154
|
+
const results = entityManager
|
|
104
155
|
.query()
|
|
105
156
|
.withAll(PositionComponent, VelocityComponent)
|
|
157
|
+
.withNone(HealthComponent)
|
|
158
|
+
.withTag(1)
|
|
106
159
|
.execute();
|
|
107
160
|
|
|
108
|
-
//
|
|
109
|
-
const
|
|
161
|
+
// 批量操作(使用Scene的方法)
|
|
162
|
+
const bullets = scene.createEntities(100, "bullet");
|
|
110
163
|
|
|
111
|
-
//
|
|
112
|
-
const
|
|
164
|
+
// 按标签查询
|
|
165
|
+
const enemies = entityManager.getEntitiesByTag(2);
|
|
113
166
|
```
|
|
114
167
|
|
|
115
|
-
|
|
168
|
+
## 事件系统
|
|
169
|
+
|
|
170
|
+
### [基础事件](docs/concepts-explained.md#类型安全事件)
|
|
171
|
+
|
|
172
|
+
类型安全的事件系统,编译时检查事件名和数据类型。
|
|
116
173
|
|
|
117
174
|
```typescript
|
|
118
|
-
import { EventBus, ECSEventType
|
|
175
|
+
import { EventBus, ECSEventType } from '@esengine/ecs-framework';
|
|
119
176
|
|
|
120
|
-
// 获取事件总线
|
|
121
177
|
const eventBus = entityManager.eventBus;
|
|
122
178
|
|
|
123
|
-
//
|
|
179
|
+
// 监听预定义事件
|
|
124
180
|
eventBus.onEntityCreated((data) => {
|
|
125
|
-
console.log(
|
|
181
|
+
console.log(`实体创建: ${data.entityName}`);
|
|
126
182
|
});
|
|
127
183
|
|
|
128
|
-
// 监听组件添加事件
|
|
129
184
|
eventBus.onComponentAdded((data) => {
|
|
130
|
-
console.log(
|
|
185
|
+
console.log(`组件添加: ${data.componentType}`);
|
|
131
186
|
});
|
|
132
187
|
|
|
133
|
-
//
|
|
134
|
-
|
|
188
|
+
// 自定义事件
|
|
189
|
+
eventBus.emit('player:death', { playerId: 123, reason: 'fall' });
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
### [事件装饰器](docs/concepts-explained.md#事件装饰器)
|
|
193
|
+
|
|
194
|
+
使用装饰器语法自动注册事件监听器,减少样板代码。
|
|
195
|
+
|
|
196
|
+
```typescript
|
|
197
|
+
import { EventHandler, ECSEventType } from '@esengine/ecs-framework';
|
|
198
|
+
|
|
199
|
+
class GameSystem {
|
|
135
200
|
@EventHandler(ECSEventType.ENTITY_DESTROYED)
|
|
136
|
-
onEntityDestroyed(data) {
|
|
137
|
-
console.log('
|
|
201
|
+
onEntityDestroyed(data: EntityDestroyedEventData) {
|
|
202
|
+
console.log('实体销毁:', data.entityName);
|
|
138
203
|
}
|
|
139
|
-
}
|
|
140
204
|
|
|
141
|
-
|
|
142
|
-
|
|
205
|
+
@EventHandler('player:levelup')
|
|
206
|
+
onPlayerLevelUp(data: { playerId: number; newLevel: number }) {
|
|
207
|
+
console.log(`玩家 ${data.playerId} 升级到 ${data.newLevel} 级`);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
143
210
|
```
|
|
144
211
|
|
|
145
|
-
##
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|------|-------------------------|-------|------|----------|
|
|
151
|
-
| **TypeScript 支持** | ✅ 原生支持 | ✅ 完整支持 | ⚠️ 部分支持 | ✅ 原生支持 |
|
|
152
|
-
| **事件系统** | ✅ 类型安全+装饰器 | ❌ 无内置事件系统 | ⚠️ 基础事件 | ✅ 响应式事件 |
|
|
153
|
-
| **查询系统** | ✅ 智能查询+流式API | ✅ 高性能 | ✅ 基础查询 | ✅ 响应式查询 |
|
|
154
|
-
| **性能优化** | ✅ 多层优化系统 | ✅ 高性能优化 | ⚠️ 基础优化 | ✅ React集成优化 |
|
|
155
|
-
| **实体管理器** | ✅ 统一管理接口 | ❌ 无统一接口 | ✅ 基础管理 | ✅ 响应式管理 |
|
|
156
|
-
| **组件索引** | ✅ 哈希+位图索引 | ✅ 原生支持 | ❌ 无索引系统 | ✅ 自动索引 |
|
|
157
|
-
| **Archetype系统** | ✅ 内置支持 | ✅ 内置支持 | ❌ 无Archetype | ❌ 无Archetype |
|
|
158
|
-
| **脏标记系统** | ✅ 细粒度追踪 | ⚠️ 基础支持 | ❌ 无脏标记 | ✅ React级追踪 |
|
|
159
|
-
| **批量操作** | ✅ 全面的批量API | ✅ 批量支持 | ⚠️ 有限支持 | ⚠️ 有限支持 |
|
|
160
|
-
| **游戏引擎集成** | ✅ 通用设计 | ✅ 通用设计 | ✅ 通用设计 | ⚠️ 主要针对React |
|
|
161
|
-
| **学习曲线** | 🟢 中等 | 🟡 较陡峭 | 🟢 简单 | 🟡 需要React知识 |
|
|
162
|
-
| **社区生态** | 🟡 成长中 | 🟢 活跃 | 🟡 稳定 | 🟡 小众但精品 |
|
|
163
|
-
|
|
164
|
-
### 为什么选择我们?
|
|
165
|
-
|
|
166
|
-
**相比 bitecs**:
|
|
167
|
-
- 更友好的 TypeScript API,无需手动管理内存
|
|
168
|
-
- 完整的实体管理器,开发体验更佳
|
|
169
|
-
- 内置类型安全事件系统,bitecs需要自己实现
|
|
170
|
-
- 多种索引系统可选,适应不同场景
|
|
171
|
-
|
|
172
|
-
**相比 ecsy**:
|
|
173
|
-
- 现代化的性能优化系统(组件索引、Archetype、脏标记)
|
|
174
|
-
- 更完整的 TypeScript 类型定义
|
|
175
|
-
- 增强的事件系统,支持装饰器和异步事件
|
|
176
|
-
- 活跃的维护和功能更新
|
|
177
|
-
|
|
178
|
-
**相比 Miniplex**:
|
|
179
|
-
- 不依赖 React 生态,可用于任何游戏引擎
|
|
180
|
-
- 专门针对游戏开发优化
|
|
181
|
-
- 更轻量级的核心设计
|
|
182
|
-
- 传统事件模式,更适合游戏开发习惯
|
|
183
|
-
|
|
184
|
-
## 📚 核心概念
|
|
185
|
-
|
|
186
|
-
### Entity(实体)
|
|
187
|
-
实体是游戏世界中的基本对象,可以挂载组件和运行系统。
|
|
212
|
+
## 性能优化
|
|
213
|
+
|
|
214
|
+
### [组件索引](docs/concepts-explained.md#组件索引系统)
|
|
215
|
+
|
|
216
|
+
通过建立索引避免线性搜索,将查询复杂度从 O(n) 降低到 O(1)。
|
|
188
217
|
|
|
189
218
|
```typescript
|
|
190
|
-
//
|
|
191
|
-
const
|
|
219
|
+
// 使用Scene的查询系统进行组件索引
|
|
220
|
+
const querySystem = scene.querySystem;
|
|
192
221
|
|
|
193
|
-
//
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
entity.enabled = true;
|
|
222
|
+
// 查询具有特定组件的实体
|
|
223
|
+
const entitiesWithPosition = querySystem.queryAll(PositionComponent).entities;
|
|
224
|
+
const entitiesWithVelocity = querySystem.queryAll(VelocityComponent).entities;
|
|
197
225
|
|
|
198
|
-
//
|
|
199
|
-
const
|
|
226
|
+
// 性能统计
|
|
227
|
+
const stats = querySystem.getStats();
|
|
228
|
+
console.log('查询效率:', stats.hitRate);
|
|
200
229
|
```
|
|
201
230
|
|
|
202
|
-
|
|
203
|
-
|
|
231
|
+
**索引类型选择:**
|
|
232
|
+
- **哈希索引** - 适合稳定的、大量的组件(如位置、生命值)
|
|
233
|
+
- **位图索引** - 适合频繁变化的组件(如Buff、状态)
|
|
234
|
+
|
|
235
|
+
> 📋 详细选择指南参见 [索引类型选择指南](docs/concepts-explained.md#索引类型选择指南)
|
|
236
|
+
|
|
237
|
+
### [Archetype 系统](docs/concepts-explained.md#archetype-系统)
|
|
238
|
+
|
|
239
|
+
将具有相同组件组合的实体分组,减少查询时的组件检查开销。
|
|
204
240
|
|
|
205
241
|
```typescript
|
|
206
|
-
|
|
242
|
+
// 使用查询系统的Archetype功能
|
|
243
|
+
const querySystem = scene.querySystem;
|
|
207
244
|
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
245
|
+
// 查询统计
|
|
246
|
+
const stats = querySystem.getStats();
|
|
247
|
+
console.log('缓存命中率:', stats.hitRate);
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
### [脏标记系统](docs/concepts-explained.md#脏标记系统)
|
|
251
|
+
|
|
252
|
+
追踪数据变化,只处理发生改变的实体,避免不必要的计算。
|
|
253
|
+
|
|
254
|
+
```typescript
|
|
255
|
+
// 脏标记通过组件系统自动管理
|
|
256
|
+
// 组件变化时会自动标记为脏数据
|
|
219
257
|
|
|
220
|
-
//
|
|
221
|
-
|
|
258
|
+
// 查询系统会自动处理脏标记优化
|
|
259
|
+
const movingEntities = scene.querySystem.queryAll(PositionComponent, VelocityComponent);
|
|
222
260
|
```
|
|
223
261
|
|
|
224
|
-
|
|
225
|
-
|
|
262
|
+
> 💡 **不确定何时使用这些优化?** 查看 [性能优化建议](docs/concepts-explained.md#性能建议) 了解适用场景
|
|
263
|
+
|
|
264
|
+
## API 参考
|
|
265
|
+
|
|
266
|
+
### 核心类
|
|
267
|
+
|
|
268
|
+
| 类 | 描述 |
|
|
269
|
+
|---|---|
|
|
270
|
+
| `Core` | 框架核心管理类 |
|
|
271
|
+
| `Scene` | 场景容器,管理实体和系统 |
|
|
272
|
+
| `Entity` | 实体对象,包含组件集合 |
|
|
273
|
+
| `Component` | 组件基类 |
|
|
274
|
+
| `EntitySystem` | 系统基类 |
|
|
275
|
+
| `EntityManager` | 实体管理器 |
|
|
276
|
+
|
|
277
|
+
### 查询 API
|
|
226
278
|
|
|
227
279
|
```typescript
|
|
228
|
-
|
|
280
|
+
entityManager
|
|
281
|
+
.query()
|
|
282
|
+
.withAll(...components) // 包含所有指定组件
|
|
283
|
+
.withAny(...components) // 包含任意指定组件
|
|
284
|
+
.withNone(...components) // 不包含指定组件
|
|
285
|
+
.withTag(tag) // 包含指定标签
|
|
286
|
+
.withoutTag(tag) // 不包含指定标签
|
|
287
|
+
.execute() // 执行查询
|
|
288
|
+
```
|
|
229
289
|
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
290
|
+
### 事件类型
|
|
291
|
+
|
|
292
|
+
```typescript
|
|
293
|
+
enum ECSEventType {
|
|
294
|
+
ENTITY_CREATED = 'entity:created',
|
|
295
|
+
ENTITY_DESTROYED = 'entity:destroyed',
|
|
296
|
+
COMPONENT_ADDED = 'component:added',
|
|
297
|
+
COMPONENT_REMOVED = 'component:removed',
|
|
298
|
+
SYSTEM_ADDED = 'system:added',
|
|
299
|
+
SYSTEM_REMOVED = 'system:removed'
|
|
240
300
|
}
|
|
241
301
|
```
|
|
242
302
|
|
|
243
|
-
##
|
|
303
|
+
## 与其他框架对比
|
|
244
304
|
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
305
|
+
| 特性 | @esengine/ecs-framework | bitECS | Miniplex |
|
|
306
|
+
|------|-------------------------|--------|----------|
|
|
307
|
+
| TypeScript 支持 | ✅ 原生支持 | ✅ 完整支持 | ✅ 原生支持 |
|
|
308
|
+
| 事件系统 | ✅ 内置+装饰器 | ❌ 需自己实现 | ✅ 响应式 |
|
|
309
|
+
| 查询系统 | ✅ 流式 API | ✅ 函数式 | ✅ 响应式 |
|
|
310
|
+
| 实体管理器 | ✅ 统一接口 | ❌ 低级 API | ✅ 高级接口 |
|
|
311
|
+
| 性能优化 | ✅ 多重优化 | ✅ 极致性能 | ✅ React 优化 |
|
|
312
|
+
| 游戏引擎集成 | ✅ 通用设计 | ✅ 通用设计 | ⚠️ 主要 React |
|
|
248
313
|
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
314
|
+
**选择指南:**
|
|
315
|
+
- 选择本框架:需要完整的游戏开发工具链和中文社区支持
|
|
316
|
+
- 选择 bitECS:需要极致性能和最小化设计
|
|
317
|
+
- 选择 Miniplex:主要用于 React 应用开发
|
|
318
|
+
|
|
319
|
+
## 项目结构
|
|
252
320
|
|
|
253
|
-
|
|
321
|
+
```
|
|
322
|
+
ecs-framework/
|
|
323
|
+
├── src/
|
|
324
|
+
│ ├── ECS/ # ECS 核心系统
|
|
325
|
+
│ │ ├── Core/ # 核心管理器
|
|
326
|
+
│ │ ├── Systems/ # 系统类型
|
|
327
|
+
│ │ └── Utils/ # ECS 工具
|
|
328
|
+
│ ├── Types/ # TypeScript接口定义
|
|
329
|
+
│ └── Utils/ # 通用工具
|
|
330
|
+
├── docs/ # 文档
|
|
331
|
+
└── scripts/ # 构建脚本
|
|
332
|
+
```
|
|
254
333
|
|
|
255
|
-
|
|
256
|
-
- [EntityManager 使用指南](docs/entity-manager-example.md) - 详细了解实体管理器的高级功能
|
|
257
|
-
- [事件系统使用指南](docs/event-system-example.md) - 学习类型安全事件系统的完整用法
|
|
258
|
-
- [性能优化指南](docs/performance-optimization.md) - 深入了解三大性能优化系统
|
|
259
|
-
- [核心概念](docs/core-concepts.md) - 深入了解 ECS 架构和设计原理
|
|
260
|
-
- [查询系统使用指南](docs/query-system-usage.md) - 学习高性能查询系统的详细用法
|
|
334
|
+
## 文档
|
|
261
335
|
|
|
262
|
-
|
|
336
|
+
### 🎯 新手入门
|
|
337
|
+
- **[📖 新手教程完整指南](docs/beginner-tutorials.md)** - 完整学习路径,从零开始 ⭐ **强烈推荐**
|
|
338
|
+
- **[🚀 快速入门](docs/getting-started.md)** - 详细的入门教程,包含Laya/Cocos/Node.js集成指南 ⭐ **平台集成必读**
|
|
339
|
+
- [🧠 技术概念详解](docs/concepts-explained.md) - 通俗易懂的技术概念解释 ⭐ **推荐新手阅读**
|
|
340
|
+
- [🎯 位掩码使用指南](docs/bitmask-guide.md) - 位掩码概念、原理和高级使用技巧
|
|
341
|
+
- [💡 使用场景示例](docs/use-cases.md) - 不同类型游戏的具体应用案例
|
|
342
|
+
- [🔧 框架类型系统](docs/concepts-explained.md#框架类型系统) - TypeScript接口设计和使用指南
|
|
263
343
|
|
|
264
|
-
|
|
265
|
-
- [
|
|
344
|
+
### 📚 核心功能
|
|
345
|
+
- [🎭 实体管理指南](docs/entity-guide.md) - 实体的创建和使用方法
|
|
346
|
+
- [🧩 组件设计指南](docs/component-design-guide.md) - 如何设计高质量组件 ⭐ **设计必读**
|
|
347
|
+
- [⚙️ 系统详解指南](docs/system-guide.md) - 四种系统类型的详细使用
|
|
348
|
+
- [🎬 场景管理指南](docs/scene-management-guide.md) - 场景切换和数据管理
|
|
349
|
+
- [⏰ 定时器系统指南](docs/timer-guide.md) - 定时器的完整使用方法
|
|
266
350
|
|
|
267
|
-
|
|
351
|
+
### API 参考
|
|
352
|
+
- [核心 API 参考](docs/core-concepts.md) - 完整的 API 使用说明
|
|
353
|
+
- [实体基础指南](docs/entity-guide.md) - 实体的基本概念和操作
|
|
354
|
+
- [EntityManager 指南](docs/entity-manager-example.md) - 高性能查询和批量操作
|
|
355
|
+
- [事件系统指南](docs/event-system-example.md) - 事件系统完整用法
|
|
356
|
+
- [查询系统指南](docs/query-system-usage.md) - 查询系统使用方法
|
|
268
357
|
|
|
269
|
-
|
|
358
|
+
### 性能相关
|
|
359
|
+
- [性能优化指南](docs/performance-optimization.md) - 性能优化技术和策略
|
|
270
360
|
|
|
271
|
-
|
|
361
|
+
## 构建
|
|
272
362
|
|
|
273
363
|
```bash
|
|
274
|
-
#
|
|
275
|
-
|
|
276
|
-
cd ecs-framework
|
|
364
|
+
# 安装依赖
|
|
365
|
+
npm install
|
|
277
366
|
|
|
278
|
-
#
|
|
279
|
-
|
|
367
|
+
# 构建项目
|
|
368
|
+
npm run build
|
|
280
369
|
|
|
281
|
-
#
|
|
282
|
-
|
|
283
|
-
```
|
|
370
|
+
# 监听模式
|
|
371
|
+
npm run build:watch
|
|
284
372
|
|
|
285
|
-
|
|
373
|
+
# 清理构建文件
|
|
374
|
+
npm run clean
|
|
286
375
|
|
|
287
|
-
|
|
288
|
-
|
|
376
|
+
# 重新构建
|
|
377
|
+
npm run rebuild
|
|
378
|
+
```
|
|
289
379
|
|
|
290
|
-
##
|
|
380
|
+
## 性能监控
|
|
291
381
|
|
|
292
|
-
|
|
382
|
+
框架提供内置性能统计:
|
|
383
|
+
|
|
384
|
+
```typescript
|
|
385
|
+
// 场景统计
|
|
386
|
+
const sceneStats = scene.getStats();
|
|
387
|
+
console.log('性能统计:', {
|
|
388
|
+
实体数量: sceneStats.entityCount,
|
|
389
|
+
系统数量: sceneStats.processorCount
|
|
390
|
+
});
|
|
293
391
|
|
|
294
|
-
|
|
392
|
+
// 查询系统统计
|
|
393
|
+
const queryStats = scene.querySystem.getStats();
|
|
394
|
+
console.log('查询统计:', {
|
|
395
|
+
缓存命中率: queryStats.hitRate + '%',
|
|
396
|
+
查询次数: queryStats.queryCount
|
|
397
|
+
});
|
|
398
|
+
```
|
|
295
399
|
|
|
296
|
-
|
|
400
|
+
## 扩展库
|
|
297
401
|
|
|
298
|
-
|
|
402
|
+
- [路径寻找库](https://github.com/esengine/ecs-astar) - A*、BFS、Dijkstra 算法
|
|
403
|
+
- [AI 系统](https://github.com/esengine/BehaviourTree-ai) - 行为树、效用 AI
|
|
299
404
|
|
|
300
|
-
|
|
301
|
-
实体创建: 640,000+ 个/秒
|
|
302
|
-
组件查询: O(1) 复杂度(使用索引)
|
|
303
|
-
内存优化: 30-50% 减少分配
|
|
304
|
-
批量操作: 显著提升处理效率
|
|
305
|
-
```
|
|
405
|
+
## 社区
|
|
306
406
|
|
|
307
|
-
|
|
407
|
+
- QQ 群:[ecs游戏框架交流](https://jq.qq.com/?_wv=1027&k=29w1Nud6)
|
|
408
|
+
- GitHub:[提交 Issue](https://github.com/esengine/ecs-framework/issues)
|
|
308
409
|
|
|
309
|
-
|
|
310
|
-
- **Archetype 系统**: 按组件组合分组,减少查询开销
|
|
311
|
-
- **脏标记机制**: 细粒度变更追踪,避免不必要的计算
|
|
312
|
-
- **批量操作 API**: 减少函数调用开销,提升大规模操作效率
|
|
313
|
-
- **智能缓存**: 查询结果缓存和延迟清理机制
|
|
410
|
+
## 贡献
|
|
314
411
|
|
|
315
|
-
|
|
412
|
+
欢迎提交 Pull Request 和 Issue!
|
|
316
413
|
|
|
317
|
-
|
|
318
|
-
2. **频繁查询**: 启用Archetype系统进行快速筛选
|
|
319
|
-
3. **实时游戏**: 利用脏标记减少无效更新
|
|
320
|
-
4. **移动端**: 建议实体数量控制在20,000以内
|
|
414
|
+
### 开发要求
|
|
321
415
|
|
|
322
|
-
|
|
416
|
+
- Node.js >= 14.0.0
|
|
417
|
+
- TypeScript >= 4.0.0
|
|
323
418
|
|
|
324
|
-
|
|
419
|
+
## 许可证
|
|
325
420
|
|
|
326
|
-
|
|
421
|
+
[MIT](LICENSE)
|