@esengine/ecs-framework 2.1.4 → 2.1.6
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 +385 -0
- package/{bin/index.d.ts → index.d.ts} +9 -6
- package/index.js +7 -0
- package/index.js.map +7 -0
- package/package.json +21 -46
- package/{bin/wasm → wasm}/ecs_wasm_core_bg.wasm +0 -0
- package/bin/Core.d.ts +0 -198
- package/bin/Core.d.ts.map +0 -1
- package/bin/Core.js +0 -247
- package/bin/Core.js.map +0 -1
- package/bin/ECS/Component.d.ts +0 -119
- package/bin/ECS/Component.d.ts.map +0 -1
- package/bin/ECS/Component.js +0 -129
- package/bin/ECS/Component.js.map +0 -1
- package/bin/ECS/Components/IUpdatable.d.ts +0 -22
- package/bin/ECS/Components/IUpdatable.d.ts.map +0 -1
- package/bin/ECS/Components/IUpdatable.js +0 -22
- package/bin/ECS/Components/IUpdatable.js.map +0 -1
- package/bin/ECS/Components/SceneComponent.d.ts +0 -40
- package/bin/ECS/Components/SceneComponent.d.ts.map +0 -1
- package/bin/ECS/Components/SceneComponent.js +0 -61
- package/bin/ECS/Components/SceneComponent.js.map +0 -1
- package/bin/ECS/Core/BitMaskOptimizer.d.ts +0 -75
- package/bin/ECS/Core/BitMaskOptimizer.d.ts.map +0 -1
- package/bin/ECS/Core/BitMaskOptimizer.js +0 -161
- package/bin/ECS/Core/BitMaskOptimizer.js.map +0 -1
- package/bin/ECS/Core/ComponentPool.d.ts +0 -72
- package/bin/ECS/Core/ComponentPool.d.ts.map +0 -1
- package/bin/ECS/Core/ComponentPool.js +0 -123
- package/bin/ECS/Core/ComponentPool.js.map +0 -1
- package/bin/ECS/Core/ComponentStorage.d.ts +0 -182
- package/bin/ECS/Core/ComponentStorage.d.ts.map +0 -1
- package/bin/ECS/Core/ComponentStorage.js +0 -346
- package/bin/ECS/Core/ComponentStorage.js.map +0 -1
- package/bin/ECS/Core/EventSystem.d.ts +0 -236
- package/bin/ECS/Core/EventSystem.d.ts.map +0 -1
- package/bin/ECS/Core/EventSystem.js +0 -476
- package/bin/ECS/Core/EventSystem.js.map +0 -1
- package/bin/ECS/Core/FluentAPI.d.ts +0 -371
- package/bin/ECS/Core/FluentAPI.d.ts.map +0 -1
- package/bin/ECS/Core/FluentAPI.js +0 -543
- package/bin/ECS/Core/FluentAPI.js.map +0 -1
- package/bin/ECS/Core/IndexUpdateBatcher.d.ts +0 -100
- package/bin/ECS/Core/IndexUpdateBatcher.d.ts.map +0 -1
- package/bin/ECS/Core/IndexUpdateBatcher.js +0 -219
- package/bin/ECS/Core/IndexUpdateBatcher.js.map +0 -1
- package/bin/ECS/Core/QuerySystem.d.ts +0 -422
- package/bin/ECS/Core/QuerySystem.d.ts.map +0 -1
- package/bin/ECS/Core/QuerySystem.js +0 -937
- package/bin/ECS/Core/QuerySystem.js.map +0 -1
- package/bin/ECS/CoreEvents.d.ts +0 -19
- package/bin/ECS/CoreEvents.d.ts.map +0 -1
- package/bin/ECS/CoreEvents.js +0 -20
- package/bin/ECS/CoreEvents.js.map +0 -1
- package/bin/ECS/Entity.d.ts +0 -538
- package/bin/ECS/Entity.d.ts.map +0 -1
- package/bin/ECS/Entity.js +0 -1030
- package/bin/ECS/Entity.js.map +0 -1
- package/bin/ECS/Scene.d.ts +0 -226
- package/bin/ECS/Scene.d.ts.map +0 -1
- package/bin/ECS/Scene.js +0 -308
- package/bin/ECS/Scene.js.map +0 -1
- package/bin/ECS/Systems/EntitySystem.d.ts +0 -185
- package/bin/ECS/Systems/EntitySystem.d.ts.map +0 -1
- package/bin/ECS/Systems/EntitySystem.js +0 -278
- package/bin/ECS/Systems/EntitySystem.js.map +0 -1
- package/bin/ECS/Systems/IntervalSystem.d.ts +0 -33
- package/bin/ECS/Systems/IntervalSystem.d.ts.map +0 -1
- package/bin/ECS/Systems/IntervalSystem.js +0 -50
- package/bin/ECS/Systems/IntervalSystem.js.map +0 -1
- package/bin/ECS/Systems/PassiveSystem.d.ts +0 -20
- package/bin/ECS/Systems/PassiveSystem.d.ts.map +0 -1
- package/bin/ECS/Systems/PassiveSystem.js +0 -21
- package/bin/ECS/Systems/PassiveSystem.js.map +0 -1
- package/bin/ECS/Systems/ProcessingSystem.d.ts +0 -24
- package/bin/ECS/Systems/ProcessingSystem.d.ts.map +0 -1
- package/bin/ECS/Systems/ProcessingSystem.js +0 -22
- package/bin/ECS/Systems/ProcessingSystem.js.map +0 -1
- package/bin/ECS/Systems/index.d.ts +0 -5
- package/bin/ECS/Systems/index.d.ts.map +0 -1
- package/bin/ECS/Systems/index.js +0 -6
- package/bin/ECS/Systems/index.js.map +0 -1
- package/bin/ECS/Utils/Bits.d.ts +0 -74
- package/bin/ECS/Utils/Bits.d.ts.map +0 -1
- package/bin/ECS/Utils/Bits.js +0 -142
- package/bin/ECS/Utils/Bits.js.map +0 -1
- package/bin/ECS/Utils/ComponentTypeManager.d.ts +0 -50
- package/bin/ECS/Utils/ComponentTypeManager.d.ts.map +0 -1
- package/bin/ECS/Utils/ComponentTypeManager.js +0 -84
- package/bin/ECS/Utils/ComponentTypeManager.js.map +0 -1
- package/bin/ECS/Utils/EntityList.d.ts +0 -108
- package/bin/ECS/Utils/EntityList.d.ts.map +0 -1
- package/bin/ECS/Utils/EntityList.js +0 -249
- package/bin/ECS/Utils/EntityList.js.map +0 -1
- package/bin/ECS/Utils/EntityProcessorList.d.ts +0 -53
- package/bin/ECS/Utils/EntityProcessorList.d.ts.map +0 -1
- package/bin/ECS/Utils/EntityProcessorList.js +0 -96
- package/bin/ECS/Utils/EntityProcessorList.js.map +0 -1
- package/bin/ECS/Utils/IdentifierPool.d.ts +0 -18
- package/bin/ECS/Utils/IdentifierPool.d.ts.map +0 -1
- package/bin/ECS/Utils/IdentifierPool.js +0 -27
- package/bin/ECS/Utils/IdentifierPool.js.map +0 -1
- package/bin/ECS/Utils/Matcher.d.ts +0 -63
- package/bin/ECS/Utils/Matcher.d.ts.map +0 -1
- package/bin/ECS/Utils/Matcher.js +0 -140
- package/bin/ECS/Utils/Matcher.js.map +0 -1
- package/bin/ECS/Utils/index.d.ts +0 -7
- package/bin/ECS/Utils/index.d.ts.map +0 -1
- package/bin/ECS/Utils/index.js +0 -8
- package/bin/ECS/Utils/index.js.map +0 -1
- package/bin/ECS/index.d.ts +0 -7
- package/bin/ECS/index.d.ts.map +0 -1
- package/bin/ECS/index.js +0 -29
- package/bin/ECS/index.js.map +0 -1
- package/bin/Testing/Performance/benchmark.d.ts +0 -6
- package/bin/Testing/Performance/benchmark.d.ts.map +0 -1
- package/bin/Testing/Performance/benchmark.js +0 -639
- package/bin/Testing/Performance/benchmark.js.map +0 -1
- package/bin/Testing/Performance/component-performance.d.ts +0 -2
- package/bin/Testing/Performance/component-performance.d.ts.map +0 -1
- package/bin/Testing/Performance/component-performance.js +0 -43
- package/bin/Testing/Performance/component-performance.js.map +0 -1
- package/bin/Testing/Unit/bitmask-optimizer.test.d.ts +0 -2
- package/bin/Testing/Unit/bitmask-optimizer.test.d.ts.map +0 -1
- package/bin/Testing/Unit/bitmask-optimizer.test.js +0 -164
- package/bin/Testing/Unit/bitmask-optimizer.test.js.map +0 -1
- package/bin/Testing/Unit/component-pool.test.d.ts +0 -5
- package/bin/Testing/Unit/component-pool.test.d.ts.map +0 -1
- package/bin/Testing/Unit/component-pool.test.js +0 -149
- package/bin/Testing/Unit/component-pool.test.js.map +0 -1
- package/bin/Testing/test-runner.d.ts +0 -51
- package/bin/Testing/test-runner.d.ts.map +0 -1
- package/bin/Testing/test-runner.js +0 -159
- package/bin/Testing/test-runner.js.map +0 -1
- package/bin/Types/index.d.ts +0 -22
- package/bin/Types/index.d.ts.map +0 -1
- package/bin/Types/index.js +0 -20
- package/bin/Types/index.js.map +0 -1
- package/bin/Utils/Emitter.d.ts +0 -43
- package/bin/Utils/Emitter.d.ts.map +0 -1
- package/bin/Utils/Emitter.js +0 -69
- package/bin/Utils/Emitter.js.map +0 -1
- package/bin/Utils/Extensions/NumberExtension.d.ts +0 -13
- package/bin/Utils/Extensions/NumberExtension.d.ts.map +0 -1
- package/bin/Utils/Extensions/NumberExtension.js +0 -17
- package/bin/Utils/Extensions/NumberExtension.js.map +0 -1
- package/bin/Utils/Extensions/TypeUtils.d.ts +0 -13
- package/bin/Utils/Extensions/TypeUtils.d.ts.map +0 -1
- package/bin/Utils/Extensions/TypeUtils.js +0 -15
- package/bin/Utils/Extensions/TypeUtils.js.map +0 -1
- package/bin/Utils/Extensions/index.d.ts +0 -3
- package/bin/Utils/Extensions/index.d.ts.map +0 -1
- package/bin/Utils/Extensions/index.js +0 -4
- package/bin/Utils/Extensions/index.js.map +0 -1
- package/bin/Utils/GlobalManager.d.ts +0 -32
- package/bin/Utils/GlobalManager.d.ts.map +0 -1
- package/bin/Utils/GlobalManager.js +0 -53
- package/bin/Utils/GlobalManager.js.map +0 -1
- package/bin/Utils/PerformanceMonitor.d.ts +0 -211
- package/bin/Utils/PerformanceMonitor.d.ts.map +0 -1
- package/bin/Utils/PerformanceMonitor.js +0 -270
- package/bin/Utils/PerformanceMonitor.js.map +0 -1
- package/bin/Utils/Pool.d.ts +0 -239
- package/bin/Utils/Pool.d.ts.map +0 -1
- package/bin/Utils/Pool.js +0 -449
- package/bin/Utils/Pool.js.map +0 -1
- package/bin/Utils/Time.d.ts +0 -55
- package/bin/Utils/Time.d.ts.map +0 -1
- package/bin/Utils/Time.js +0 -78
- package/bin/Utils/Time.js.map +0 -1
- package/bin/Utils/Timers/ITimer.d.ts +0 -16
- package/bin/Utils/Timers/ITimer.d.ts.map +0 -1
- package/bin/Utils/Timers/ITimer.js +0 -2
- package/bin/Utils/Timers/ITimer.js.map +0 -1
- package/bin/Utils/Timers/Timer.d.ts +0 -22
- package/bin/Utils/Timers/Timer.d.ts.map +0 -1
- package/bin/Utils/Timers/Timer.js +0 -46
- package/bin/Utils/Timers/Timer.js.map +0 -1
- package/bin/Utils/Timers/TimerManager.d.ts +0 -19
- package/bin/Utils/Timers/TimerManager.d.ts.map +0 -1
- package/bin/Utils/Timers/TimerManager.js +0 -33
- package/bin/Utils/Timers/TimerManager.js.map +0 -1
- package/bin/Utils/WasmCore.d.ts +0 -234
- package/bin/Utils/WasmCore.d.ts.map +0 -1
- package/bin/Utils/WasmCore.js +0 -596
- package/bin/Utils/WasmCore.js.map +0 -1
- package/bin/Utils/index.d.ts +0 -16
- package/bin/Utils/index.d.ts.map +0 -1
- package/bin/Utils/index.js +0 -37
- package/bin/Utils/index.js.map +0 -1
- package/bin/index.cjs +0 -51
- package/bin/index.d.ts.map +0 -1
- package/bin/index.esm.d.ts +0 -45
- package/bin/index.esm.d.ts.map +0 -1
- package/bin/index.esm.js +0 -46
- package/bin/index.esm.js.map +0 -1
- package/bin/index.js.map +0 -1
- /package/{bin/wasm → wasm}/ecs_wasm_core.d.ts +0 -0
- /package/{bin/wasm → wasm}/ecs_wasm_core.js +0 -0
- /package/{bin/wasm → wasm}/ecs_wasm_core_bg.wasm.d.ts +0 -0
- /package/{bin/wasm → wasm}/package.json +0 -0
|
@@ -1,123 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 组件对象池,用于复用组件实例以减少内存分配
|
|
3
|
-
*/
|
|
4
|
-
export class ComponentPool {
|
|
5
|
-
constructor(createFn, resetFn, maxSize = 1000) {
|
|
6
|
-
this.pool = [];
|
|
7
|
-
this.createFn = createFn;
|
|
8
|
-
this.resetFn = resetFn;
|
|
9
|
-
this.maxSize = maxSize;
|
|
10
|
-
}
|
|
11
|
-
/**
|
|
12
|
-
* 获取一个组件实例
|
|
13
|
-
*/
|
|
14
|
-
acquire() {
|
|
15
|
-
if (this.pool.length > 0) {
|
|
16
|
-
return this.pool.pop();
|
|
17
|
-
}
|
|
18
|
-
return this.createFn();
|
|
19
|
-
}
|
|
20
|
-
/**
|
|
21
|
-
* 释放一个组件实例回池中
|
|
22
|
-
*/
|
|
23
|
-
release(component) {
|
|
24
|
-
if (this.pool.length < this.maxSize) {
|
|
25
|
-
if (this.resetFn) {
|
|
26
|
-
this.resetFn(component);
|
|
27
|
-
}
|
|
28
|
-
this.pool.push(component);
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
/**
|
|
32
|
-
* 预填充对象池
|
|
33
|
-
*/
|
|
34
|
-
prewarm(count) {
|
|
35
|
-
for (let i = 0; i < count && this.pool.length < this.maxSize; i++) {
|
|
36
|
-
this.pool.push(this.createFn());
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
/**
|
|
40
|
-
* 清空对象池
|
|
41
|
-
*/
|
|
42
|
-
clear() {
|
|
43
|
-
this.pool.length = 0;
|
|
44
|
-
}
|
|
45
|
-
/**
|
|
46
|
-
* 获取池中可用对象数量
|
|
47
|
-
*/
|
|
48
|
-
getAvailableCount() {
|
|
49
|
-
return this.pool.length;
|
|
50
|
-
}
|
|
51
|
-
/**
|
|
52
|
-
* 获取池的最大容量
|
|
53
|
-
*/
|
|
54
|
-
getMaxSize() {
|
|
55
|
-
return this.maxSize;
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
/**
|
|
59
|
-
* 全局组件池管理器
|
|
60
|
-
*/
|
|
61
|
-
export class ComponentPoolManager {
|
|
62
|
-
constructor() {
|
|
63
|
-
this.pools = new Map();
|
|
64
|
-
}
|
|
65
|
-
static getInstance() {
|
|
66
|
-
if (!ComponentPoolManager.instance) {
|
|
67
|
-
ComponentPoolManager.instance = new ComponentPoolManager();
|
|
68
|
-
}
|
|
69
|
-
return ComponentPoolManager.instance;
|
|
70
|
-
}
|
|
71
|
-
/**
|
|
72
|
-
* 注册组件池
|
|
73
|
-
*/
|
|
74
|
-
registerPool(componentName, createFn, resetFn, maxSize) {
|
|
75
|
-
this.pools.set(componentName, new ComponentPool(createFn, resetFn, maxSize));
|
|
76
|
-
}
|
|
77
|
-
/**
|
|
78
|
-
* 获取组件实例
|
|
79
|
-
*/
|
|
80
|
-
acquireComponent(componentName) {
|
|
81
|
-
const pool = this.pools.get(componentName);
|
|
82
|
-
return pool ? pool.acquire() : null;
|
|
83
|
-
}
|
|
84
|
-
/**
|
|
85
|
-
* 释放组件实例
|
|
86
|
-
*/
|
|
87
|
-
releaseComponent(componentName, component) {
|
|
88
|
-
const pool = this.pools.get(componentName);
|
|
89
|
-
if (pool) {
|
|
90
|
-
pool.release(component);
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
/**
|
|
94
|
-
* 预热所有池
|
|
95
|
-
*/
|
|
96
|
-
prewarmAll(count = 100) {
|
|
97
|
-
for (const pool of this.pools.values()) {
|
|
98
|
-
pool.prewarm(count);
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
/**
|
|
102
|
-
* 清空所有池
|
|
103
|
-
*/
|
|
104
|
-
clearAll() {
|
|
105
|
-
for (const pool of this.pools.values()) {
|
|
106
|
-
pool.clear();
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
/**
|
|
110
|
-
* 获取池统计信息
|
|
111
|
-
*/
|
|
112
|
-
getPoolStats() {
|
|
113
|
-
const stats = new Map();
|
|
114
|
-
for (const [name, pool] of this.pools) {
|
|
115
|
-
stats.set(name, {
|
|
116
|
-
available: pool.getAvailableCount(),
|
|
117
|
-
maxSize: pool.getMaxSize()
|
|
118
|
-
});
|
|
119
|
-
}
|
|
120
|
-
return stats;
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
//# sourceMappingURL=ComponentPool.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ComponentPool.js","sourceRoot":"","sources":["../../../src/ECS/Core/ComponentPool.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,182 +0,0 @@
|
|
|
1
|
-
import { Component } from '../Component';
|
|
2
|
-
/**
|
|
3
|
-
* 组件类型定义
|
|
4
|
-
*/
|
|
5
|
-
export type ComponentType<T extends Component = Component> = new (...args: any[]) => T;
|
|
6
|
-
/**
|
|
7
|
-
* 组件注册表
|
|
8
|
-
* 管理组件类型的位掩码分配
|
|
9
|
-
*/
|
|
10
|
-
export declare class ComponentRegistry {
|
|
11
|
-
private static componentTypes;
|
|
12
|
-
private static nextBitIndex;
|
|
13
|
-
private static maxComponents;
|
|
14
|
-
/**
|
|
15
|
-
* 注册组件类型并分配位掩码
|
|
16
|
-
* @param componentType 组件类型
|
|
17
|
-
* @returns 分配的位索引
|
|
18
|
-
*/
|
|
19
|
-
static register<T extends Component>(componentType: ComponentType<T>): number;
|
|
20
|
-
/**
|
|
21
|
-
* 获取组件类型的位掩码
|
|
22
|
-
* @param componentType 组件类型
|
|
23
|
-
* @returns 位掩码
|
|
24
|
-
*/
|
|
25
|
-
static getBitMask<T extends Component>(componentType: ComponentType<T>): bigint;
|
|
26
|
-
/**
|
|
27
|
-
* 获取组件类型的位索引
|
|
28
|
-
* @param componentType 组件类型
|
|
29
|
-
* @returns 位索引
|
|
30
|
-
*/
|
|
31
|
-
static getBitIndex<T extends Component>(componentType: ComponentType<T>): number;
|
|
32
|
-
/**
|
|
33
|
-
* 检查组件类型是否已注册
|
|
34
|
-
* @param componentType 组件类型
|
|
35
|
-
* @returns 是否已注册
|
|
36
|
-
*/
|
|
37
|
-
static isRegistered<T extends Component>(componentType: ComponentType<T>): boolean;
|
|
38
|
-
/**
|
|
39
|
-
* 获取所有已注册的组件类型
|
|
40
|
-
* @returns 组件类型映射
|
|
41
|
-
*/
|
|
42
|
-
static getAllRegisteredTypes(): Map<Function, number>;
|
|
43
|
-
}
|
|
44
|
-
/**
|
|
45
|
-
* 高性能组件存储器
|
|
46
|
-
* 使用SoA(Structure of Arrays)模式存储组件
|
|
47
|
-
*/
|
|
48
|
-
export declare class ComponentStorage<T extends Component> {
|
|
49
|
-
private components;
|
|
50
|
-
private entityToIndex;
|
|
51
|
-
private indexToEntity;
|
|
52
|
-
private freeIndices;
|
|
53
|
-
private componentType;
|
|
54
|
-
private _size;
|
|
55
|
-
constructor(componentType: ComponentType<T>);
|
|
56
|
-
/**
|
|
57
|
-
* 添加组件
|
|
58
|
-
* @param entityId 实体ID
|
|
59
|
-
* @param component 组件实例
|
|
60
|
-
*/
|
|
61
|
-
addComponent(entityId: number, component: T): void;
|
|
62
|
-
/**
|
|
63
|
-
* 获取组件
|
|
64
|
-
* @param entityId 实体ID
|
|
65
|
-
* @returns 组件实例或null
|
|
66
|
-
*/
|
|
67
|
-
getComponent(entityId: number): T | null;
|
|
68
|
-
/**
|
|
69
|
-
* 检查实体是否有此组件
|
|
70
|
-
* @param entityId 实体ID
|
|
71
|
-
* @returns 是否有组件
|
|
72
|
-
*/
|
|
73
|
-
hasComponent(entityId: number): boolean;
|
|
74
|
-
/**
|
|
75
|
-
* 移除组件
|
|
76
|
-
* @param entityId 实体ID
|
|
77
|
-
* @returns 被移除的组件或null
|
|
78
|
-
*/
|
|
79
|
-
removeComponent(entityId: number): T | null;
|
|
80
|
-
/**
|
|
81
|
-
* 高效遍历所有组件
|
|
82
|
-
* @param callback 回调函数
|
|
83
|
-
*/
|
|
84
|
-
forEach(callback: (component: T, entityId: number, index: number) => void): void;
|
|
85
|
-
/**
|
|
86
|
-
* 获取所有组件(密集数组)
|
|
87
|
-
* @returns 组件数组
|
|
88
|
-
*/
|
|
89
|
-
getDenseArray(): {
|
|
90
|
-
components: T[];
|
|
91
|
-
entityIds: number[];
|
|
92
|
-
};
|
|
93
|
-
/**
|
|
94
|
-
* 清空所有组件
|
|
95
|
-
*/
|
|
96
|
-
clear(): void;
|
|
97
|
-
/**
|
|
98
|
-
* 获取组件数量
|
|
99
|
-
*/
|
|
100
|
-
get size(): number;
|
|
101
|
-
/**
|
|
102
|
-
* 获取组件类型
|
|
103
|
-
*/
|
|
104
|
-
get type(): ComponentType<T>;
|
|
105
|
-
/**
|
|
106
|
-
* 压缩存储(移除空洞)
|
|
107
|
-
*/
|
|
108
|
-
compact(): void;
|
|
109
|
-
/**
|
|
110
|
-
* 获取存储统计信息
|
|
111
|
-
*/
|
|
112
|
-
getStats(): {
|
|
113
|
-
totalSlots: number;
|
|
114
|
-
usedSlots: number;
|
|
115
|
-
freeSlots: number;
|
|
116
|
-
fragmentation: number;
|
|
117
|
-
};
|
|
118
|
-
}
|
|
119
|
-
/**
|
|
120
|
-
* 组件存储管理器
|
|
121
|
-
* 管理所有组件类型的存储器
|
|
122
|
-
*/
|
|
123
|
-
export declare class ComponentStorageManager {
|
|
124
|
-
private storages;
|
|
125
|
-
/**
|
|
126
|
-
* 获取或创建组件存储器
|
|
127
|
-
* @param componentType 组件类型
|
|
128
|
-
* @returns 组件存储器
|
|
129
|
-
*/
|
|
130
|
-
getStorage<T extends Component>(componentType: ComponentType<T>): ComponentStorage<T>;
|
|
131
|
-
/**
|
|
132
|
-
* 添加组件
|
|
133
|
-
* @param entityId 实体ID
|
|
134
|
-
* @param component 组件实例
|
|
135
|
-
*/
|
|
136
|
-
addComponent<T extends Component>(entityId: number, component: T): void;
|
|
137
|
-
/**
|
|
138
|
-
* 获取组件
|
|
139
|
-
* @param entityId 实体ID
|
|
140
|
-
* @param componentType 组件类型
|
|
141
|
-
* @returns 组件实例或null
|
|
142
|
-
*/
|
|
143
|
-
getComponent<T extends Component>(entityId: number, componentType: ComponentType<T>): T | null;
|
|
144
|
-
/**
|
|
145
|
-
* 检查实体是否有组件
|
|
146
|
-
* @param entityId 实体ID
|
|
147
|
-
* @param componentType 组件类型
|
|
148
|
-
* @returns 是否有组件
|
|
149
|
-
*/
|
|
150
|
-
hasComponent<T extends Component>(entityId: number, componentType: ComponentType<T>): boolean;
|
|
151
|
-
/**
|
|
152
|
-
* 移除组件
|
|
153
|
-
* @param entityId 实体ID
|
|
154
|
-
* @param componentType 组件类型
|
|
155
|
-
* @returns 被移除的组件或null
|
|
156
|
-
*/
|
|
157
|
-
removeComponent<T extends Component>(entityId: number, componentType: ComponentType<T>): T | null;
|
|
158
|
-
/**
|
|
159
|
-
* 移除实体的所有组件
|
|
160
|
-
* @param entityId 实体ID
|
|
161
|
-
*/
|
|
162
|
-
removeAllComponents(entityId: number): void;
|
|
163
|
-
/**
|
|
164
|
-
* 获取实体的组件位掩码
|
|
165
|
-
* @param entityId 实体ID
|
|
166
|
-
* @returns 组件位掩码
|
|
167
|
-
*/
|
|
168
|
-
getComponentMask(entityId: number): bigint;
|
|
169
|
-
/**
|
|
170
|
-
* 压缩所有存储器
|
|
171
|
-
*/
|
|
172
|
-
compactAll(): void;
|
|
173
|
-
/**
|
|
174
|
-
* 获取所有存储器的统计信息
|
|
175
|
-
*/
|
|
176
|
-
getAllStats(): Map<string, any>;
|
|
177
|
-
/**
|
|
178
|
-
* 清空所有存储器
|
|
179
|
-
*/
|
|
180
|
-
clear(): void;
|
|
181
|
-
}
|
|
182
|
-
//# sourceMappingURL=ComponentStorage.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ComponentStorage.d.ts","sourceRoot":"","sources":["../../../src/ECS/Core/ComponentStorage.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,346 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 组件注册表
|
|
3
|
-
* 管理组件类型的位掩码分配
|
|
4
|
-
*/
|
|
5
|
-
export class ComponentRegistry {
|
|
6
|
-
/**
|
|
7
|
-
* 注册组件类型并分配位掩码
|
|
8
|
-
* @param componentType 组件类型
|
|
9
|
-
* @returns 分配的位索引
|
|
10
|
-
*/
|
|
11
|
-
static register(componentType) {
|
|
12
|
-
if (this.componentTypes.has(componentType)) {
|
|
13
|
-
return this.componentTypes.get(componentType);
|
|
14
|
-
}
|
|
15
|
-
if (this.nextBitIndex >= this.maxComponents) {
|
|
16
|
-
throw new Error(`Maximum number of component types (${this.maxComponents}) exceeded`);
|
|
17
|
-
}
|
|
18
|
-
const bitIndex = this.nextBitIndex++;
|
|
19
|
-
this.componentTypes.set(componentType, bitIndex);
|
|
20
|
-
return bitIndex;
|
|
21
|
-
}
|
|
22
|
-
/**
|
|
23
|
-
* 获取组件类型的位掩码
|
|
24
|
-
* @param componentType 组件类型
|
|
25
|
-
* @returns 位掩码
|
|
26
|
-
*/
|
|
27
|
-
static getBitMask(componentType) {
|
|
28
|
-
const bitIndex = this.componentTypes.get(componentType);
|
|
29
|
-
if (bitIndex === undefined) {
|
|
30
|
-
throw new Error(`Component type ${componentType.name} is not registered`);
|
|
31
|
-
}
|
|
32
|
-
return BigInt(1) << BigInt(bitIndex);
|
|
33
|
-
}
|
|
34
|
-
/**
|
|
35
|
-
* 获取组件类型的位索引
|
|
36
|
-
* @param componentType 组件类型
|
|
37
|
-
* @returns 位索引
|
|
38
|
-
*/
|
|
39
|
-
static getBitIndex(componentType) {
|
|
40
|
-
const bitIndex = this.componentTypes.get(componentType);
|
|
41
|
-
if (bitIndex === undefined) {
|
|
42
|
-
throw new Error(`Component type ${componentType.name} is not registered`);
|
|
43
|
-
}
|
|
44
|
-
return bitIndex;
|
|
45
|
-
}
|
|
46
|
-
/**
|
|
47
|
-
* 检查组件类型是否已注册
|
|
48
|
-
* @param componentType 组件类型
|
|
49
|
-
* @returns 是否已注册
|
|
50
|
-
*/
|
|
51
|
-
static isRegistered(componentType) {
|
|
52
|
-
return this.componentTypes.has(componentType);
|
|
53
|
-
}
|
|
54
|
-
/**
|
|
55
|
-
* 获取所有已注册的组件类型
|
|
56
|
-
* @returns 组件类型映射
|
|
57
|
-
*/
|
|
58
|
-
static getAllRegisteredTypes() {
|
|
59
|
-
return new Map(this.componentTypes);
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
ComponentRegistry.componentTypes = new Map();
|
|
63
|
-
ComponentRegistry.nextBitIndex = 0;
|
|
64
|
-
ComponentRegistry.maxComponents = 64; // 支持最多64种组件类型
|
|
65
|
-
/**
|
|
66
|
-
* 高性能组件存储器
|
|
67
|
-
* 使用SoA(Structure of Arrays)模式存储组件
|
|
68
|
-
*/
|
|
69
|
-
export class ComponentStorage {
|
|
70
|
-
constructor(componentType) {
|
|
71
|
-
this.components = [];
|
|
72
|
-
this.entityToIndex = new Map();
|
|
73
|
-
this.indexToEntity = [];
|
|
74
|
-
this.freeIndices = [];
|
|
75
|
-
this._size = 0;
|
|
76
|
-
this.componentType = componentType;
|
|
77
|
-
// 确保组件类型已注册
|
|
78
|
-
if (!ComponentRegistry.isRegistered(componentType)) {
|
|
79
|
-
ComponentRegistry.register(componentType);
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
/**
|
|
83
|
-
* 添加组件
|
|
84
|
-
* @param entityId 实体ID
|
|
85
|
-
* @param component 组件实例
|
|
86
|
-
*/
|
|
87
|
-
addComponent(entityId, component) {
|
|
88
|
-
// 检查实体是否已有此组件
|
|
89
|
-
if (this.entityToIndex.has(entityId)) {
|
|
90
|
-
throw new Error(`Entity ${entityId} already has component ${this.componentType.name}`);
|
|
91
|
-
}
|
|
92
|
-
let index;
|
|
93
|
-
if (this.freeIndices.length > 0) {
|
|
94
|
-
// 重用空闲索引
|
|
95
|
-
index = this.freeIndices.pop();
|
|
96
|
-
this.components[index] = component;
|
|
97
|
-
this.indexToEntity[index] = entityId;
|
|
98
|
-
}
|
|
99
|
-
else {
|
|
100
|
-
// 添加到末尾
|
|
101
|
-
index = this.components.length;
|
|
102
|
-
this.components.push(component);
|
|
103
|
-
this.indexToEntity.push(entityId);
|
|
104
|
-
}
|
|
105
|
-
this.entityToIndex.set(entityId, index);
|
|
106
|
-
this._size++;
|
|
107
|
-
}
|
|
108
|
-
/**
|
|
109
|
-
* 获取组件
|
|
110
|
-
* @param entityId 实体ID
|
|
111
|
-
* @returns 组件实例或null
|
|
112
|
-
*/
|
|
113
|
-
getComponent(entityId) {
|
|
114
|
-
const index = this.entityToIndex.get(entityId);
|
|
115
|
-
return index !== undefined ? this.components[index] : null;
|
|
116
|
-
}
|
|
117
|
-
/**
|
|
118
|
-
* 检查实体是否有此组件
|
|
119
|
-
* @param entityId 实体ID
|
|
120
|
-
* @returns 是否有组件
|
|
121
|
-
*/
|
|
122
|
-
hasComponent(entityId) {
|
|
123
|
-
return this.entityToIndex.has(entityId);
|
|
124
|
-
}
|
|
125
|
-
/**
|
|
126
|
-
* 移除组件
|
|
127
|
-
* @param entityId 实体ID
|
|
128
|
-
* @returns 被移除的组件或null
|
|
129
|
-
*/
|
|
130
|
-
removeComponent(entityId) {
|
|
131
|
-
const index = this.entityToIndex.get(entityId);
|
|
132
|
-
if (index === undefined) {
|
|
133
|
-
return null;
|
|
134
|
-
}
|
|
135
|
-
const component = this.components[index];
|
|
136
|
-
this.entityToIndex.delete(entityId);
|
|
137
|
-
this.components[index] = null;
|
|
138
|
-
this.freeIndices.push(index);
|
|
139
|
-
this._size--;
|
|
140
|
-
return component;
|
|
141
|
-
}
|
|
142
|
-
/**
|
|
143
|
-
* 高效遍历所有组件
|
|
144
|
-
* @param callback 回调函数
|
|
145
|
-
*/
|
|
146
|
-
forEach(callback) {
|
|
147
|
-
for (let i = 0; i < this.components.length; i++) {
|
|
148
|
-
const component = this.components[i];
|
|
149
|
-
if (component) {
|
|
150
|
-
callback(component, this.indexToEntity[i], i);
|
|
151
|
-
}
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
/**
|
|
155
|
-
* 获取所有组件(密集数组)
|
|
156
|
-
* @returns 组件数组
|
|
157
|
-
*/
|
|
158
|
-
getDenseArray() {
|
|
159
|
-
const components = [];
|
|
160
|
-
const entityIds = [];
|
|
161
|
-
for (let i = 0; i < this.components.length; i++) {
|
|
162
|
-
const component = this.components[i];
|
|
163
|
-
if (component) {
|
|
164
|
-
components.push(component);
|
|
165
|
-
entityIds.push(this.indexToEntity[i]);
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
return { components, entityIds };
|
|
169
|
-
}
|
|
170
|
-
/**
|
|
171
|
-
* 清空所有组件
|
|
172
|
-
*/
|
|
173
|
-
clear() {
|
|
174
|
-
this.components.length = 0;
|
|
175
|
-
this.entityToIndex.clear();
|
|
176
|
-
this.indexToEntity.length = 0;
|
|
177
|
-
this.freeIndices.length = 0;
|
|
178
|
-
this._size = 0;
|
|
179
|
-
}
|
|
180
|
-
/**
|
|
181
|
-
* 获取组件数量
|
|
182
|
-
*/
|
|
183
|
-
get size() {
|
|
184
|
-
return this._size;
|
|
185
|
-
}
|
|
186
|
-
/**
|
|
187
|
-
* 获取组件类型
|
|
188
|
-
*/
|
|
189
|
-
get type() {
|
|
190
|
-
return this.componentType;
|
|
191
|
-
}
|
|
192
|
-
/**
|
|
193
|
-
* 压缩存储(移除空洞)
|
|
194
|
-
*/
|
|
195
|
-
compact() {
|
|
196
|
-
if (this.freeIndices.length === 0) {
|
|
197
|
-
return; // 没有空洞,无需压缩
|
|
198
|
-
}
|
|
199
|
-
const newComponents = [];
|
|
200
|
-
const newIndexToEntity = [];
|
|
201
|
-
const newEntityToIndex = new Map();
|
|
202
|
-
let newIndex = 0;
|
|
203
|
-
for (let i = 0; i < this.components.length; i++) {
|
|
204
|
-
const component = this.components[i];
|
|
205
|
-
if (component) {
|
|
206
|
-
newComponents[newIndex] = component;
|
|
207
|
-
newIndexToEntity[newIndex] = this.indexToEntity[i];
|
|
208
|
-
newEntityToIndex.set(this.indexToEntity[i], newIndex);
|
|
209
|
-
newIndex++;
|
|
210
|
-
}
|
|
211
|
-
}
|
|
212
|
-
this.components = newComponents;
|
|
213
|
-
this.indexToEntity = newIndexToEntity;
|
|
214
|
-
this.entityToIndex = newEntityToIndex;
|
|
215
|
-
this.freeIndices.length = 0;
|
|
216
|
-
}
|
|
217
|
-
/**
|
|
218
|
-
* 获取存储统计信息
|
|
219
|
-
*/
|
|
220
|
-
getStats() {
|
|
221
|
-
const totalSlots = this.components.length;
|
|
222
|
-
const usedSlots = this._size;
|
|
223
|
-
const freeSlots = this.freeIndices.length;
|
|
224
|
-
const fragmentation = totalSlots > 0 ? freeSlots / totalSlots : 0;
|
|
225
|
-
return {
|
|
226
|
-
totalSlots,
|
|
227
|
-
usedSlots,
|
|
228
|
-
freeSlots,
|
|
229
|
-
fragmentation
|
|
230
|
-
};
|
|
231
|
-
}
|
|
232
|
-
}
|
|
233
|
-
/**
|
|
234
|
-
* 组件存储管理器
|
|
235
|
-
* 管理所有组件类型的存储器
|
|
236
|
-
*/
|
|
237
|
-
export class ComponentStorageManager {
|
|
238
|
-
constructor() {
|
|
239
|
-
this.storages = new Map();
|
|
240
|
-
}
|
|
241
|
-
/**
|
|
242
|
-
* 获取或创建组件存储器
|
|
243
|
-
* @param componentType 组件类型
|
|
244
|
-
* @returns 组件存储器
|
|
245
|
-
*/
|
|
246
|
-
getStorage(componentType) {
|
|
247
|
-
let storage = this.storages.get(componentType);
|
|
248
|
-
if (!storage) {
|
|
249
|
-
storage = new ComponentStorage(componentType);
|
|
250
|
-
this.storages.set(componentType, storage);
|
|
251
|
-
}
|
|
252
|
-
return storage;
|
|
253
|
-
}
|
|
254
|
-
/**
|
|
255
|
-
* 添加组件
|
|
256
|
-
* @param entityId 实体ID
|
|
257
|
-
* @param component 组件实例
|
|
258
|
-
*/
|
|
259
|
-
addComponent(entityId, component) {
|
|
260
|
-
const componentType = component.constructor;
|
|
261
|
-
const storage = this.getStorage(componentType);
|
|
262
|
-
storage.addComponent(entityId, component);
|
|
263
|
-
}
|
|
264
|
-
/**
|
|
265
|
-
* 获取组件
|
|
266
|
-
* @param entityId 实体ID
|
|
267
|
-
* @param componentType 组件类型
|
|
268
|
-
* @returns 组件实例或null
|
|
269
|
-
*/
|
|
270
|
-
getComponent(entityId, componentType) {
|
|
271
|
-
const storage = this.storages.get(componentType);
|
|
272
|
-
return storage ? storage.getComponent(entityId) : null;
|
|
273
|
-
}
|
|
274
|
-
/**
|
|
275
|
-
* 检查实体是否有组件
|
|
276
|
-
* @param entityId 实体ID
|
|
277
|
-
* @param componentType 组件类型
|
|
278
|
-
* @returns 是否有组件
|
|
279
|
-
*/
|
|
280
|
-
hasComponent(entityId, componentType) {
|
|
281
|
-
const storage = this.storages.get(componentType);
|
|
282
|
-
return storage ? storage.hasComponent(entityId) : false;
|
|
283
|
-
}
|
|
284
|
-
/**
|
|
285
|
-
* 移除组件
|
|
286
|
-
* @param entityId 实体ID
|
|
287
|
-
* @param componentType 组件类型
|
|
288
|
-
* @returns 被移除的组件或null
|
|
289
|
-
*/
|
|
290
|
-
removeComponent(entityId, componentType) {
|
|
291
|
-
const storage = this.storages.get(componentType);
|
|
292
|
-
return storage ? storage.removeComponent(entityId) : null;
|
|
293
|
-
}
|
|
294
|
-
/**
|
|
295
|
-
* 移除实体的所有组件
|
|
296
|
-
* @param entityId 实体ID
|
|
297
|
-
*/
|
|
298
|
-
removeAllComponents(entityId) {
|
|
299
|
-
for (const storage of this.storages.values()) {
|
|
300
|
-
storage.removeComponent(entityId);
|
|
301
|
-
}
|
|
302
|
-
}
|
|
303
|
-
/**
|
|
304
|
-
* 获取实体的组件位掩码
|
|
305
|
-
* @param entityId 实体ID
|
|
306
|
-
* @returns 组件位掩码
|
|
307
|
-
*/
|
|
308
|
-
getComponentMask(entityId) {
|
|
309
|
-
let mask = BigInt(0);
|
|
310
|
-
for (const [componentType, storage] of this.storages.entries()) {
|
|
311
|
-
if (storage.hasComponent(entityId)) {
|
|
312
|
-
mask |= ComponentRegistry.getBitMask(componentType);
|
|
313
|
-
}
|
|
314
|
-
}
|
|
315
|
-
return mask;
|
|
316
|
-
}
|
|
317
|
-
/**
|
|
318
|
-
* 压缩所有存储器
|
|
319
|
-
*/
|
|
320
|
-
compactAll() {
|
|
321
|
-
for (const storage of this.storages.values()) {
|
|
322
|
-
storage.compact();
|
|
323
|
-
}
|
|
324
|
-
}
|
|
325
|
-
/**
|
|
326
|
-
* 获取所有存储器的统计信息
|
|
327
|
-
*/
|
|
328
|
-
getAllStats() {
|
|
329
|
-
const stats = new Map();
|
|
330
|
-
for (const [componentType, storage] of this.storages.entries()) {
|
|
331
|
-
const typeName = componentType.name || 'Unknown';
|
|
332
|
-
stats.set(typeName, storage.getStats());
|
|
333
|
-
}
|
|
334
|
-
return stats;
|
|
335
|
-
}
|
|
336
|
-
/**
|
|
337
|
-
* 清空所有存储器
|
|
338
|
-
*/
|
|
339
|
-
clear() {
|
|
340
|
-
for (const storage of this.storages.values()) {
|
|
341
|
-
storage.clear();
|
|
342
|
-
}
|
|
343
|
-
this.storages.clear();
|
|
344
|
-
}
|
|
345
|
-
}
|
|
346
|
-
//# sourceMappingURL=ComponentStorage.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ComponentStorage.js","sourceRoot":"","sources":["../../../src/ECS/Core/ComponentStorage.ts"],"names":[],"mappings":"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"}
|