@esengine/ecs-framework 2.1.29 → 2.1.30
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/bin/Core.d.ts +279 -0
- package/bin/Core.d.ts.map +1 -0
- package/bin/Core.js +400 -0
- package/bin/Core.js.map +1 -0
- package/bin/ECS/Component.d.ts +120 -0
- package/bin/ECS/Component.d.ts.map +1 -0
- package/bin/ECS/Component.js +129 -0
- package/bin/ECS/Component.js.map +1 -0
- package/bin/ECS/Components/IUpdatable.d.ts +22 -0
- package/bin/ECS/Components/IUpdatable.d.ts.map +1 -0
- package/bin/ECS/Components/IUpdatable.js +17 -0
- package/bin/ECS/Components/IUpdatable.js.map +1 -0
- package/bin/ECS/Components/SceneComponent.d.ts +40 -0
- package/bin/ECS/Components/SceneComponent.d.ts.map +1 -0
- package/bin/ECS/Components/SceneComponent.js +57 -0
- package/bin/ECS/Components/SceneComponent.js.map +1 -0
- package/bin/ECS/Core/ArchetypeSystem.d.ts +100 -0
- package/bin/ECS/Core/ArchetypeSystem.d.ts.map +1 -0
- package/bin/ECS/Core/ArchetypeSystem.js +193 -0
- package/bin/ECS/Core/ArchetypeSystem.js.map +1 -0
- package/bin/ECS/Core/ComponentIndex.d.ts +151 -0
- package/bin/ECS/Core/ComponentIndex.d.ts.map +1 -0
- package/bin/ECS/Core/ComponentIndex.js +405 -0
- package/bin/ECS/Core/ComponentIndex.js.map +1 -0
- package/bin/ECS/Core/ComponentPool.d.ts +88 -0
- package/bin/ECS/Core/ComponentPool.d.ts.map +1 -0
- package/bin/ECS/Core/ComponentPool.js +159 -0
- package/bin/ECS/Core/ComponentPool.js.map +1 -0
- package/bin/ECS/Core/ComponentStorage/ComponentRegistry.d.ts +92 -0
- package/bin/ECS/Core/ComponentStorage/ComponentRegistry.d.ts.map +1 -0
- package/bin/ECS/Core/ComponentStorage/ComponentRegistry.js +167 -0
- package/bin/ECS/Core/ComponentStorage/ComponentRegistry.js.map +1 -0
- package/bin/ECS/Core/ComponentStorage.d.ts +233 -0
- package/bin/ECS/Core/ComponentStorage.d.ts.map +1 -0
- package/bin/ECS/Core/ComponentStorage.js +463 -0
- package/bin/ECS/Core/ComponentStorage.js.map +1 -0
- package/bin/ECS/Core/DirtyTrackingSystem.d.ts +197 -0
- package/bin/ECS/Core/DirtyTrackingSystem.d.ts.map +1 -0
- package/bin/ECS/Core/DirtyTrackingSystem.js +297 -0
- package/bin/ECS/Core/DirtyTrackingSystem.js.map +1 -0
- package/bin/ECS/Core/EntityManager.d.ts +379 -0
- package/bin/ECS/Core/EntityManager.d.ts.map +1 -0
- package/bin/ECS/Core/EntityManager.js +686 -0
- package/bin/ECS/Core/EntityManager.js.map +1 -0
- package/bin/ECS/Core/EventBus.d.ts +218 -0
- package/bin/ECS/Core/EventBus.d.ts.map +1 -0
- package/bin/ECS/Core/EventBus.js +402 -0
- package/bin/ECS/Core/EventBus.js.map +1 -0
- package/bin/ECS/Core/EventSystem.d.ts +237 -0
- package/bin/ECS/Core/EventSystem.d.ts.map +1 -0
- package/bin/ECS/Core/EventSystem.js +478 -0
- package/bin/ECS/Core/EventSystem.js.map +1 -0
- package/bin/ECS/Core/Events/index.d.ts +3 -0
- package/bin/ECS/Core/Events/index.d.ts.map +1 -0
- package/bin/ECS/Core/Events/index.js +3 -0
- package/bin/ECS/Core/Events/index.js.map +1 -0
- package/bin/ECS/Core/FluentAPI/ComponentBuilder.d.ts +35 -0
- package/bin/ECS/Core/FluentAPI/ComponentBuilder.d.ts.map +1 -0
- package/bin/ECS/Core/FluentAPI/ComponentBuilder.js +48 -0
- package/bin/ECS/Core/FluentAPI/ComponentBuilder.js.map +1 -0
- package/bin/ECS/Core/FluentAPI/ECSFluentAPI.d.ts +135 -0
- package/bin/ECS/Core/FluentAPI/ECSFluentAPI.d.ts.map +1 -0
- package/bin/ECS/Core/FluentAPI/ECSFluentAPI.js +166 -0
- package/bin/ECS/Core/FluentAPI/ECSFluentAPI.js.map +1 -0
- package/bin/ECS/Core/FluentAPI/EntityBatchOperator.d.ts +58 -0
- package/bin/ECS/Core/FluentAPI/EntityBatchOperator.d.ts.map +1 -0
- package/bin/ECS/Core/FluentAPI/EntityBatchOperator.js +85 -0
- package/bin/ECS/Core/FluentAPI/EntityBatchOperator.js.map +1 -0
- package/bin/ECS/Core/FluentAPI/EntityBuilder.d.ts +110 -0
- package/bin/ECS/Core/FluentAPI/EntityBuilder.d.ts.map +1 -0
- package/bin/ECS/Core/FluentAPI/EntityBuilder.js +174 -0
- package/bin/ECS/Core/FluentAPI/EntityBuilder.js.map +1 -0
- package/bin/ECS/Core/FluentAPI/SceneBuilder.d.ts +53 -0
- package/bin/ECS/Core/FluentAPI/SceneBuilder.d.ts.map +1 -0
- package/bin/ECS/Core/FluentAPI/SceneBuilder.js +79 -0
- package/bin/ECS/Core/FluentAPI/SceneBuilder.js.map +1 -0
- package/bin/ECS/Core/FluentAPI/index.d.ts +6 -0
- package/bin/ECS/Core/FluentAPI/index.d.ts.map +1 -0
- package/bin/ECS/Core/FluentAPI/index.js +6 -0
- package/bin/ECS/Core/FluentAPI/index.js.map +1 -0
- package/bin/ECS/Core/FluentAPI.d.ts +2 -0
- package/bin/ECS/Core/FluentAPI.d.ts.map +1 -0
- package/bin/ECS/Core/FluentAPI.js +3 -0
- package/bin/ECS/Core/FluentAPI.js.map +1 -0
- package/bin/ECS/Core/Performance/index.d.ts +4 -0
- package/bin/ECS/Core/Performance/index.d.ts.map +1 -0
- package/bin/ECS/Core/Performance/index.js +4 -0
- package/bin/ECS/Core/Performance/index.js.map +1 -0
- package/bin/ECS/Core/Query/index.d.ts +4 -0
- package/bin/ECS/Core/Query/index.d.ts.map +1 -0
- package/bin/ECS/Core/Query/index.js +4 -0
- package/bin/ECS/Core/Query/index.js.map +1 -0
- package/bin/ECS/Core/QuerySystem.d.ts +438 -0
- package/bin/ECS/Core/QuerySystem.d.ts.map +1 -0
- package/bin/ECS/Core/QuerySystem.js +974 -0
- package/bin/ECS/Core/QuerySystem.js.map +1 -0
- package/bin/ECS/Core/SoAStorage.d.ts +97 -0
- package/bin/ECS/Core/SoAStorage.d.ts.map +1 -0
- package/bin/ECS/Core/SoAStorage.js +548 -0
- package/bin/ECS/Core/SoAStorage.js.map +1 -0
- package/bin/ECS/Core/Storage/index.d.ts +4 -0
- package/bin/ECS/Core/Storage/index.d.ts.map +1 -0
- package/bin/ECS/Core/Storage/index.js +4 -0
- package/bin/ECS/Core/Storage/index.js.map +1 -0
- package/bin/ECS/CoreEvents.d.ts +131 -0
- package/bin/ECS/CoreEvents.d.ts.map +1 -0
- package/bin/ECS/CoreEvents.js +163 -0
- package/bin/ECS/CoreEvents.js.map +1 -0
- package/bin/ECS/Entity.d.ts +455 -0
- package/bin/ECS/Entity.d.ts.map +1 -0
- package/bin/ECS/Entity.js +837 -0
- package/bin/ECS/Entity.js.map +1 -0
- package/bin/ECS/Scene.d.ts +225 -0
- package/bin/ECS/Scene.d.ts.map +1 -0
- package/bin/ECS/Scene.js +325 -0
- package/bin/ECS/Scene.js.map +1 -0
- package/bin/ECS/Systems/EntitySystem.d.ts +200 -0
- package/bin/ECS/Systems/EntitySystem.d.ts.map +1 -0
- package/bin/ECS/Systems/EntitySystem.js +431 -0
- package/bin/ECS/Systems/EntitySystem.js.map +1 -0
- package/bin/ECS/Systems/IntervalSystem.d.ts +33 -0
- package/bin/ECS/Systems/IntervalSystem.d.ts.map +1 -0
- package/bin/ECS/Systems/IntervalSystem.js +50 -0
- package/bin/ECS/Systems/IntervalSystem.js.map +1 -0
- package/bin/ECS/Systems/PassiveSystem.d.ts +17 -0
- package/bin/ECS/Systems/PassiveSystem.d.ts.map +1 -0
- package/bin/ECS/Systems/PassiveSystem.js +19 -0
- package/bin/ECS/Systems/PassiveSystem.js.map +1 -0
- package/bin/ECS/Systems/ProcessingSystem.d.ts +21 -0
- package/bin/ECS/Systems/ProcessingSystem.d.ts.map +1 -0
- package/bin/ECS/Systems/ProcessingSystem.js +20 -0
- package/bin/ECS/Systems/ProcessingSystem.js.map +1 -0
- package/bin/ECS/Systems/index.d.ts +5 -0
- package/bin/ECS/Systems/index.d.ts.map +1 -0
- package/bin/ECS/Systems/index.js +6 -0
- package/bin/ECS/Systems/index.js.map +1 -0
- package/bin/ECS/Utils/BigIntCompatibility.d.ts +164 -0
- package/bin/ECS/Utils/BigIntCompatibility.d.ts.map +1 -0
- package/bin/ECS/Utils/BigIntCompatibility.js +578 -0
- package/bin/ECS/Utils/BigIntCompatibility.js.map +1 -0
- package/bin/ECS/Utils/Bits.d.ts +163 -0
- package/bin/ECS/Utils/Bits.d.ts.map +1 -0
- package/bin/ECS/Utils/Bits.js +286 -0
- package/bin/ECS/Utils/Bits.js.map +1 -0
- package/bin/ECS/Utils/ComponentTypeManager.d.ts +50 -0
- package/bin/ECS/Utils/ComponentTypeManager.d.ts.map +1 -0
- package/bin/ECS/Utils/ComponentTypeManager.js +84 -0
- package/bin/ECS/Utils/ComponentTypeManager.js.map +1 -0
- package/bin/ECS/Utils/EntityList.d.ts +108 -0
- package/bin/ECS/Utils/EntityList.d.ts.map +1 -0
- package/bin/ECS/Utils/EntityList.js +262 -0
- package/bin/ECS/Utils/EntityList.js.map +1 -0
- package/bin/ECS/Utils/EntityProcessorList.d.ts +56 -0
- package/bin/ECS/Utils/EntityProcessorList.d.ts.map +1 -0
- package/bin/ECS/Utils/EntityProcessorList.js +102 -0
- package/bin/ECS/Utils/EntityProcessorList.js.map +1 -0
- package/bin/ECS/Utils/IdentifierPool.d.ts +203 -0
- package/bin/ECS/Utils/IdentifierPool.d.ts.map +1 -0
- package/bin/ECS/Utils/IdentifierPool.js +325 -0
- package/bin/ECS/Utils/IdentifierPool.js.map +1 -0
- package/bin/ECS/Utils/Matcher.d.ts +143 -0
- package/bin/ECS/Utils/Matcher.d.ts.map +1 -0
- package/bin/ECS/Utils/Matcher.js +249 -0
- package/bin/ECS/Utils/Matcher.js.map +1 -0
- package/bin/ECS/Utils/index.d.ts +8 -0
- package/bin/ECS/Utils/index.d.ts.map +1 -0
- package/bin/ECS/Utils/index.js +9 -0
- package/bin/ECS/Utils/index.js.map +1 -0
- package/bin/ECS/index.d.ts +12 -0
- package/bin/ECS/index.d.ts.map +1 -0
- package/bin/ECS/index.js +12 -0
- package/bin/ECS/index.js.map +1 -0
- package/bin/Types/index.d.ts +471 -0
- package/bin/Types/index.d.ts.map +1 -0
- package/bin/Types/index.js +5 -0
- package/bin/Types/index.js.map +1 -0
- package/bin/Utils/Debug/ComponentDataCollector.d.ts +28 -0
- package/bin/Utils/Debug/ComponentDataCollector.d.ts.map +1 -0
- package/bin/Utils/Debug/ComponentDataCollector.js +248 -0
- package/bin/Utils/Debug/ComponentDataCollector.js.map +1 -0
- package/bin/Utils/Debug/DebugDataFormatter.d.ts +22 -0
- package/bin/Utils/Debug/DebugDataFormatter.d.ts.map +1 -0
- package/bin/Utils/Debug/DebugDataFormatter.js +117 -0
- package/bin/Utils/Debug/DebugDataFormatter.js.map +1 -0
- package/bin/Utils/Debug/DebugManager.d.ts +104 -0
- package/bin/Utils/Debug/DebugManager.d.ts.map +1 -0
- package/bin/Utils/Debug/DebugManager.js +647 -0
- package/bin/Utils/Debug/DebugManager.js.map +1 -0
- package/bin/Utils/Debug/EntityDataCollector.d.ts +92 -0
- package/bin/Utils/Debug/EntityDataCollector.d.ts.map +1 -0
- package/bin/Utils/Debug/EntityDataCollector.js +864 -0
- package/bin/Utils/Debug/EntityDataCollector.js.map +1 -0
- package/bin/Utils/Debug/PerformanceDataCollector.d.ts +32 -0
- package/bin/Utils/Debug/PerformanceDataCollector.d.ts.map +1 -0
- package/bin/Utils/Debug/PerformanceDataCollector.js +217 -0
- package/bin/Utils/Debug/PerformanceDataCollector.js.map +1 -0
- package/bin/Utils/Debug/SceneDataCollector.d.ts +16 -0
- package/bin/Utils/Debug/SceneDataCollector.d.ts.map +1 -0
- package/bin/Utils/Debug/SceneDataCollector.js +46 -0
- package/bin/Utils/Debug/SceneDataCollector.js.map +1 -0
- package/bin/Utils/Debug/SystemDataCollector.d.ts +11 -0
- package/bin/Utils/Debug/SystemDataCollector.d.ts.map +1 -0
- package/bin/Utils/Debug/SystemDataCollector.js +59 -0
- package/bin/Utils/Debug/SystemDataCollector.js.map +1 -0
- package/bin/Utils/Debug/WebSocketManager.d.ts +59 -0
- package/bin/Utils/Debug/WebSocketManager.d.ts.map +1 -0
- package/bin/Utils/Debug/WebSocketManager.js +148 -0
- package/bin/Utils/Debug/WebSocketManager.js.map +1 -0
- package/bin/Utils/Debug/index.d.ts +8 -0
- package/bin/Utils/Debug/index.d.ts.map +1 -0
- package/bin/Utils/Debug/index.js +8 -0
- package/bin/Utils/Debug/index.js.map +1 -0
- package/bin/Utils/Emitter.d.ts +43 -0
- package/bin/Utils/Emitter.d.ts.map +1 -0
- package/bin/Utils/Emitter.js +69 -0
- package/bin/Utils/Emitter.js.map +1 -0
- package/bin/Utils/Extensions/NumberExtension.d.ts +13 -0
- package/bin/Utils/Extensions/NumberExtension.d.ts.map +1 -0
- package/bin/Utils/Extensions/NumberExtension.js +17 -0
- package/bin/Utils/Extensions/NumberExtension.js.map +1 -0
- package/bin/Utils/Extensions/TypeUtils.d.ts +13 -0
- package/bin/Utils/Extensions/TypeUtils.d.ts.map +1 -0
- package/bin/Utils/Extensions/TypeUtils.js +15 -0
- package/bin/Utils/Extensions/TypeUtils.js.map +1 -0
- package/bin/Utils/Extensions/index.d.ts +3 -0
- package/bin/Utils/Extensions/index.d.ts.map +1 -0
- package/bin/Utils/Extensions/index.js +4 -0
- package/bin/Utils/Extensions/index.js.map +1 -0
- package/bin/Utils/GlobalManager.d.ts +32 -0
- package/bin/Utils/GlobalManager.d.ts.map +1 -0
- package/bin/Utils/GlobalManager.js +53 -0
- package/bin/Utils/GlobalManager.js.map +1 -0
- package/bin/Utils/Logger.d.ts +156 -0
- package/bin/Utils/Logger.d.ts.map +1 -0
- package/bin/Utils/Logger.js +256 -0
- package/bin/Utils/Logger.js.map +1 -0
- package/bin/Utils/PerformanceMonitor.d.ts +211 -0
- package/bin/Utils/PerformanceMonitor.d.ts.map +1 -0
- package/bin/Utils/PerformanceMonitor.js +270 -0
- package/bin/Utils/PerformanceMonitor.js.map +1 -0
- package/bin/Utils/Pool/IPoolable.d.ts +29 -0
- package/bin/Utils/Pool/IPoolable.d.ts.map +1 -0
- package/bin/Utils/Pool/IPoolable.js +2 -0
- package/bin/Utils/Pool/IPoolable.js.map +1 -0
- package/bin/Utils/Pool/Pool.d.ts +109 -0
- package/bin/Utils/Pool/Pool.d.ts.map +1 -0
- package/bin/Utils/Pool/Pool.js +238 -0
- package/bin/Utils/Pool/Pool.js.map +1 -0
- package/bin/Utils/Pool/PoolManager.d.ts +91 -0
- package/bin/Utils/Pool/PoolManager.d.ts.map +1 -0
- package/bin/Utils/Pool/PoolManager.js +197 -0
- package/bin/Utils/Pool/PoolManager.js.map +1 -0
- package/bin/Utils/Pool/index.d.ts +4 -0
- package/bin/Utils/Pool/index.d.ts.map +1 -0
- package/bin/Utils/Pool/index.js +4 -0
- package/bin/Utils/Pool/index.js.map +1 -0
- package/bin/Utils/Time.d.ts +47 -0
- package/bin/Utils/Time.d.ts.map +1 -0
- package/bin/Utils/Time.js +64 -0
- package/bin/Utils/Time.js.map +1 -0
- package/bin/Utils/Timers/ITimer.d.ts +16 -0
- package/bin/Utils/Timers/ITimer.d.ts.map +1 -0
- package/bin/Utils/Timers/ITimer.js +2 -0
- package/bin/Utils/Timers/ITimer.js.map +1 -0
- package/bin/Utils/Timers/Timer.d.ts +30 -0
- package/bin/Utils/Timers/Timer.d.ts.map +1 -0
- package/bin/Utils/Timers/Timer.js +58 -0
- package/bin/Utils/Timers/Timer.js.map +1 -0
- package/bin/Utils/Timers/TimerManager.d.ts +19 -0
- package/bin/Utils/Timers/TimerManager.d.ts.map +1 -0
- package/bin/Utils/Timers/TimerManager.js +33 -0
- package/bin/Utils/Timers/TimerManager.js.map +1 -0
- package/bin/Utils/index.d.ts +9 -0
- package/bin/Utils/index.d.ts.map +1 -0
- package/bin/Utils/index.js +9 -0
- package/bin/Utils/index.js.map +1 -0
- package/bin/index.d.ts +16 -0
- package/bin/index.d.ts.map +1 -0
- package/bin/index.js +19 -0
- package/bin/index.js.map +1 -0
- package/package.json +52 -25
- package/.npmignore +0 -40
- package/LICENSE +0 -201
- package/README.md +0 -465
- package/SECURITY.md +0 -53
- package/index.cjs +0 -2
- package/index.cjs.map +0 -1
- package/index.d.ts +0 -6562
- package/index.mjs +0 -2
- package/index.mjs.map +0 -1
|
@@ -0,0 +1,297 @@
|
|
|
1
|
+
import { createLogger } from '../../Utils/Logger';
|
|
2
|
+
/**
|
|
3
|
+
* 脏标记类型
|
|
4
|
+
*/
|
|
5
|
+
export var DirtyFlag;
|
|
6
|
+
(function (DirtyFlag) {
|
|
7
|
+
/** 组件数据已修改 */
|
|
8
|
+
DirtyFlag[DirtyFlag["COMPONENT_MODIFIED"] = 1] = "COMPONENT_MODIFIED";
|
|
9
|
+
/** 组件已添加 */
|
|
10
|
+
DirtyFlag[DirtyFlag["COMPONENT_ADDED"] = 2] = "COMPONENT_ADDED";
|
|
11
|
+
/** 组件已移除 */
|
|
12
|
+
DirtyFlag[DirtyFlag["COMPONENT_REMOVED"] = 4] = "COMPONENT_REMOVED";
|
|
13
|
+
/** 实体位置已改变 */
|
|
14
|
+
DirtyFlag[DirtyFlag["TRANSFORM_CHANGED"] = 8] = "TRANSFORM_CHANGED";
|
|
15
|
+
/** 实体状态已改变 */
|
|
16
|
+
DirtyFlag[DirtyFlag["STATE_CHANGED"] = 16] = "STATE_CHANGED";
|
|
17
|
+
/** 自定义标记1 */
|
|
18
|
+
DirtyFlag[DirtyFlag["CUSTOM_1"] = 256] = "CUSTOM_1";
|
|
19
|
+
/** 自定义标记2 */
|
|
20
|
+
DirtyFlag[DirtyFlag["CUSTOM_2"] = 512] = "CUSTOM_2";
|
|
21
|
+
/** 自定义标记3 */
|
|
22
|
+
DirtyFlag[DirtyFlag["CUSTOM_3"] = 1024] = "CUSTOM_3";
|
|
23
|
+
/** 所有标记 */
|
|
24
|
+
DirtyFlag[DirtyFlag["ALL"] = 4294967295] = "ALL";
|
|
25
|
+
})(DirtyFlag || (DirtyFlag = {}));
|
|
26
|
+
/**
|
|
27
|
+
* 脏标记追踪系统
|
|
28
|
+
*
|
|
29
|
+
* 提供高效的组件和实体变更追踪,避免不必要的计算和更新。
|
|
30
|
+
* 支持细粒度的脏标记和批量处理机制。
|
|
31
|
+
*
|
|
32
|
+
* @example
|
|
33
|
+
* ```typescript
|
|
34
|
+
* const dirtySystem = new DirtyTrackingSystem();
|
|
35
|
+
*
|
|
36
|
+
* // 标记实体的位置组件已修改
|
|
37
|
+
* dirtySystem.markDirty(entity, DirtyFlag.TRANSFORM_CHANGED, [PositionComponent]);
|
|
38
|
+
*
|
|
39
|
+
* // 监听位置变化
|
|
40
|
+
* dirtySystem.addListener({
|
|
41
|
+
* flags: DirtyFlag.TRANSFORM_CHANGED,
|
|
42
|
+
* callback: (data) => {
|
|
43
|
+
* logger.debug('Entity position changed:', data.entity.name);
|
|
44
|
+
* }
|
|
45
|
+
* });
|
|
46
|
+
*
|
|
47
|
+
* // 处理所有脏标记
|
|
48
|
+
* dirtySystem.processDirtyEntities();
|
|
49
|
+
* ```
|
|
50
|
+
*/
|
|
51
|
+
export class DirtyTrackingSystem {
|
|
52
|
+
constructor() {
|
|
53
|
+
/** 脏实体映射表 */
|
|
54
|
+
this._dirtyEntities = new Map();
|
|
55
|
+
/** 脏标记监听器 */
|
|
56
|
+
this._listeners = [];
|
|
57
|
+
/** 性能统计 */
|
|
58
|
+
this._stats = {
|
|
59
|
+
totalMarkings: 0,
|
|
60
|
+
totalCleanups: 0,
|
|
61
|
+
frameCount: 0,
|
|
62
|
+
totalDirtyPerFrame: 0
|
|
63
|
+
};
|
|
64
|
+
/** 当前帧编号 */
|
|
65
|
+
this._currentFrame = 0;
|
|
66
|
+
this._batchSize = 100;
|
|
67
|
+
this._maxProcessingTime = 16;
|
|
68
|
+
/** 延迟处理队列 */
|
|
69
|
+
this._processingQueue = [];
|
|
70
|
+
this._isProcessing = false;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* 标记实体为脏状态
|
|
74
|
+
*
|
|
75
|
+
* @param entity 要标记的实体
|
|
76
|
+
* @param flags 脏标记位
|
|
77
|
+
* @param modifiedComponents 修改的组件类型列表
|
|
78
|
+
*/
|
|
79
|
+
markDirty(entity, flags, modifiedComponents = []) {
|
|
80
|
+
this._stats.totalMarkings++;
|
|
81
|
+
let dirtyData = this._dirtyEntities.get(entity);
|
|
82
|
+
if (!dirtyData) {
|
|
83
|
+
dirtyData = {
|
|
84
|
+
entity,
|
|
85
|
+
flags: 0,
|
|
86
|
+
modifiedComponents: new Set(),
|
|
87
|
+
timestamp: performance.now(),
|
|
88
|
+
frameNumber: this._currentFrame
|
|
89
|
+
};
|
|
90
|
+
this._dirtyEntities.set(entity, dirtyData);
|
|
91
|
+
}
|
|
92
|
+
dirtyData.flags |= flags;
|
|
93
|
+
dirtyData.timestamp = performance.now();
|
|
94
|
+
dirtyData.frameNumber = this._currentFrame;
|
|
95
|
+
for (const componentType of modifiedComponents) {
|
|
96
|
+
dirtyData.modifiedComponents.add(componentType);
|
|
97
|
+
}
|
|
98
|
+
this.notifyListeners(dirtyData, flags);
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* 检查实体是否有指定的脏标记
|
|
102
|
+
*
|
|
103
|
+
* @param entity 要检查的实体
|
|
104
|
+
* @param flags 要检查的标记位
|
|
105
|
+
* @returns 是否有指定的脏标记
|
|
106
|
+
*/
|
|
107
|
+
isDirty(entity, flags = DirtyFlag.ALL) {
|
|
108
|
+
const dirtyData = this._dirtyEntities.get(entity);
|
|
109
|
+
return dirtyData ? (dirtyData.flags & flags) !== 0 : false;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* 清除实体的脏标记
|
|
113
|
+
*
|
|
114
|
+
* @param entity 要清除的实体
|
|
115
|
+
* @param flags 要清除的标记位,默认清除所有
|
|
116
|
+
*/
|
|
117
|
+
clearDirty(entity, flags = DirtyFlag.ALL) {
|
|
118
|
+
const dirtyData = this._dirtyEntities.get(entity);
|
|
119
|
+
if (!dirtyData)
|
|
120
|
+
return;
|
|
121
|
+
if (flags === DirtyFlag.ALL) {
|
|
122
|
+
this._dirtyEntities.delete(entity);
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
dirtyData.flags &= ~flags;
|
|
126
|
+
if (dirtyData.flags === 0) {
|
|
127
|
+
this._dirtyEntities.delete(entity);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
this._stats.totalCleanups++;
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* 获取所有脏实体
|
|
134
|
+
*
|
|
135
|
+
* @param flags 过滤标记位,只返回包含指定标记的实体
|
|
136
|
+
* @returns 脏实体数据数组
|
|
137
|
+
*/
|
|
138
|
+
getDirtyEntities(flags = DirtyFlag.ALL) {
|
|
139
|
+
const result = [];
|
|
140
|
+
for (const dirtyData of this._dirtyEntities.values()) {
|
|
141
|
+
if ((dirtyData.flags & flags) !== 0) {
|
|
142
|
+
result.push(dirtyData);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
return result;
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* 批量处理脏实体
|
|
149
|
+
*
|
|
150
|
+
* 使用时间分片的方式处理脏实体,避免单帧卡顿
|
|
151
|
+
*/
|
|
152
|
+
processDirtyEntities() {
|
|
153
|
+
if (this._isProcessing)
|
|
154
|
+
return;
|
|
155
|
+
this._isProcessing = true;
|
|
156
|
+
const startTime = performance.now();
|
|
157
|
+
if (this._processingQueue.length === 0) {
|
|
158
|
+
this._processingQueue.push(...this._dirtyEntities.values());
|
|
159
|
+
}
|
|
160
|
+
let processed = 0;
|
|
161
|
+
while (this._processingQueue.length > 0 && processed < this._batchSize) {
|
|
162
|
+
const elapsed = performance.now() - startTime;
|
|
163
|
+
if (elapsed > this._maxProcessingTime) {
|
|
164
|
+
break;
|
|
165
|
+
}
|
|
166
|
+
const dirtyData = this._processingQueue.shift();
|
|
167
|
+
this.processEntity(dirtyData);
|
|
168
|
+
processed++;
|
|
169
|
+
}
|
|
170
|
+
if (this._processingQueue.length === 0) {
|
|
171
|
+
this._isProcessing = false;
|
|
172
|
+
this.onFrameEnd();
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* 添加脏标记监听器
|
|
177
|
+
*
|
|
178
|
+
* @param listener 监听器配置
|
|
179
|
+
*/
|
|
180
|
+
addListener(listener) {
|
|
181
|
+
this._listeners.push(listener);
|
|
182
|
+
this._listeners.sort((a, b) => (a.priority || 100) - (b.priority || 100));
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* 移除脏标记监听器
|
|
186
|
+
*
|
|
187
|
+
* @param callback 要移除的回调函数
|
|
188
|
+
*/
|
|
189
|
+
removeListener(callback) {
|
|
190
|
+
const index = this._listeners.findIndex(l => l.callback === callback);
|
|
191
|
+
if (index !== -1) {
|
|
192
|
+
this._listeners.splice(index, 1);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* 开始新的帧
|
|
197
|
+
*/
|
|
198
|
+
beginFrame() {
|
|
199
|
+
this._currentFrame++;
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* 结束当前帧
|
|
203
|
+
*/
|
|
204
|
+
endFrame() {
|
|
205
|
+
if (!this._isProcessing) {
|
|
206
|
+
this.processDirtyEntities();
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* 获取统计信息
|
|
211
|
+
*/
|
|
212
|
+
getStats() {
|
|
213
|
+
return {
|
|
214
|
+
dirtyEntityCount: this._dirtyEntities.size,
|
|
215
|
+
totalMarkings: this._stats.totalMarkings,
|
|
216
|
+
totalCleanups: this._stats.totalCleanups,
|
|
217
|
+
listenerCount: this._listeners.length,
|
|
218
|
+
avgDirtyPerFrame: this._stats.frameCount > 0 ?
|
|
219
|
+
this._stats.totalDirtyPerFrame / this._stats.frameCount : 0,
|
|
220
|
+
estimatedMemoryUsage: this.estimateMemoryUsage()
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* 清空所有脏标记和统计信息
|
|
225
|
+
*/
|
|
226
|
+
clear() {
|
|
227
|
+
this._dirtyEntities.clear();
|
|
228
|
+
this._processingQueue.length = 0;
|
|
229
|
+
this._isProcessing = false;
|
|
230
|
+
this._stats = {
|
|
231
|
+
totalMarkings: 0,
|
|
232
|
+
totalCleanups: 0,
|
|
233
|
+
frameCount: 0,
|
|
234
|
+
totalDirtyPerFrame: 0
|
|
235
|
+
};
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* 配置批量处理参数
|
|
239
|
+
*
|
|
240
|
+
* @param batchSize 每次处理的最大实体数量
|
|
241
|
+
* @param maxProcessingTime 每帧最大处理时间(毫秒)
|
|
242
|
+
*/
|
|
243
|
+
configureBatchProcessing(batchSize, maxProcessingTime) {
|
|
244
|
+
this._batchSize = batchSize;
|
|
245
|
+
this._maxProcessingTime = maxProcessingTime;
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* 处理单个脏实体
|
|
249
|
+
*/
|
|
250
|
+
processEntity(dirtyData) {
|
|
251
|
+
for (const listener of this._listeners) {
|
|
252
|
+
if ((dirtyData.flags & listener.flags) !== 0) {
|
|
253
|
+
try {
|
|
254
|
+
listener.callback(dirtyData);
|
|
255
|
+
}
|
|
256
|
+
catch (error) {
|
|
257
|
+
DirtyTrackingSystem._logger.error('脏数据监听器错误:', error);
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
this.clearDirty(dirtyData.entity);
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* 通知监听器
|
|
265
|
+
*/
|
|
266
|
+
notifyListeners(dirtyData, newFlags) {
|
|
267
|
+
for (const listener of this._listeners) {
|
|
268
|
+
if ((newFlags & listener.flags) !== 0) {
|
|
269
|
+
try {
|
|
270
|
+
listener.callback(dirtyData);
|
|
271
|
+
}
|
|
272
|
+
catch (error) {
|
|
273
|
+
DirtyTrackingSystem._logger.error('脏数据监听器通知错误:', error);
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* 帧结束时的统计更新
|
|
280
|
+
*/
|
|
281
|
+
onFrameEnd() {
|
|
282
|
+
this._stats.frameCount++;
|
|
283
|
+
this._stats.totalDirtyPerFrame += this._dirtyEntities.size;
|
|
284
|
+
}
|
|
285
|
+
/**
|
|
286
|
+
* 估算内存使用量
|
|
287
|
+
*/
|
|
288
|
+
estimateMemoryUsage() {
|
|
289
|
+
let usage = 0;
|
|
290
|
+
usage += this._dirtyEntities.size * 100;
|
|
291
|
+
usage += this._listeners.length * 50;
|
|
292
|
+
usage += this._processingQueue.length * 8;
|
|
293
|
+
return usage;
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
DirtyTrackingSystem._logger = createLogger('DirtyTrackingSystem');
|
|
297
|
+
//# sourceMappingURL=DirtyTrackingSystem.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DirtyTrackingSystem.js","sourceRoot":"","sources":["../../../src/ECS/Core/DirtyTrackingSystem.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,379 @@
|
|
|
1
|
+
import { Entity } from '../Entity';
|
|
2
|
+
import { Component } from '../Component';
|
|
3
|
+
import { ComponentType } from './ComponentStorage';
|
|
4
|
+
import { EventBus } from './EventBus';
|
|
5
|
+
/**
|
|
6
|
+
* 实体查询构建器
|
|
7
|
+
*
|
|
8
|
+
* 提供流式API来构建复杂的实体查询条件。支持组件过滤、标签过滤、状态过滤和自定义条件。
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```typescript
|
|
12
|
+
* const results = entityManager.query()
|
|
13
|
+
* .withAll(PositionComponent, HealthComponent)
|
|
14
|
+
* .without(VelocityComponent)
|
|
15
|
+
* .withTag(1)
|
|
16
|
+
* .active()
|
|
17
|
+
* .where(entity => entity.name.startsWith("Player"))
|
|
18
|
+
* .execute();
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
export declare class EntityQueryBuilder {
|
|
22
|
+
private entityManager;
|
|
23
|
+
/** 必须包含的组件类型 */
|
|
24
|
+
private _allComponents;
|
|
25
|
+
/** 至少包含一个的组件类型 */
|
|
26
|
+
private _anyComponents;
|
|
27
|
+
/** 不能包含的组件类型 */
|
|
28
|
+
private _withoutComponents;
|
|
29
|
+
/** 必须包含的标签 */
|
|
30
|
+
private _withTags;
|
|
31
|
+
/** 不能包含的标签 */
|
|
32
|
+
private _withoutTags;
|
|
33
|
+
/** 是否只查询激活状态的实体 */
|
|
34
|
+
private _activeOnly;
|
|
35
|
+
/** 是否只查询启用状态的实体 */
|
|
36
|
+
private _enabledOnly;
|
|
37
|
+
/** 自定义过滤条件 */
|
|
38
|
+
private _customPredicates;
|
|
39
|
+
/**
|
|
40
|
+
* 创建查询构建器实例
|
|
41
|
+
* @param entityManager 实体管理器实例
|
|
42
|
+
*/
|
|
43
|
+
constructor(entityManager: EntityManager);
|
|
44
|
+
/**
|
|
45
|
+
* 添加必须包含的组件条件
|
|
46
|
+
*
|
|
47
|
+
* 返回的实体必须包含所有指定的组件类型。
|
|
48
|
+
*
|
|
49
|
+
* @param componentTypes 组件类型列表
|
|
50
|
+
* @returns 查询构建器实例,支持链式调用
|
|
51
|
+
*/
|
|
52
|
+
withAll(...componentTypes: ComponentType[]): EntityQueryBuilder;
|
|
53
|
+
/**
|
|
54
|
+
* 添加至少包含一个的组件条件
|
|
55
|
+
*
|
|
56
|
+
* 返回的实体必须至少包含其中一个指定的组件类型。
|
|
57
|
+
*
|
|
58
|
+
* @param componentTypes 组件类型列表
|
|
59
|
+
* @returns 查询构建器实例,支持链式调用
|
|
60
|
+
*/
|
|
61
|
+
withAny(...componentTypes: ComponentType[]): EntityQueryBuilder;
|
|
62
|
+
/**
|
|
63
|
+
* 添加不能包含的组件条件
|
|
64
|
+
*
|
|
65
|
+
* 返回的实体不能包含任何指定的组件类型。
|
|
66
|
+
*
|
|
67
|
+
* @param componentTypes 组件类型列表
|
|
68
|
+
* @returns 查询构建器实例,支持链式调用
|
|
69
|
+
*/
|
|
70
|
+
without(...componentTypes: ComponentType[]): EntityQueryBuilder;
|
|
71
|
+
/**
|
|
72
|
+
* 添加必须包含的标签条件
|
|
73
|
+
*
|
|
74
|
+
* 返回的实体必须具有指定的标签。
|
|
75
|
+
*
|
|
76
|
+
* @param tag 标签值
|
|
77
|
+
* @returns 查询构建器实例,支持链式调用
|
|
78
|
+
*/
|
|
79
|
+
withTag(tag: number): EntityQueryBuilder;
|
|
80
|
+
/**
|
|
81
|
+
* 添加不能包含的标签条件
|
|
82
|
+
*
|
|
83
|
+
* 返回的实体不能具有指定的标签。
|
|
84
|
+
*
|
|
85
|
+
* @param tag 标签值
|
|
86
|
+
* @returns 查询构建器实例,支持链式调用
|
|
87
|
+
*/
|
|
88
|
+
withoutTag(tag: number): EntityQueryBuilder;
|
|
89
|
+
/**
|
|
90
|
+
* 添加激活状态过滤条件
|
|
91
|
+
*
|
|
92
|
+
* 返回的实体必须处于激活状态(active = true)。
|
|
93
|
+
*
|
|
94
|
+
* @returns 查询构建器实例,支持链式调用
|
|
95
|
+
*/
|
|
96
|
+
active(): EntityQueryBuilder;
|
|
97
|
+
/**
|
|
98
|
+
* 添加启用状态过滤条件
|
|
99
|
+
*
|
|
100
|
+
* 返回的实体必须处于启用状态(enabled = true)。
|
|
101
|
+
*
|
|
102
|
+
* @returns 查询构建器实例,支持链式调用
|
|
103
|
+
*/
|
|
104
|
+
enabled(): EntityQueryBuilder;
|
|
105
|
+
/**
|
|
106
|
+
* 添加自定义过滤条件
|
|
107
|
+
*
|
|
108
|
+
* 允许用户定义复杂的过滤逻辑。
|
|
109
|
+
*
|
|
110
|
+
* @param predicate 自定义过滤函数,接收实体作为参数,返回布尔值
|
|
111
|
+
* @returns 查询构建器实例,支持链式调用
|
|
112
|
+
*
|
|
113
|
+
* @example
|
|
114
|
+
* ```typescript
|
|
115
|
+
* .where(entity => entity.name.startsWith("Player"))
|
|
116
|
+
* .where(entity => entity.components.length > 5)
|
|
117
|
+
* ```
|
|
118
|
+
*/
|
|
119
|
+
where(predicate: (entity: Entity) => boolean): EntityQueryBuilder;
|
|
120
|
+
/**
|
|
121
|
+
* 执行查询并返回所有匹配的实体
|
|
122
|
+
*
|
|
123
|
+
* @returns 符合所有查询条件的实体数组
|
|
124
|
+
*/
|
|
125
|
+
execute(): Entity[];
|
|
126
|
+
/**
|
|
127
|
+
* 执行查询并返回第一个匹配的实体
|
|
128
|
+
*
|
|
129
|
+
* @returns 第一个符合查询条件的实体,如果没有找到则返回null
|
|
130
|
+
*/
|
|
131
|
+
first(): Entity | null;
|
|
132
|
+
/**
|
|
133
|
+
* 执行查询并返回匹配实体的数量
|
|
134
|
+
*
|
|
135
|
+
* @returns 符合查询条件的实体数量
|
|
136
|
+
*/
|
|
137
|
+
count(): number;
|
|
138
|
+
/**
|
|
139
|
+
* 对所有匹配的实体执行指定操作
|
|
140
|
+
*
|
|
141
|
+
* @param action 要执行的操作函数,接收匹配的实体作为参数
|
|
142
|
+
*/
|
|
143
|
+
forEach(action: (entity: Entity) => void): void;
|
|
144
|
+
/**
|
|
145
|
+
* 检查实体是否匹配所有查询条件
|
|
146
|
+
*
|
|
147
|
+
* 按优先级顺序检查各种过滤条件,一旦发现不匹配立即返回false。
|
|
148
|
+
*
|
|
149
|
+
* @param entity 要检查的实体
|
|
150
|
+
* @returns 实体是否匹配所有查询条件
|
|
151
|
+
*/
|
|
152
|
+
private matchesEntity;
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* 实体管理器
|
|
156
|
+
*
|
|
157
|
+
* 提供统一的实体管理和查询机制,支持高效的实体操作。
|
|
158
|
+
* 包括实体的创建、销毁、查询和索引管理功能。
|
|
159
|
+
*
|
|
160
|
+
* @example
|
|
161
|
+
* ```typescript
|
|
162
|
+
* const entityManager = new EntityManager();
|
|
163
|
+
*
|
|
164
|
+
* // 创建实体
|
|
165
|
+
* const player = entityManager.createEntity("Player");
|
|
166
|
+
*
|
|
167
|
+
* // 查询实体
|
|
168
|
+
* const playerEntity = entityManager.getEntityByName("Player");
|
|
169
|
+
*
|
|
170
|
+
* // 复杂查询
|
|
171
|
+
* const results = entityManager.query()
|
|
172
|
+
* .withAll(HealthComponent, PositionComponent)
|
|
173
|
+
* .active()
|
|
174
|
+
* .execute();
|
|
175
|
+
* ```
|
|
176
|
+
*/
|
|
177
|
+
export declare class EntityManager {
|
|
178
|
+
/** 主要实体存储,使用ID作为键 */
|
|
179
|
+
private _entities;
|
|
180
|
+
/** 按名称索引的实体映射 */
|
|
181
|
+
private _entitiesByName;
|
|
182
|
+
/** 按标签索引的实体映射 */
|
|
183
|
+
private _entitiesByTag;
|
|
184
|
+
/** 实体ID分配器 */
|
|
185
|
+
private _identifierPool;
|
|
186
|
+
/** 已销毁实体的ID集合 */
|
|
187
|
+
private _destroyedEntities;
|
|
188
|
+
/** 性能优化系统 */
|
|
189
|
+
private _componentIndexManager;
|
|
190
|
+
private _archetypeSystem;
|
|
191
|
+
private _dirtyTrackingSystem;
|
|
192
|
+
/** 事件总线 */
|
|
193
|
+
private _eventBus;
|
|
194
|
+
/**
|
|
195
|
+
* 创建实体管理器实例
|
|
196
|
+
*
|
|
197
|
+
* 初始化内部数据结构和ID分配器。
|
|
198
|
+
*/
|
|
199
|
+
constructor();
|
|
200
|
+
/**
|
|
201
|
+
* 获取实体总数
|
|
202
|
+
*
|
|
203
|
+
* @returns 当前管理的实体总数量
|
|
204
|
+
*/
|
|
205
|
+
get entityCount(): number;
|
|
206
|
+
/**
|
|
207
|
+
* 获取激活状态的实体数量
|
|
208
|
+
*
|
|
209
|
+
* 只计算同时满足激活状态且未被销毁的实体。
|
|
210
|
+
*
|
|
211
|
+
* @returns 激活状态的实体数量
|
|
212
|
+
*/
|
|
213
|
+
get activeEntityCount(): number;
|
|
214
|
+
/**
|
|
215
|
+
* 创建新实体
|
|
216
|
+
*
|
|
217
|
+
* 分配唯一ID并将实体添加到管理系统中,同时更新相关索引。
|
|
218
|
+
*
|
|
219
|
+
* @param name 实体名称,如果未指定则使用时间戳生成默认名称
|
|
220
|
+
* @returns 创建的实体实例
|
|
221
|
+
*
|
|
222
|
+
* @example
|
|
223
|
+
* ```typescript
|
|
224
|
+
* const player = entityManager.createEntity("Player");
|
|
225
|
+
* const enemy = entityManager.createEntity(); // 使用默认名称
|
|
226
|
+
* ```
|
|
227
|
+
*/
|
|
228
|
+
createEntity(name?: string): Entity;
|
|
229
|
+
/**
|
|
230
|
+
* 批量创建实体
|
|
231
|
+
*
|
|
232
|
+
* 为了优化大量实体创建的性能,批量处理索引更新和事件发射。
|
|
233
|
+
* 适用于需要创建大量实体的场景,如子弹、粒子等。
|
|
234
|
+
*
|
|
235
|
+
* @param count 要创建的实体数量
|
|
236
|
+
* @param namePrefix 实体名称前缀,默认为 Entity
|
|
237
|
+
* @param skipEvents 是否跳过事件发射以提升性能,默认为 false
|
|
238
|
+
* @returns 创建的实体数组
|
|
239
|
+
*
|
|
240
|
+
* @example
|
|
241
|
+
* const bullets = entityManager.createEntitiesBatch(100, "Bullet", true);
|
|
242
|
+
* const particles = entityManager.createEntitiesBatch(500, "Particle");
|
|
243
|
+
*/
|
|
244
|
+
createEntitiesBatch(count: number, namePrefix?: string, skipEvents?: boolean): Entity[];
|
|
245
|
+
/**
|
|
246
|
+
* 销毁实体
|
|
247
|
+
*
|
|
248
|
+
* 支持通过实体对象、名称或ID来销毁实体。
|
|
249
|
+
* 会清理所有相关索引并回收ID。
|
|
250
|
+
*
|
|
251
|
+
* @param entityOrId 要销毁的实体,可以是实体对象、名称字符串或ID数字
|
|
252
|
+
* @returns 是否成功销毁实体
|
|
253
|
+
*
|
|
254
|
+
* @example
|
|
255
|
+
* ```typescript
|
|
256
|
+
* // 通过实体对象销毁
|
|
257
|
+
* entityManager.destroyEntity(player);
|
|
258
|
+
*
|
|
259
|
+
* // 通过名称销毁
|
|
260
|
+
* entityManager.destroyEntity("Enemy_1");
|
|
261
|
+
*
|
|
262
|
+
* // 通过ID销毁
|
|
263
|
+
* entityManager.destroyEntity(123);
|
|
264
|
+
* ```
|
|
265
|
+
*/
|
|
266
|
+
destroyEntity(entityOrId: Entity | string | number): boolean;
|
|
267
|
+
/**
|
|
268
|
+
* 获取所有实体
|
|
269
|
+
*
|
|
270
|
+
* 返回当前管理的所有实体的副本数组。
|
|
271
|
+
*
|
|
272
|
+
* @returns 所有实体的数组
|
|
273
|
+
*/
|
|
274
|
+
getAllEntities(): Entity[];
|
|
275
|
+
/**
|
|
276
|
+
* 根据ID获取实体
|
|
277
|
+
*
|
|
278
|
+
* 支持字符串和数字类型的ID。
|
|
279
|
+
*
|
|
280
|
+
* @param id 实体ID,可以是字符串或数字
|
|
281
|
+
* @returns 对应的实体,如果不存在则返回null
|
|
282
|
+
*/
|
|
283
|
+
getEntity(id: string | number): Entity | null;
|
|
284
|
+
/**
|
|
285
|
+
* 根据名称获取实体
|
|
286
|
+
*
|
|
287
|
+
* 如果存在多个同名实体,返回第一个找到的实体。
|
|
288
|
+
*
|
|
289
|
+
* @param name 实体名称
|
|
290
|
+
* @returns 匹配的实体,如果不存在则返回null
|
|
291
|
+
*/
|
|
292
|
+
getEntityByName(name: string): Entity | null;
|
|
293
|
+
/**
|
|
294
|
+
* 根据标签获取实体列表
|
|
295
|
+
*
|
|
296
|
+
* 返回所有具有指定标签的实体。
|
|
297
|
+
*
|
|
298
|
+
* @param tag 标签值
|
|
299
|
+
* @returns 具有指定标签的实体数组
|
|
300
|
+
*/
|
|
301
|
+
getEntitiesByTag(tag: number): Entity[];
|
|
302
|
+
/**
|
|
303
|
+
* 获取包含指定组件的所有实体
|
|
304
|
+
*
|
|
305
|
+
* 遍历所有实体,查找包含指定组件类型的实体。
|
|
306
|
+
*
|
|
307
|
+
* @param componentType 组件类型
|
|
308
|
+
* @returns 包含指定组件的实体数组
|
|
309
|
+
*
|
|
310
|
+
* @example
|
|
311
|
+
* ```typescript
|
|
312
|
+
* const entitiesWithHealth = entityManager.getEntitiesWithComponent(HealthComponent);
|
|
313
|
+
* ```
|
|
314
|
+
*/
|
|
315
|
+
getEntitiesWithComponent<T extends Component>(componentType: ComponentType<T>): Entity[];
|
|
316
|
+
/**
|
|
317
|
+
* 创建查询构建器
|
|
318
|
+
*
|
|
319
|
+
* 返回一个新的查询构建器实例,用于构建复杂的实体查询。
|
|
320
|
+
*
|
|
321
|
+
* @returns 新的查询构建器实例
|
|
322
|
+
*
|
|
323
|
+
* @example
|
|
324
|
+
* ```typescript
|
|
325
|
+
* const results = entityManager.query()
|
|
326
|
+
* .withAll(PositionComponent, HealthComponent)
|
|
327
|
+
* .without(VelocityComponent)
|
|
328
|
+
* .active()
|
|
329
|
+
* .execute();
|
|
330
|
+
* ```
|
|
331
|
+
*/
|
|
332
|
+
query(): EntityQueryBuilder;
|
|
333
|
+
/**
|
|
334
|
+
* 使用组件索引进行多组件查询
|
|
335
|
+
*
|
|
336
|
+
* @param componentTypes 组件类型数组
|
|
337
|
+
* @param operation 查询操作:'AND' 或 'OR'
|
|
338
|
+
* @returns 匹配的实体集合
|
|
339
|
+
*/
|
|
340
|
+
queryWithComponentIndex(componentTypes: ComponentType[], operation: 'AND' | 'OR'): Set<Entity>;
|
|
341
|
+
/**
|
|
342
|
+
* 标记实体组件已修改
|
|
343
|
+
*
|
|
344
|
+
* @param entity 修改的实体
|
|
345
|
+
* @param componentTypes 修改的组件类型
|
|
346
|
+
*/
|
|
347
|
+
markEntityDirty(entity: Entity, componentTypes: ComponentType[]): void;
|
|
348
|
+
/**
|
|
349
|
+
* 获取性能优化统计信息
|
|
350
|
+
*/
|
|
351
|
+
getOptimizationStats(): any;
|
|
352
|
+
/**
|
|
353
|
+
* 获取事件总线实例
|
|
354
|
+
*
|
|
355
|
+
* 允许外部代码监听和发射ECS相关事件。
|
|
356
|
+
*
|
|
357
|
+
* @returns 事件总线实例
|
|
358
|
+
*/
|
|
359
|
+
get eventBus(): EventBus;
|
|
360
|
+
/**
|
|
361
|
+
* 更新名称索引
|
|
362
|
+
*
|
|
363
|
+
* 维护按名称查找实体的索引结构。支持添加和移除操作。
|
|
364
|
+
*
|
|
365
|
+
* @param entity 要更新索引的实体
|
|
366
|
+
* @param isAdd true表示添加到索引,false表示从索引中移除
|
|
367
|
+
*/
|
|
368
|
+
private updateNameIndex;
|
|
369
|
+
/**
|
|
370
|
+
* 更新标签索引
|
|
371
|
+
*
|
|
372
|
+
* 维护按标签查找实体的索引结构。支持添加和移除操作。
|
|
373
|
+
*
|
|
374
|
+
* @param entity 要更新索引的实体
|
|
375
|
+
* @param isAdd true表示添加到索引,false表示从索引中移除
|
|
376
|
+
*/
|
|
377
|
+
private updateTagIndex;
|
|
378
|
+
}
|
|
379
|
+
//# sourceMappingURL=EntityManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EntityManager.d.ts","sourceRoot":"","sources":["../../../src/ECS/Core/EntityManager.ts"],"names":[],"mappings":"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"}
|