@esengine/ecs-framework 2.1.14 → 2.1.16
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/.npmignore +0 -6
- package/README.md +265 -193
- package/index.d.ts +34 -545
- 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/.npmignore
CHANGED
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
|
+
|
|
76
|
+
// 批量创建实体
|
|
77
|
+
const enemies = scene.createEntities(50, "Enemy");
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
### 创建系统
|
|
75
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,297 @@ class MovementSystem extends EntitySystem {
|
|
|
91
102
|
scene.addEntityProcessor(new MovementSystem());
|
|
92
103
|
```
|
|
93
104
|
|
|
94
|
-
###
|
|
105
|
+
### 游戏循环
|
|
106
|
+
|
|
107
|
+
```typescript
|
|
108
|
+
function gameLoop() {
|
|
109
|
+
// 更新场景
|
|
110
|
+
scene.update();
|
|
111
|
+
|
|
112
|
+
// 发送帧更新事件
|
|
113
|
+
Core.emitter.emit(CoreEvents.frameUpdated);
|
|
114
|
+
|
|
115
|
+
requestAnimationFrame(gameLoop);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
gameLoop();
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
## 实体管理器
|
|
122
|
+
|
|
123
|
+
EntityManager 提供了统一的实体管理接口:
|
|
95
124
|
|
|
96
125
|
```typescript
|
|
97
126
|
import { EntityManager } from '@esengine/ecs-framework';
|
|
98
127
|
|
|
99
|
-
// 使用EntityManager进行高级查询
|
|
100
128
|
const entityManager = new EntityManager();
|
|
101
129
|
|
|
102
|
-
//
|
|
103
|
-
const
|
|
130
|
+
// 流式查询 API
|
|
131
|
+
const results = entityManager
|
|
104
132
|
.query()
|
|
105
133
|
.withAll(PositionComponent, VelocityComponent)
|
|
134
|
+
.withNone(HealthComponent)
|
|
135
|
+
.withTag(1)
|
|
106
136
|
.execute();
|
|
107
137
|
|
|
108
|
-
//
|
|
109
|
-
const
|
|
138
|
+
// 批量操作(使用Scene的方法)
|
|
139
|
+
const bullets = scene.createEntities(100, "bullet");
|
|
110
140
|
|
|
111
|
-
//
|
|
112
|
-
const
|
|
141
|
+
// 按标签查询
|
|
142
|
+
const enemies = entityManager.getEntitiesByTag(2);
|
|
113
143
|
```
|
|
114
144
|
|
|
115
|
-
|
|
145
|
+
## 事件系统
|
|
146
|
+
|
|
147
|
+
### [基础事件](docs/concepts-explained.md#类型安全事件)
|
|
148
|
+
|
|
149
|
+
类型安全的事件系统,编译时检查事件名和数据类型。
|
|
116
150
|
|
|
117
151
|
```typescript
|
|
118
|
-
import { EventBus, ECSEventType
|
|
152
|
+
import { EventBus, ECSEventType } from '@esengine/ecs-framework';
|
|
119
153
|
|
|
120
|
-
// 获取事件总线
|
|
121
154
|
const eventBus = entityManager.eventBus;
|
|
122
155
|
|
|
123
|
-
//
|
|
156
|
+
// 监听预定义事件
|
|
124
157
|
eventBus.onEntityCreated((data) => {
|
|
125
|
-
console.log(
|
|
158
|
+
console.log(`实体创建: ${data.entityName}`);
|
|
126
159
|
});
|
|
127
160
|
|
|
128
|
-
// 监听组件添加事件
|
|
129
161
|
eventBus.onComponentAdded((data) => {
|
|
130
|
-
console.log(
|
|
162
|
+
console.log(`组件添加: ${data.componentType}`);
|
|
131
163
|
});
|
|
132
164
|
|
|
133
|
-
//
|
|
134
|
-
|
|
165
|
+
// 自定义事件
|
|
166
|
+
eventBus.emit('player:death', { playerId: 123, reason: 'fall' });
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
### [事件装饰器](docs/concepts-explained.md#事件装饰器)
|
|
170
|
+
|
|
171
|
+
使用装饰器语法自动注册事件监听器,减少样板代码。
|
|
172
|
+
|
|
173
|
+
```typescript
|
|
174
|
+
import { EventHandler, ECSEventType } from '@esengine/ecs-framework';
|
|
175
|
+
|
|
176
|
+
class GameSystem {
|
|
135
177
|
@EventHandler(ECSEventType.ENTITY_DESTROYED)
|
|
136
|
-
onEntityDestroyed(data) {
|
|
137
|
-
console.log('
|
|
178
|
+
onEntityDestroyed(data: EntityDestroyedEventData) {
|
|
179
|
+
console.log('实体销毁:', data.entityName);
|
|
138
180
|
}
|
|
139
|
-
}
|
|
140
181
|
|
|
141
|
-
|
|
142
|
-
|
|
182
|
+
@EventHandler('player:levelup')
|
|
183
|
+
onPlayerLevelUp(data: { playerId: number; newLevel: number }) {
|
|
184
|
+
console.log(`玩家 ${data.playerId} 升级到 ${data.newLevel} 级`);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
143
187
|
```
|
|
144
188
|
|
|
145
|
-
##
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|------|-------------------------|-------|------|----------|
|
|
151
|
-
| **TypeScript 支持** | ✅ 原生支持 | ✅ 完整支持 | ⚠️ 部分支持 | ✅ 原生支持 |
|
|
152
|
-
| **事件系统** | ✅ 类型安全+装饰器 | ❌ 无内置事件系统 | ⚠️ 基础事件 | ✅ 响应式事件 |
|
|
153
|
-
| **查询系统** | ✅ 智能查询+流式API | ✅ 高性能 | ✅ 基础查询 | ✅ 响应式查询 |
|
|
154
|
-
| **性能优化** | ✅ 多层优化系统 | ✅ WASM优化 | ⚠️ 基础优化 | ✅ 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
|
-
实体是游戏世界中的基本对象,可以挂载组件和运行系统。
|
|
189
|
+
## 性能优化
|
|
190
|
+
|
|
191
|
+
### [组件索引](docs/concepts-explained.md#组件索引系统)
|
|
192
|
+
|
|
193
|
+
通过建立索引避免线性搜索,将查询复杂度从 O(n) 降低到 O(1)。
|
|
188
194
|
|
|
189
195
|
```typescript
|
|
190
|
-
//
|
|
191
|
-
const
|
|
196
|
+
// 使用Scene的查询系统进行组件索引
|
|
197
|
+
const querySystem = scene.querySystem;
|
|
192
198
|
|
|
193
|
-
//
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
entity.enabled = true;
|
|
199
|
+
// 查询具有特定组件的实体
|
|
200
|
+
const entitiesWithPosition = querySystem.queryAll(PositionComponent).entities;
|
|
201
|
+
const entitiesWithVelocity = querySystem.queryAll(VelocityComponent).entities;
|
|
197
202
|
|
|
198
|
-
//
|
|
199
|
-
const
|
|
203
|
+
// 性能统计
|
|
204
|
+
const stats = querySystem.getStats();
|
|
205
|
+
console.log('查询效率:', stats.hitRate);
|
|
200
206
|
```
|
|
201
207
|
|
|
202
|
-
|
|
203
|
-
|
|
208
|
+
**索引类型选择:**
|
|
209
|
+
- **哈希索引** - 适合稳定的、大量的组件(如位置、生命值)
|
|
210
|
+
- **位图索引** - 适合频繁变化的组件(如Buff、状态)
|
|
211
|
+
|
|
212
|
+
> 📋 详细选择指南参见 [索引类型选择指南](docs/concepts-explained.md#索引类型选择指南)
|
|
213
|
+
|
|
214
|
+
### [Archetype 系统](docs/concepts-explained.md#archetype-系统)
|
|
215
|
+
|
|
216
|
+
将具有相同组件组合的实体分组,减少查询时的组件检查开销。
|
|
204
217
|
|
|
205
218
|
```typescript
|
|
206
|
-
|
|
219
|
+
// 使用查询系统的Archetype功能
|
|
220
|
+
const querySystem = scene.querySystem;
|
|
207
221
|
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
}
|
|
217
|
-
}
|
|
218
|
-
}
|
|
222
|
+
// 查询统计
|
|
223
|
+
const stats = querySystem.getStats();
|
|
224
|
+
console.log('缓存命中率:', stats.hitRate);
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
### [脏标记系统](docs/concepts-explained.md#脏标记系统)
|
|
228
|
+
|
|
229
|
+
追踪数据变化,只处理发生改变的实体,避免不必要的计算。
|
|
219
230
|
|
|
220
|
-
|
|
221
|
-
|
|
231
|
+
```typescript
|
|
232
|
+
// 脏标记通过组件系统自动管理
|
|
233
|
+
// 组件变化时会自动标记为脏数据
|
|
234
|
+
|
|
235
|
+
// 查询系统会自动处理脏标记优化
|
|
236
|
+
const movingEntities = scene.querySystem.queryAll(PositionComponent, VelocityComponent);
|
|
222
237
|
```
|
|
223
238
|
|
|
224
|
-
|
|
225
|
-
|
|
239
|
+
> 💡 **不确定何时使用这些优化?** 查看 [性能优化建议](docs/concepts-explained.md#性能建议) 了解适用场景
|
|
240
|
+
|
|
241
|
+
## API 参考
|
|
242
|
+
|
|
243
|
+
### 核心类
|
|
244
|
+
|
|
245
|
+
| 类 | 描述 |
|
|
246
|
+
|---|---|
|
|
247
|
+
| `Core` | 框架核心管理类 |
|
|
248
|
+
| `Scene` | 场景容器,管理实体和系统 |
|
|
249
|
+
| `Entity` | 实体对象,包含组件集合 |
|
|
250
|
+
| `Component` | 组件基类 |
|
|
251
|
+
| `EntitySystem` | 系统基类 |
|
|
252
|
+
| `EntityManager` | 实体管理器 |
|
|
253
|
+
|
|
254
|
+
### 查询 API
|
|
226
255
|
|
|
227
256
|
```typescript
|
|
228
|
-
|
|
257
|
+
entityManager
|
|
258
|
+
.query()
|
|
259
|
+
.withAll(...components) // 包含所有指定组件
|
|
260
|
+
.withAny(...components) // 包含任意指定组件
|
|
261
|
+
.withNone(...components) // 不包含指定组件
|
|
262
|
+
.withTag(tag) // 包含指定标签
|
|
263
|
+
.withoutTag(tag) // 不包含指定标签
|
|
264
|
+
.execute() // 执行查询
|
|
265
|
+
```
|
|
229
266
|
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
267
|
+
### 事件类型
|
|
268
|
+
|
|
269
|
+
```typescript
|
|
270
|
+
enum ECSEventType {
|
|
271
|
+
ENTITY_CREATED = 'entity:created',
|
|
272
|
+
ENTITY_DESTROYED = 'entity:destroyed',
|
|
273
|
+
COMPONENT_ADDED = 'component:added',
|
|
274
|
+
COMPONENT_REMOVED = 'component:removed',
|
|
275
|
+
SYSTEM_ADDED = 'system:added',
|
|
276
|
+
SYSTEM_REMOVED = 'system:removed'
|
|
240
277
|
}
|
|
241
278
|
```
|
|
242
279
|
|
|
243
|
-
##
|
|
280
|
+
## 与其他框架对比
|
|
244
281
|
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
282
|
+
| 特性 | @esengine/ecs-framework | bitECS | Miniplex |
|
|
283
|
+
|------|-------------------------|--------|----------|
|
|
284
|
+
| TypeScript 支持 | ✅ 原生支持 | ✅ 完整支持 | ✅ 原生支持 |
|
|
285
|
+
| 事件系统 | ✅ 内置+装饰器 | ❌ 需自己实现 | ✅ 响应式 |
|
|
286
|
+
| 查询系统 | ✅ 流式 API | ✅ 函数式 | ✅ 响应式 |
|
|
287
|
+
| 实体管理器 | ✅ 统一接口 | ❌ 低级 API | ✅ 高级接口 |
|
|
288
|
+
| 性能优化 | ✅ 多重优化 | ✅ 极致性能 | ✅ React 优化 |
|
|
289
|
+
| 游戏引擎集成 | ✅ 通用设计 | ✅ 通用设计 | ⚠️ 主要 React |
|
|
248
290
|
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
291
|
+
**选择指南:**
|
|
292
|
+
- 选择本框架:需要完整的游戏开发工具链和中文社区支持
|
|
293
|
+
- 选择 bitECS:需要极致性能和最小化设计
|
|
294
|
+
- 选择 Miniplex:主要用于 React 应用开发
|
|
295
|
+
|
|
296
|
+
## 项目结构
|
|
252
297
|
|
|
253
|
-
|
|
298
|
+
```
|
|
299
|
+
ecs-framework/
|
|
300
|
+
├── src/
|
|
301
|
+
│ ├── ECS/ # ECS 核心系统
|
|
302
|
+
│ │ ├── Core/ # 核心管理器
|
|
303
|
+
│ │ ├── Systems/ # 系统类型
|
|
304
|
+
│ │ └── Utils/ # ECS 工具
|
|
305
|
+
│ ├── Types/ # TypeScript接口定义
|
|
306
|
+
│ └── Utils/ # 通用工具
|
|
307
|
+
├── docs/ # 文档
|
|
308
|
+
└── scripts/ # 构建脚本
|
|
309
|
+
```
|
|
254
310
|
|
|
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) - 学习高性能查询系统的详细用法
|
|
311
|
+
## 文档
|
|
261
312
|
|
|
262
|
-
|
|
313
|
+
### 🎯 新手入门
|
|
314
|
+
- **[📖 新手教程完整指南](docs/beginner-tutorials.md)** - 完整学习路径,从零开始 ⭐ **强烈推荐**
|
|
315
|
+
- [🚀 快速入门](docs/getting-started.md) - 详细的入门教程
|
|
316
|
+
- [🧠 技术概念详解](docs/concepts-explained.md) - 通俗易懂的技术概念解释 ⭐ **推荐新手阅读**
|
|
317
|
+
- [🎯 位掩码使用指南](docs/bitmask-guide.md) - 位掩码概念、原理和高级使用技巧
|
|
318
|
+
- [💡 使用场景示例](docs/use-cases.md) - 不同类型游戏的具体应用案例
|
|
319
|
+
- [🔧 框架类型系统](docs/concepts-explained.md#框架类型系统) - TypeScript接口设计和使用指南
|
|
263
320
|
|
|
264
|
-
|
|
265
|
-
- [
|
|
321
|
+
### 📚 核心功能
|
|
322
|
+
- [🎭 实体管理指南](docs/entity-guide.md) - 实体的创建和使用方法
|
|
323
|
+
- [🧩 组件设计指南](docs/component-design-guide.md) - 如何设计高质量组件 ⭐ **设计必读**
|
|
324
|
+
- [⚙️ 系统详解指南](docs/system-guide.md) - 四种系统类型的详细使用
|
|
325
|
+
- [🎬 场景管理指南](docs/scene-management-guide.md) - 场景切换和数据管理
|
|
326
|
+
- [⏰ 定时器系统指南](docs/timer-guide.md) - 定时器的完整使用方法
|
|
266
327
|
|
|
267
|
-
|
|
328
|
+
### API 参考
|
|
329
|
+
- [核心 API 参考](docs/core-concepts.md) - 完整的 API 使用说明
|
|
330
|
+
- [实体基础指南](docs/entity-guide.md) - 实体的基本概念和操作
|
|
331
|
+
- [EntityManager 指南](docs/entity-manager-example.md) - 高性能查询和批量操作
|
|
332
|
+
- [事件系统指南](docs/event-system-example.md) - 事件系统完整用法
|
|
333
|
+
- [查询系统指南](docs/query-system-usage.md) - 查询系统使用方法
|
|
268
334
|
|
|
269
|
-
|
|
335
|
+
### 性能相关
|
|
336
|
+
- [性能优化指南](docs/performance-optimization.md) - 性能优化技术和策略
|
|
270
337
|
|
|
271
|
-
|
|
338
|
+
## 构建
|
|
272
339
|
|
|
273
340
|
```bash
|
|
274
|
-
#
|
|
275
|
-
|
|
276
|
-
cd ecs-framework
|
|
341
|
+
# 安装依赖
|
|
342
|
+
npm install
|
|
277
343
|
|
|
278
|
-
#
|
|
279
|
-
|
|
344
|
+
# 构建项目
|
|
345
|
+
npm run build
|
|
280
346
|
|
|
281
|
-
#
|
|
282
|
-
|
|
283
|
-
```
|
|
347
|
+
# 监听模式
|
|
348
|
+
npm run build:watch
|
|
284
349
|
|
|
285
|
-
|
|
350
|
+
# 清理构建文件
|
|
351
|
+
npm run clean
|
|
286
352
|
|
|
287
|
-
|
|
288
|
-
|
|
353
|
+
# 重新构建
|
|
354
|
+
npm run rebuild
|
|
355
|
+
```
|
|
289
356
|
|
|
290
|
-
##
|
|
357
|
+
## 性能监控
|
|
291
358
|
|
|
292
|
-
|
|
359
|
+
框架提供内置性能统计:
|
|
293
360
|
|
|
294
|
-
|
|
361
|
+
```typescript
|
|
362
|
+
// 场景统计
|
|
363
|
+
const sceneStats = scene.getStats();
|
|
364
|
+
console.log('性能统计:', {
|
|
365
|
+
实体数量: sceneStats.entityCount,
|
|
366
|
+
系统数量: sceneStats.processorCount
|
|
367
|
+
});
|
|
295
368
|
|
|
296
|
-
|
|
369
|
+
// 查询系统统计
|
|
370
|
+
const queryStats = scene.querySystem.getStats();
|
|
371
|
+
console.log('查询统计:', {
|
|
372
|
+
缓存命中率: queryStats.hitRate + '%',
|
|
373
|
+
查询次数: queryStats.queryCount
|
|
374
|
+
});
|
|
375
|
+
```
|
|
297
376
|
|
|
298
|
-
|
|
377
|
+
## 扩展库
|
|
299
378
|
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
批量操作: 显著提升处理效率
|
|
305
|
-
```
|
|
379
|
+
- [路径寻找库](https://github.com/esengine/ecs-astar) - A*、BFS、Dijkstra 算法
|
|
380
|
+
- [AI 系统](https://github.com/esengine/BehaviourTree-ai) - 行为树、效用 AI
|
|
381
|
+
|
|
382
|
+
## 社区
|
|
306
383
|
|
|
307
|
-
|
|
384
|
+
- QQ 群:[ecs游戏框架交流](https://jq.qq.com/?_wv=1027&k=29w1Nud6)
|
|
385
|
+
- GitHub:[提交 Issue](https://github.com/esengine/ecs-framework/issues)
|
|
308
386
|
|
|
309
|
-
|
|
310
|
-
- **Archetype 系统**: 按组件组合分组,减少查询开销
|
|
311
|
-
- **脏标记机制**: 细粒度变更追踪,避免不必要的计算
|
|
312
|
-
- **批量操作 API**: 减少函数调用开销,提升大规模操作效率
|
|
313
|
-
- **智能缓存**: 查询结果缓存和延迟清理机制
|
|
387
|
+
## 贡献
|
|
314
388
|
|
|
315
|
-
|
|
389
|
+
欢迎提交 Pull Request 和 Issue!
|
|
316
390
|
|
|
317
|
-
|
|
318
|
-
2. **频繁查询**: 启用Archetype系统进行快速筛选
|
|
319
|
-
3. **实时游戏**: 利用脏标记减少无效更新
|
|
320
|
-
4. **移动端**: 建议实体数量控制在20,000以内
|
|
391
|
+
### 开发要求
|
|
321
392
|
|
|
322
|
-
|
|
393
|
+
- Node.js >= 14.0.0
|
|
394
|
+
- TypeScript >= 4.0.0
|
|
323
395
|
|
|
324
|
-
|
|
396
|
+
## 许可证
|
|
325
397
|
|
|
326
|
-
|
|
398
|
+
[MIT](LICENSE)
|