@esengine/ecs-framework 2.1.4 → 2.1.5
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 +20 -46
- 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/ecs_wasm_core.d.ts +0 -141
- package/bin/wasm/ecs_wasm_core.js +0 -415
- package/bin/wasm/ecs_wasm_core_bg.wasm +0 -0
- package/bin/wasm/ecs_wasm_core_bg.wasm.d.ts +0 -29
- package/bin/wasm/package.json +0 -15
package/index.js.map
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/Utils/Emitter.ts", "../src/ECS/CoreEvents.ts", "../src/Utils/GlobalManager.ts", "../src/Utils/Time.ts", "../src/Utils/Timers/Timer.ts", "../src/Utils/Timers/TimerManager.ts", "../src/Utils/PerformanceMonitor.ts", "../src/Utils/Pool.ts", "../src/ECS/Core/ComponentStorage.ts", "../src/ECS/Entity.ts", "../src/ECS/Utils/EntityList.ts", "../src/ECS/Utils/EntityProcessorList.ts", "../src/ECS/Utils/IdentifierPool.ts", "../src/Utils/WasmCore.ts", "../src/ECS/Core/ComponentPool.ts", "../src/ECS/Core/BitMaskOptimizer.ts", "../src/ECS/Core/IndexUpdateBatcher.ts", "../src/ECS/Core/QuerySystem.ts", "../src/ECS/Core/EventSystem.ts", "../src/ECS/Scene.ts", "../src/ECS/Core/FluentAPI.ts", "../src/Core.ts", "../src/ECS/Component.ts", "../src/ECS/Utils/Bits.ts", "../src/ECS/Utils/ComponentTypeManager.ts", "../src/ECS/Utils/Matcher.ts", "../src/ECS/Systems/EntitySystem.ts", "../src/ECS/Systems/ProcessingSystem.ts", "../src/ECS/Systems/PassiveSystem.ts", "../src/ECS/Systems/IntervalSystem.ts", "../src/Utils/Extensions/TypeUtils.ts", "../src/Utils/Extensions/NumberExtension.ts", "../src/Types/index.ts"],
|
|
4
|
+
"sourcesContent": ["/**\r\n * \u7528\u4E8E\u5305\u88C5\u4E8B\u4EF6\u7684\u4E00\u4E2A\u5C0F\u7C7B\r\n */\r\nexport class FuncPack {\r\n /** \u51FD\u6570 */\r\n public func: Function;\r\n /** \u4E0A\u4E0B\u6587 */\r\n public context: any;\r\n\r\n constructor(func: Function, context: any) {\r\n this.func = func;\r\n this.context = context;\r\n }\r\n}\r\n\r\n/**\r\n * \u7528\u4E8E\u4E8B\u4EF6\u7BA1\u7406\r\n */\r\nexport class Emitter<T> {\r\n private _messageTable: Map<T, FuncPack[]>;\r\n\r\n constructor() {\r\n this._messageTable = new Map<T, FuncPack[]>();\r\n }\r\n\r\n /**\r\n * \u5F00\u59CB\u76D1\u542C\u9879\r\n * @param eventType \u76D1\u542C\u7C7B\u578B\r\n * @param handler \u76D1\u542C\u51FD\u6570\r\n * @param context \u76D1\u542C\u4E0A\u4E0B\u6587\r\n */\r\n public addObserver(eventType: T, handler: Function, context: any) {\r\n let list = this._messageTable.get(eventType);\r\n if (!list) {\r\n list = [];\r\n this._messageTable.set(eventType, list);\r\n }\r\n\r\n if (!this.hasObserver(eventType, handler)) {\r\n list.push(new FuncPack(handler, context));\r\n }\r\n }\r\n\r\n /**\r\n * \u79FB\u9664\u76D1\u542C\u9879\r\n * @param eventType \u4E8B\u4EF6\u7C7B\u578B\r\n * @param handler \u4E8B\u4EF6\u51FD\u6570\r\n */\r\n public removeObserver(eventType: T, handler: Function) {\r\n let messageData = this._messageTable.get(eventType);\r\n if (messageData) {\r\n let index = messageData.findIndex(data => data.func == handler);\r\n if (index != -1)\r\n messageData.splice(index, 1);\r\n }\r\n }\r\n\r\n /**\r\n * \u89E6\u53D1\u8BE5\u4E8B\u4EF6\r\n * @param eventType \u4E8B\u4EF6\u7C7B\u578B\r\n * @param data \u4E8B\u4EF6\u6570\u636E\r\n */\r\n public emit(eventType: T, ...data: any[]) {\r\n let list = this._messageTable.get(eventType);\r\n if (list) {\r\n for (let observer of list) {\r\n observer.func.call(observer.context, ...data);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * \u5224\u65AD\u662F\u5426\u5B58\u5728\u8BE5\u7C7B\u578B\u7684\u89C2\u5BDF\u8005\r\n * @param eventType \u4E8B\u4EF6\u7C7B\u578B\r\n * @param handler \u4E8B\u4EF6\u51FD\u6570\r\n */\r\n public hasObserver(eventType: T, handler: Function): boolean {\r\n let list = this._messageTable.get(eventType);\r\n return list ? list.some(observer => observer.func === handler) : false;\r\n }\r\n}\r\n", "/**\r\n * \u6838\u5FC3\u4E8B\u4EF6\u679A\u4E3E\r\n * \u5B9A\u4E49\u6846\u67B6\u4E2D\u7684\u6838\u5FC3\u4E8B\u4EF6\u7C7B\u578B\r\n */\r\nexport enum CoreEvents {\r\n /**\r\n * \u5F53\u573A\u666F\u53D1\u751F\u53D8\u5316\u65F6\u89E6\u53D1\r\n */\r\n sceneChanged,\r\n /**\r\n * \u6BCF\u5E27\u66F4\u65B0\u4E8B\u4EF6\r\n */\r\n frameUpdated,\r\n /**\r\n * \u5F53\u6E32\u67D3\u53D1\u751F\u65F6\u89E6\u53D1\r\n */\r\n renderChanged,\r\n}\r\n", "/**\r\n * \u5168\u5C40\u7BA1\u7406\u5668\u7684\u57FA\u7C7B\u3002\u6240\u6709\u5168\u5C40\u7BA1\u7406\u5668\u90FD\u5E94\u8BE5\u4ECE\u6B64\u7C7B\u7EE7\u627F\u3002\r\n */\r\nexport class GlobalManager {\r\n /**\r\n * \u8868\u793A\u7BA1\u7406\u5668\u662F\u5426\u542F\u7528\r\n */\r\n public _enabled: boolean = false;\r\n\r\n /**\r\n * \u83B7\u53D6\u6216\u8BBE\u7F6E\u7BA1\u7406\u5668\u662F\u5426\u542F\u7528\r\n */\r\n public get enabled() {\r\n return this._enabled;\r\n }\r\n\r\n public set enabled(value: boolean) {\r\n this.setEnabled(value);\r\n }\r\n\r\n /**\r\n * \u8BBE\u7F6E\u7BA1\u7406\u5668\u662F\u5426\u542F\u7528\r\n * @param isEnabled \u5982\u679C\u4E3Atrue\uFF0C\u5219\u542F\u7528\u7BA1\u7406\u5668\uFF1B\u5426\u5219\u7981\u7528\u7BA1\u7406\u5668\r\n */\r\n public setEnabled(isEnabled: boolean) {\r\n if (this._enabled != isEnabled) {\r\n this._enabled = isEnabled;\r\n if (this._enabled) {\r\n // \u5982\u679C\u542F\u7528\u4E86\u7BA1\u7406\u5668\uFF0C\u5219\u8C03\u7528onEnabled\u65B9\u6CD5\r\n this.onEnabled();\r\n } else {\r\n // \u5982\u679C\u7981\u7528\u4E86\u7BA1\u7406\u5668\uFF0C\u5219\u8C03\u7528onDisabled\u65B9\u6CD5\r\n this.onDisabled();\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * \u5728\u542F\u7528\u7BA1\u7406\u5668\u65F6\u8C03\u7528\u7684\u56DE\u8C03\u65B9\u6CD5\r\n */\r\n protected onEnabled() {\r\n }\r\n\r\n /**\r\n * \u5728\u7981\u7528\u7BA1\u7406\u5668\u65F6\u8C03\u7528\u7684\u56DE\u8C03\u65B9\u6CD5\r\n */\r\n protected onDisabled() {\r\n }\r\n\r\n /**\r\n * \u66F4\u65B0\u7BA1\u7406\u5668\u72B6\u6001\u7684\u65B9\u6CD5\r\n */\r\n public update() {\r\n }\r\n}\r\n", "/**\r\n * \u65F6\u95F4\u7BA1\u7406\u5DE5\u5177\u7C7B\r\n * \u63D0\u4F9B\u6E38\u620F\u65F6\u95F4\u76F8\u5173\u7684\u529F\u80FD\uFF0C\u5305\u62EC\u5E27\u65F6\u95F4\u3001\u603B\u65F6\u95F4\u3001\u65F6\u95F4\u7F29\u653E\u7B49\r\n */\r\nexport class Time {\r\n /**\r\n * \u4E0A\u4E00\u5E27\u5230\u5F53\u524D\u5E27\u7684\u65F6\u95F4\u95F4\u9694\uFF08\u79D2\uFF09\r\n */\r\n public static deltaTime: number = 0;\r\n \r\n /**\r\n * \u672A\u7F29\u653E\u7684\u5E27\u65F6\u95F4\u95F4\u9694\uFF08\u79D2\uFF09\r\n */\r\n public static unscaledDeltaTime: number = 0;\r\n \r\n /**\r\n * \u6E38\u620F\u5F00\u59CB\u4EE5\u6765\u7684\u603B\u65F6\u95F4\uFF08\u79D2\uFF09\r\n */\r\n public static totalTime: number = 0;\r\n \r\n /**\r\n * \u672A\u7F29\u653E\u7684\u603B\u65F6\u95F4\uFF08\u79D2\uFF09\r\n */\r\n public static unscaledTotalTime: number = 0;\r\n \r\n /**\r\n * \u65F6\u95F4\u7F29\u653E\u6BD4\u4F8B\r\n */\r\n public static timeScale: number = 1;\r\n \r\n /**\r\n * \u5F53\u524D\u5E27\u6570\r\n */\r\n public static frameCount: number = 0;\r\n \r\n /**\r\n * \u4E0A\u4E00\u5E27\u7684\u65F6\u95F4\u6233\r\n */\r\n private static _lastTime: number = 0;\r\n \r\n /**\r\n * \u662F\u5426\u4E3A\u7B2C\u4E00\u6B21\u66F4\u65B0\r\n */\r\n private static _isFirstUpdate: boolean = true;\r\n\r\n /**\r\n * \u66F4\u65B0\u65F6\u95F4\u4FE1\u606F\r\n * @param currentTime \u5F53\u524D\u65F6\u95F4\u6233\uFF08\u6BEB\u79D2\uFF09\r\n */\r\n public static update(currentTime: number = -1): void {\r\n if (currentTime === -1) {\r\n currentTime = Date.now();\r\n }\r\n\r\n if (this._isFirstUpdate) {\r\n this._lastTime = currentTime;\r\n this._isFirstUpdate = false;\r\n return;\r\n }\r\n\r\n // \u8BA1\u7B97\u5E27\u65F6\u95F4\u95F4\u9694\uFF08\u8F6C\u6362\u4E3A\u79D2\uFF09\r\n this.unscaledDeltaTime = (currentTime - this._lastTime) / 1000;\r\n this.deltaTime = this.unscaledDeltaTime * this.timeScale;\r\n\r\n // \u66F4\u65B0\u603B\u65F6\u95F4\r\n this.unscaledTotalTime += this.unscaledDeltaTime;\r\n this.totalTime += this.deltaTime;\r\n\r\n // \u66F4\u65B0\u5E27\u6570\r\n this.frameCount++;\r\n\r\n // \u8BB0\u5F55\u5F53\u524D\u65F6\u95F4\r\n this._lastTime = currentTime;\r\n }\r\n\r\n /**\r\n * \u573A\u666F\u6539\u53D8\u65F6\u91CD\u7F6E\u65F6\u95F4\r\n */\r\n public static sceneChanged(): void {\r\n this._isFirstUpdate = true;\r\n }\r\n\r\n /**\r\n * \u68C0\u67E5\u6307\u5B9A\u7684\u65F6\u95F4\u95F4\u9694\u662F\u5426\u5DF2\u7ECF\u8FC7\u53BB\r\n * @param interval \u65F6\u95F4\u95F4\u9694\uFF08\u79D2\uFF09\r\n * @param lastTime \u4E0A\u6B21\u68C0\u67E5\u7684\u65F6\u95F4\r\n * @returns \u662F\u5426\u5DF2\u7ECF\u8FC7\u53BB\u6307\u5B9A\u65F6\u95F4\r\n */\r\n public static checkEvery(interval: number, lastTime: number): boolean {\r\n return this.totalTime - lastTime >= interval;\r\n }\r\n} ", "import { ITimer } from './ITimer';\r\nimport { Time } from '../Time';\r\n\r\n/**\r\n * \u79C1\u6709\u7C7B\u9690\u85CFITimer\u7684\u5B9E\u73B0\r\n */\r\nexport class Timer implements ITimer{\r\n public context: any;\r\n public _timeInSeconds: number = 0;\r\n public _repeats: boolean = false;\r\n public _onTime!: (timer: ITimer) => void;\r\n public _isDone: boolean = false;\r\n public _elapsedTime: number = 0;\r\n\r\n public getContext<T>(): T {\r\n return this.context as T;\r\n }\r\n\r\n public reset(): void {\r\n this._elapsedTime = 0;\r\n }\r\n\r\n public stop(): void {\r\n this._isDone = true;\r\n }\r\n\r\n public tick(){\r\n // \u5982\u679Cstop\u5728tick\u4E4B\u524D\u88AB\u8C03\u7528\uFF0C\u90A3\u4E48isDone\u5C06\u4E3Atrue\uFF0C\u6211\u4EEC\u4E0D\u5E94\u8BE5\u518D\u505A\u4EFB\u4F55\u4E8B\u60C5\r\n if (!this._isDone && this._elapsedTime > this._timeInSeconds){\r\n this._elapsedTime -= this._timeInSeconds;\r\n this._onTime(this);\r\n\r\n if (!this._isDone && !this._repeats)\r\n this._isDone = true;\r\n }\r\n\r\n this._elapsedTime += Time.deltaTime;\r\n\r\n return this._isDone;\r\n }\r\n\r\n public initialize(timeInsSeconds: number, repeats: boolean, context: any, onTime: (timer: ITimer)=>void){\r\n this._timeInSeconds = timeInsSeconds;\r\n this._repeats = repeats;\r\n this.context = context;\r\n this._onTime = onTime.bind(context);\r\n }\r\n\r\n /**\r\n * \u7A7A\u51FA\u5BF9\u8C61\u5F15\u7528\uFF0C\u4EE5\u4FBF\u5728js\u9700\u8981\u65F6GC\u53EF\u4EE5\u6E05\u7406\u5B83\u4EEC\u7684\u5F15\u7528\r\n */\r\n public unload(){\r\n this.context = null;\r\n this._onTime = null as any;\r\n }\r\n}", "import { GlobalManager } from '../GlobalManager';\r\nimport { Timer } from './Timer';\r\nimport { ITimer } from './ITimer';\r\n\r\n/**\r\n * \u5141\u8BB8\u52A8\u4F5C\u7684\u5EF6\u8FDF\u548C\u91CD\u590D\u6267\u884C\r\n */\r\nexport class TimerManager extends GlobalManager {\r\n public _timers: Timer[] = [];\r\n\r\n public override update() {\r\n for (let i = this._timers.length - 1; i >= 0; i --){\r\n if (this._timers[i].tick()){\r\n this._timers[i].unload();\r\n this._timers.splice(i, 1);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * \u8C03\u5EA6\u4E00\u4E2A\u4E00\u6B21\u6027\u6216\u91CD\u590D\u7684\u8BA1\u65F6\u5668\uFF0C\u8BE5\u8BA1\u65F6\u5668\u5C06\u8C03\u7528\u5DF2\u4F20\u9012\u7684\u52A8\u4F5C\r\n * @param timeInSeconds\r\n * @param repeats\r\n * @param context\r\n * @param onTime\r\n */\r\n public schedule(timeInSeconds: number, repeats: boolean, context: any, onTime: (timer: ITimer)=>void){\r\n let timer = new Timer();\r\n timer.initialize(timeInSeconds, repeats, context, onTime);\r\n this._timers.push(timer);\r\n\r\n return timer;\r\n }\r\n}", "/**\r\n * \u6027\u80FD\u76D1\u63A7\u6570\u636E\r\n */\r\nexport interface PerformanceData {\r\n /** \u7CFB\u7EDF\u540D\u79F0 */\r\n name: string;\r\n /** \u6267\u884C\u65F6\u95F4\uFF08\u6BEB\u79D2\uFF09 */\r\n executionTime: number;\r\n /** \u5904\u7406\u7684\u5B9E\u4F53\u6570\u91CF */\r\n entityCount: number;\r\n /** \u5E73\u5747\u6BCF\u4E2A\u5B9E\u4F53\u7684\u5904\u7406\u65F6\u95F4 */\r\n averageTimePerEntity: number;\r\n /** \u6700\u540E\u66F4\u65B0\u65F6\u95F4\u6233 */\r\n lastUpdateTime: number;\r\n /** \u5185\u5B58\u4F7F\u7528\u91CF\uFF08\u5B57\u8282\uFF09 */\r\n memoryUsage?: number;\r\n /** CPU\u4F7F\u7528\u7387\uFF08\u767E\u5206\u6BD4\uFF09 */\r\n cpuUsage?: number;\r\n}\r\n\r\n/**\r\n * \u6027\u80FD\u7EDF\u8BA1\u4FE1\u606F\r\n */\r\nexport interface PerformanceStats {\r\n /** \u603B\u6267\u884C\u65F6\u95F4 */\r\n totalTime: number;\r\n /** \u5E73\u5747\u6267\u884C\u65F6\u95F4 */\r\n averageTime: number;\r\n /** \u6700\u5C0F\u6267\u884C\u65F6\u95F4 */\r\n minTime: number;\r\n /** \u6700\u5927\u6267\u884C\u65F6\u95F4 */\r\n maxTime: number;\r\n /** \u6267\u884C\u6B21\u6570 */\r\n executionCount: number;\r\n /** \u6700\u8FD1\u7684\u6267\u884C\u65F6\u95F4\u5217\u8868 */\r\n recentTimes: number[];\r\n /** \u6807\u51C6\u5DEE */\r\n standardDeviation: number;\r\n /** 95\u767E\u5206\u4F4D\u6570 */\r\n percentile95: number;\r\n /** 99\u767E\u5206\u4F4D\u6570 */\r\n percentile99: number;\r\n}\r\n\r\n/**\r\n * \u6027\u80FD\u8B66\u544A\u7C7B\u578B\r\n */\r\nexport enum PerformanceWarningType {\r\n HIGH_EXECUTION_TIME = 'high_execution_time',\r\n HIGH_MEMORY_USAGE = 'high_memory_usage',\r\n HIGH_CPU_USAGE = 'high_cpu_usage',\r\n FREQUENT_GC = 'frequent_gc',\r\n LOW_FPS = 'low_fps',\r\n HIGH_ENTITY_COUNT = 'high_entity_count'\r\n}\r\n\r\n/**\r\n * \u6027\u80FD\u8B66\u544A\r\n */\r\nexport interface PerformanceWarning {\r\n type: PerformanceWarningType;\r\n systemName: string;\r\n message: string;\r\n severity: 'low' | 'medium' | 'high' | 'critical';\r\n timestamp: number;\r\n value: number;\r\n threshold: number;\r\n suggestion?: string;\r\n}\r\n\r\n/**\r\n * \u6027\u80FD\u9608\u503C\u914D\u7F6E\r\n */\r\nexport interface PerformanceThresholds {\r\n /** \u6267\u884C\u65F6\u95F4\u9608\u503C\uFF08\u6BEB\u79D2\uFF09 */\r\n executionTime: {\r\n warning: number;\r\n critical: number;\r\n };\r\n /** \u5185\u5B58\u4F7F\u7528\u9608\u503C\uFF08MB\uFF09 */\r\n memoryUsage: {\r\n warning: number;\r\n critical: number;\r\n };\r\n /** CPU\u4F7F\u7528\u7387\u9608\u503C\uFF08\u767E\u5206\u6BD4\uFF09 */\r\n cpuUsage: {\r\n warning: number;\r\n critical: number;\r\n };\r\n /** FPS\u9608\u503C */\r\n fps: {\r\n warning: number;\r\n critical: number;\r\n };\r\n /** \u5B9E\u4F53\u6570\u91CF\u9608\u503C */\r\n entityCount: {\r\n warning: number;\r\n critical: number;\r\n };\r\n}\r\n\r\n/**\r\n * \u9AD8\u6027\u80FD\u76D1\u63A7\u5668\r\n * \u7528\u4E8E\u76D1\u63A7ECS\u7CFB\u7EDF\u7684\u6027\u80FD\u8868\u73B0\uFF0C\u63D0\u4F9B\u8BE6\u7EC6\u7684\u5206\u6790\u548C\u4F18\u5316\u5EFA\u8BAE\r\n */\r\nexport class PerformanceMonitor {\r\n private static _instance: PerformanceMonitor;\r\n \r\n private _systemData = new Map<string, PerformanceData>();\r\n private _systemStats = new Map<string, PerformanceStats>();\r\n private _warnings: PerformanceWarning[] = [];\r\n private _isEnabled = false;\r\n private _maxRecentSamples = 60; // \u4FDD\u7559\u6700\u8FD160\u5E27\u7684\u6570\u636E\r\n private _maxWarnings = 100; // \u6700\u5927\u8B66\u544A\u6570\u91CF\r\n \r\n // \u6027\u80FD\u9608\u503C\u914D\u7F6E\r\n private _thresholds: PerformanceThresholds = {\r\n executionTime: { warning: 16.67, critical: 33.33 }, // 60fps\u548C30fps\u5BF9\u5E94\u7684\u5E27\u65F6\u95F4\r\n memoryUsage: { warning: 100, critical: 200 }, // MB\r\n cpuUsage: { warning: 70, critical: 90 }, // \u767E\u5206\u6BD4\r\n fps: { warning: 45, critical: 30 },\r\n entityCount: { warning: 1000, critical: 5000 }\r\n };\r\n\r\n // FPS\u76D1\u63A7\r\n private _fpsHistory: number[] = [];\r\n private _lastFrameTime = 0;\r\n private _frameCount = 0;\r\n private _fpsUpdateInterval = 1000; // 1\u79D2\u66F4\u65B0\u4E00\u6B21FPS\r\n private _lastFpsUpdate = 0;\r\n private _currentFps = 60;\r\n\r\n // \u5185\u5B58\u76D1\u63A7\r\n private _memoryCheckInterval = 5000; // 5\u79D2\u68C0\u67E5\u4E00\u6B21\u5185\u5B58\r\n private _lastMemoryCheck = 0;\r\n private _memoryHistory: number[] = [];\r\n\r\n // GC\u76D1\u63A7\r\n private _gcCount = 0;\r\n private _lastGcCheck = 0;\r\n private _gcCheckInterval = 1000;\r\n \r\n /**\r\n * \u83B7\u53D6\u5355\u4F8B\u5B9E\u4F8B\r\n */\r\n public static get instance(): PerformanceMonitor {\r\n if (!PerformanceMonitor._instance) {\r\n PerformanceMonitor._instance = new PerformanceMonitor();\r\n }\r\n return PerformanceMonitor._instance;\r\n }\r\n\r\n private constructor() {}\r\n\r\n /**\r\n * \u542F\u7528\u6027\u80FD\u76D1\u63A7\r\n */\r\n public enable(): void {\r\n this._isEnabled = true;\r\n }\r\n\r\n /**\r\n * \u7981\u7528\u6027\u80FD\u76D1\u63A7\r\n */\r\n public disable(): void {\r\n this._isEnabled = false;\r\n }\r\n\r\n /**\r\n * \u68C0\u67E5\u662F\u5426\u542F\u7528\u4E86\u6027\u80FD\u76D1\u63A7\r\n */\r\n public get isEnabled(): boolean {\r\n return this._isEnabled;\r\n }\r\n\r\n /**\r\n * \u5F00\u59CB\u76D1\u63A7\u7CFB\u7EDF\u6027\u80FD\r\n * @param systemName \u7CFB\u7EDF\u540D\u79F0\r\n * @returns \u5F00\u59CB\u65F6\u95F4\u6233\r\n */\r\n public startMonitoring(systemName: string): number {\r\n if (!this._isEnabled) {\r\n return 0;\r\n }\r\n return performance.now();\r\n }\r\n\r\n /**\r\n * \u7ED3\u675F\u76D1\u63A7\u5E76\u8BB0\u5F55\u6027\u80FD\u6570\u636E\r\n * @param systemName \u7CFB\u7EDF\u540D\u79F0\r\n * @param startTime \u5F00\u59CB\u65F6\u95F4\u6233\r\n * @param entityCount \u5904\u7406\u7684\u5B9E\u4F53\u6570\u91CF\r\n */\r\n public endMonitoring(systemName: string, startTime: number, entityCount: number = 0): void {\r\n if (!this._isEnabled || startTime === 0) {\r\n return;\r\n }\r\n\r\n const endTime = performance.now();\r\n const executionTime = endTime - startTime;\r\n const averageTimePerEntity = entityCount > 0 ? executionTime / entityCount : 0;\r\n\r\n // \u66F4\u65B0\u5F53\u524D\u6027\u80FD\u6570\u636E\r\n const data: PerformanceData = {\r\n name: systemName,\r\n executionTime,\r\n entityCount,\r\n averageTimePerEntity,\r\n lastUpdateTime: endTime\r\n };\r\n\r\n this._systemData.set(systemName, data);\r\n\r\n // \u66F4\u65B0\u7EDF\u8BA1\u4FE1\u606F\r\n this.updateStats(systemName, executionTime);\r\n }\r\n\r\n /**\r\n * \u66F4\u65B0\u7CFB\u7EDF\u7EDF\u8BA1\u4FE1\u606F\r\n * @param systemName \u7CFB\u7EDF\u540D\u79F0\r\n * @param executionTime \u6267\u884C\u65F6\u95F4\r\n */\r\n private updateStats(systemName: string, executionTime: number): void {\r\n let stats = this._systemStats.get(systemName);\r\n \r\n if (!stats) {\r\n stats = {\r\n totalTime: 0,\r\n averageTime: 0,\r\n minTime: Number.MAX_VALUE,\r\n maxTime: 0,\r\n executionCount: 0,\r\n recentTimes: [],\r\n standardDeviation: 0,\r\n percentile95: 0,\r\n percentile99: 0\r\n };\r\n this._systemStats.set(systemName, stats);\r\n }\r\n\r\n // \u66F4\u65B0\u57FA\u672C\u7EDF\u8BA1\r\n stats.totalTime += executionTime;\r\n stats.executionCount++;\r\n stats.averageTime = stats.totalTime / stats.executionCount;\r\n stats.minTime = Math.min(stats.minTime, executionTime);\r\n stats.maxTime = Math.max(stats.maxTime, executionTime);\r\n\r\n // \u66F4\u65B0\u6700\u8FD1\u65F6\u95F4\u5217\u8868\r\n stats.recentTimes.push(executionTime);\r\n if (stats.recentTimes.length > this._maxRecentSamples) {\r\n stats.recentTimes.shift();\r\n }\r\n\r\n // \u8BA1\u7B97\u9AD8\u7EA7\u7EDF\u8BA1\u4FE1\u606F\r\n this.calculateAdvancedStats(stats);\r\n }\r\n\r\n /**\r\n * \u8BA1\u7B97\u9AD8\u7EA7\u7EDF\u8BA1\u4FE1\u606F\r\n * @param stats \u7EDF\u8BA1\u4FE1\u606F\u5BF9\u8C61\r\n */\r\n private calculateAdvancedStats(stats: PerformanceStats): void {\r\n if (stats.recentTimes.length === 0) return;\r\n\r\n // \u8BA1\u7B97\u6807\u51C6\u5DEE\r\n const mean = stats.recentTimes.reduce((a, b) => a + b, 0) / stats.recentTimes.length;\r\n const variance = stats.recentTimes.reduce((acc, time) => acc + Math.pow(time - mean, 2), 0) / stats.recentTimes.length;\r\n stats.standardDeviation = Math.sqrt(variance);\r\n\r\n // \u8BA1\u7B97\u767E\u5206\u4F4D\u6570\r\n const sortedTimes = [...stats.recentTimes].sort((a, b) => a - b);\r\n const len = sortedTimes.length;\r\n \r\n stats.percentile95 = sortedTimes[Math.floor(len * 0.95)] || 0;\r\n stats.percentile99 = sortedTimes[Math.floor(len * 0.99)] || 0;\r\n }\r\n\r\n /**\r\n * \u83B7\u53D6\u7CFB\u7EDF\u7684\u5F53\u524D\u6027\u80FD\u6570\u636E\r\n * @param systemName \u7CFB\u7EDF\u540D\u79F0\r\n * @returns \u6027\u80FD\u6570\u636E\u6216undefined\r\n */\r\n public getSystemData(systemName: string): PerformanceData | undefined {\r\n return this._systemData.get(systemName);\r\n }\r\n\r\n /**\r\n * \u83B7\u53D6\u7CFB\u7EDF\u7684\u7EDF\u8BA1\u4FE1\u606F\r\n * @param systemName \u7CFB\u7EDF\u540D\u79F0\r\n * @returns \u7EDF\u8BA1\u4FE1\u606F\u6216undefined\r\n */\r\n public getSystemStats(systemName: string): PerformanceStats | undefined {\r\n return this._systemStats.get(systemName);\r\n }\r\n\r\n /**\r\n * \u83B7\u53D6\u6240\u6709\u7CFB\u7EDF\u7684\u6027\u80FD\u6570\u636E\r\n * @returns \u6240\u6709\u7CFB\u7EDF\u7684\u6027\u80FD\u6570\u636E\r\n */\r\n public getAllSystemData(): Map<string, PerformanceData> {\r\n return new Map(this._systemData);\r\n }\r\n\r\n /**\r\n * \u83B7\u53D6\u6240\u6709\u7CFB\u7EDF\u7684\u7EDF\u8BA1\u4FE1\u606F\r\n * @returns \u6240\u6709\u7CFB\u7EDF\u7684\u7EDF\u8BA1\u4FE1\u606F\r\n */\r\n public getAllSystemStats(): Map<string, PerformanceStats> {\r\n return new Map(this._systemStats);\r\n }\r\n\r\n /**\r\n * \u83B7\u53D6\u6027\u80FD\u62A5\u544A\r\n * @returns \u683C\u5F0F\u5316\u7684\u6027\u80FD\u62A5\u544A\u5B57\u7B26\u4E32\r\n */\r\n public getPerformanceReport(): string {\r\n if (!this._isEnabled) {\r\n return \"Performance monitoring is disabled.\";\r\n }\r\n\r\n const lines: string[] = [];\r\n lines.push(\"=== ECS Performance Report ===\");\r\n lines.push(\"\");\r\n\r\n // \u6309\u5E73\u5747\u6267\u884C\u65F6\u95F4\u6392\u5E8F\r\n const sortedSystems = Array.from(this._systemStats.entries())\r\n .sort((a, b) => b[1].averageTime - a[1].averageTime);\r\n\r\n for (const [systemName, stats] of sortedSystems) {\r\n const data = this._systemData.get(systemName);\r\n \r\n lines.push(`System: ${systemName}`);\r\n lines.push(` Current: ${data?.executionTime.toFixed(2)}ms (${data?.entityCount} entities)`);\r\n lines.push(` Average: ${stats.averageTime.toFixed(2)}ms`);\r\n lines.push(` Min/Max: ${stats.minTime.toFixed(2)}ms / ${stats.maxTime.toFixed(2)}ms`);\r\n lines.push(` Total: ${stats.totalTime.toFixed(2)}ms (${stats.executionCount} calls)`);\r\n \r\n if (data?.averageTimePerEntity && data.averageTimePerEntity > 0) {\r\n lines.push(` Per Entity: ${data.averageTimePerEntity.toFixed(4)}ms`);\r\n }\r\n \r\n lines.push(\"\");\r\n }\r\n\r\n // \u603B\u4F53\u7EDF\u8BA1\r\n const totalCurrentTime = Array.from(this._systemData.values())\r\n .reduce((sum, data) => sum + data.executionTime, 0);\r\n \r\n lines.push(`Total Frame Time: ${totalCurrentTime.toFixed(2)}ms`);\r\n lines.push(`Systems Count: ${this._systemData.size}`);\r\n\r\n return lines.join('\\n');\r\n }\r\n\r\n /**\r\n * \u91CD\u7F6E\u6240\u6709\u6027\u80FD\u6570\u636E\r\n */\r\n public reset(): void {\r\n this._systemData.clear();\r\n this._systemStats.clear();\r\n }\r\n\r\n /**\r\n * \u91CD\u7F6E\u6307\u5B9A\u7CFB\u7EDF\u7684\u6027\u80FD\u6570\u636E\r\n * @param systemName \u7CFB\u7EDF\u540D\u79F0\r\n */\r\n public resetSystem(systemName: string): void {\r\n this._systemData.delete(systemName);\r\n this._systemStats.delete(systemName);\r\n }\r\n\r\n /**\r\n * \u83B7\u53D6\u6027\u80FD\u8B66\u544A\r\n * @param thresholdMs \u8B66\u544A\u9608\u503C\uFF08\u6BEB\u79D2\uFF09\r\n * @returns \u8D85\u8FC7\u9608\u503C\u7684\u7CFB\u7EDF\u5217\u8868\r\n */\r\n public getPerformanceWarnings(thresholdMs: number = 16.67): string[] {\r\n const warnings: string[] = [];\r\n \r\n for (const [systemName, data] of this._systemData.entries()) {\r\n if (data.executionTime > thresholdMs) {\r\n warnings.push(`${systemName}: ${data.executionTime.toFixed(2)}ms (>${thresholdMs}ms)`);\r\n }\r\n }\r\n \r\n return warnings;\r\n }\r\n\r\n /**\r\n * \u8BBE\u7F6E\u6700\u5927\u4FDD\u7559\u6837\u672C\u6570\r\n * @param maxSamples \u6700\u5927\u6837\u672C\u6570\r\n */\r\n public setMaxRecentSamples(maxSamples: number): void {\r\n this._maxRecentSamples = maxSamples;\r\n \r\n // \u88C1\u526A\u73B0\u6709\u6570\u636E\r\n for (const stats of this._systemStats.values()) {\r\n while (stats.recentTimes.length > maxSamples) {\r\n stats.recentTimes.shift();\r\n }\r\n }\r\n }\r\n} ", "/**\r\n * \u53EF\u6C60\u5316\u5BF9\u8C61\u63A5\u53E3\r\n */\r\nexport interface IPoolable {\r\n /**\r\n * \u91CD\u7F6E\u5BF9\u8C61\u72B6\u6001\uFF0C\u51C6\u5907\u91CD\u7528\r\n */\r\n reset(): void;\r\n}\r\n\r\n/**\r\n * \u5BF9\u8C61\u6C60\u7EDF\u8BA1\u4FE1\u606F\r\n */\r\nexport interface PoolStats {\r\n /** \u6C60\u4E2D\u5BF9\u8C61\u6570\u91CF */\r\n size: number;\r\n /** \u6C60\u7684\u6700\u5927\u5927\u5C0F */\r\n maxSize: number;\r\n /** \u603B\u5171\u521B\u5EFA\u7684\u5BF9\u8C61\u6570\u91CF */\r\n totalCreated: number;\r\n /** \u603B\u5171\u83B7\u53D6\u7684\u6B21\u6570 */\r\n totalObtained: number;\r\n /** \u603B\u5171\u91CA\u653E\u7684\u6B21\u6570 */\r\n totalReleased: number;\r\n /** \u547D\u4E2D\u7387\uFF08\u4ECE\u6C60\u4E2D\u83B7\u53D6\u7684\u6BD4\u4F8B\uFF09 */\r\n hitRate: number;\r\n /** \u5185\u5B58\u4F7F\u7528\u4F30\u7B97\uFF08\u5B57\u8282\uFF09 */\r\n estimatedMemoryUsage: number;\r\n}\r\n\r\n/**\r\n * \u9AD8\u6027\u80FD\u901A\u7528\u5BF9\u8C61\u6C60\r\n * \u652F\u6301\u4EFB\u610F\u7C7B\u578B\u7684\u5BF9\u8C61\u6C60\u5316\uFF0C\u5305\u542B\u8BE6\u7EC6\u7684\u7EDF\u8BA1\u4FE1\u606F\r\n */\r\nexport class Pool<T extends IPoolable> {\r\n private static _pools = new Map<Function, Pool<any>>();\r\n \r\n private _objects: T[] = [];\r\n private _createFn: () => T;\r\n private _maxSize: number;\r\n private _stats: PoolStats;\r\n private _objectSize: number; // \u4F30\u7B97\u7684\u5355\u4E2A\u5BF9\u8C61\u5927\u5C0F\r\n\r\n /**\r\n * \u6784\u9020\u51FD\u6570\r\n * @param createFn \u521B\u5EFA\u5BF9\u8C61\u7684\u51FD\u6570\r\n * @param maxSize \u6C60\u7684\u6700\u5927\u5927\u5C0F\uFF0C\u9ED8\u8BA4100\r\n * @param estimatedObjectSize \u4F30\u7B97\u7684\u5355\u4E2A\u5BF9\u8C61\u5927\u5C0F\uFF08\u5B57\u8282\uFF09\uFF0C\u9ED8\u8BA41024\r\n */\r\n constructor(createFn: () => T, maxSize: number = 100, estimatedObjectSize: number = 1024) {\r\n this._createFn = createFn;\r\n this._maxSize = maxSize;\r\n this._objectSize = estimatedObjectSize;\r\n this._stats = {\r\n size: 0,\r\n maxSize,\r\n totalCreated: 0,\r\n totalObtained: 0,\r\n totalReleased: 0,\r\n hitRate: 0,\r\n estimatedMemoryUsage: 0\r\n };\r\n }\r\n\r\n /**\r\n * \u83B7\u53D6\u6307\u5B9A\u7C7B\u578B\u7684\u5BF9\u8C61\u6C60\r\n * @param type \u5BF9\u8C61\u7C7B\u578B\r\n * @param maxSize \u6C60\u7684\u6700\u5927\u5927\u5C0F\r\n * @param estimatedObjectSize \u4F30\u7B97\u7684\u5355\u4E2A\u5BF9\u8C61\u5927\u5C0F\r\n * @returns \u5BF9\u8C61\u6C60\u5B9E\u4F8B\r\n */\r\n public static getPool<T extends IPoolable>(\r\n type: new (...args: any[]) => T, \r\n maxSize: number = 100,\r\n estimatedObjectSize: number = 1024\r\n ): Pool<T> {\r\n let pool = this._pools.get(type);\r\n \r\n if (!pool) {\r\n pool = new Pool<T>(() => new type(), maxSize, estimatedObjectSize);\r\n this._pools.set(type, pool);\r\n }\r\n \r\n return pool;\r\n }\r\n\r\n /**\r\n * \u4ECE\u6C60\u4E2D\u83B7\u53D6\u5BF9\u8C61\r\n * @returns \u5BF9\u8C61\u5B9E\u4F8B\r\n */\r\n public obtain(): T {\r\n this._stats.totalObtained++;\r\n \r\n if (this._objects.length > 0) {\r\n const obj = this._objects.pop()!;\r\n this._stats.size--;\r\n this._updateHitRate();\r\n this._updateMemoryUsage();\r\n return obj;\r\n }\r\n \r\n // \u6C60\u4E2D\u6CA1\u6709\u5BF9\u8C61\uFF0C\u521B\u5EFA\u65B0\u7684\r\n const obj = this._createFn();\r\n this._stats.totalCreated++;\r\n this._updateHitRate();\r\n return obj;\r\n }\r\n\r\n /**\r\n * \u5C06\u5BF9\u8C61\u5F52\u8FD8\u5230\u6C60\u4E2D\r\n * @param obj \u8981\u5F52\u8FD8\u7684\u5BF9\u8C61\r\n */\r\n public free(obj: T): void {\r\n if (this._objects.length < this._maxSize) {\r\n obj.reset();\r\n this._objects.push(obj);\r\n this._stats.size++;\r\n this._stats.totalReleased++;\r\n this._updateMemoryUsage();\r\n }\r\n // \u5982\u679C\u6C60\u5DF2\u6EE1\uFF0C\u5BF9\u8C61\u4F1A\u88AB\u4E22\u5F03\uFF08\u7531GC\u56DE\u6536\uFF09\r\n }\r\n\r\n /**\r\n * \u9884\u70ED\u6C60\uFF0C\u521B\u5EFA\u6307\u5B9A\u6570\u91CF\u7684\u5BF9\u8C61\r\n * @param count \u8981\u521B\u5EFA\u7684\u5BF9\u8C61\u6570\u91CF\r\n */\r\n public warmUp(count: number): void {\r\n const targetSize = Math.min(count, this._maxSize);\r\n \r\n while (this._objects.length < targetSize) {\r\n const obj = this._createFn();\r\n this._stats.totalCreated++;\r\n this._objects.push(obj);\r\n this._stats.size++;\r\n }\r\n \r\n this._updateMemoryUsage();\r\n }\r\n\r\n /**\r\n * \u6E05\u7A7A\u6C60\r\n */\r\n public clear(): void {\r\n this._objects.length = 0;\r\n this._stats.size = 0;\r\n this._updateMemoryUsage();\r\n }\r\n\r\n /**\r\n * \u83B7\u53D6\u6C60\u4E2D\u5BF9\u8C61\u6570\u91CF\r\n */\r\n public get size(): number {\r\n return this._objects.length;\r\n }\r\n\r\n /**\r\n * \u83B7\u53D6\u6C60\u7684\u6700\u5927\u5927\u5C0F\r\n */\r\n public get maxSize(): number {\r\n return this._maxSize;\r\n }\r\n\r\n /**\r\n * \u8BBE\u7F6E\u6C60\u7684\u6700\u5927\u5927\u5C0F\r\n */\r\n public set maxSize(value: number) {\r\n this._maxSize = value;\r\n this._stats.maxSize = value;\r\n \r\n // \u5982\u679C\u5F53\u524D\u6C60\u5927\u5C0F\u8D85\u8FC7\u65B0\u7684\u6700\u5927\u503C\uFF0C\u5219\u79FB\u9664\u591A\u4F59\u7684\u5BF9\u8C61\r\n while (this._objects.length > this._maxSize) {\r\n this._objects.pop();\r\n this._stats.size--;\r\n }\r\n \r\n this._updateMemoryUsage();\r\n }\r\n\r\n /**\r\n * \u83B7\u53D6\u6C60\u7684\u7EDF\u8BA1\u4FE1\u606F\r\n */\r\n public getStats(): PoolStats {\r\n return { ...this._stats };\r\n }\r\n\r\n /**\r\n * \u91CD\u7F6E\u7EDF\u8BA1\u4FE1\u606F\r\n */\r\n public resetStats(): void {\r\n this._stats.totalCreated = 0;\r\n this._stats.totalObtained = 0;\r\n this._stats.totalReleased = 0;\r\n this._stats.hitRate = 0;\r\n }\r\n\r\n /**\r\n * \u66F4\u65B0\u547D\u4E2D\u7387\r\n */\r\n private _updateHitRate(): void {\r\n if (this._stats.totalObtained > 0) {\r\n const hits = this._stats.totalObtained - this._stats.totalCreated;\r\n this._stats.hitRate = hits / this._stats.totalObtained;\r\n }\r\n }\r\n\r\n /**\r\n * \u66F4\u65B0\u5185\u5B58\u4F7F\u7528\u4F30\u7B97\r\n */\r\n private _updateMemoryUsage(): void {\r\n this._stats.estimatedMemoryUsage = this._stats.size * this._objectSize;\r\n }\r\n\r\n /**\r\n * \u9759\u6001\u65B9\u6CD5\uFF1A\u4ECE\u6307\u5B9A\u7C7B\u578B\u7684\u6C60\u4E2D\u83B7\u53D6\u5BF9\u8C61\r\n * @param type \u5BF9\u8C61\u7C7B\u578B\r\n * @returns \u5BF9\u8C61\u5B9E\u4F8B\r\n */\r\n public static obtain<T extends IPoolable>(type: new (...args: any[]) => T): T {\r\n return this.getPool(type).obtain();\r\n }\r\n\r\n /**\r\n * \u9759\u6001\u65B9\u6CD5\uFF1A\u5C06\u5BF9\u8C61\u5F52\u8FD8\u5230\u5BF9\u5E94\u7C7B\u578B\u7684\u6C60\u4E2D\r\n * @param type \u5BF9\u8C61\u7C7B\u578B\r\n * @param obj \u8981\u5F52\u8FD8\u7684\u5BF9\u8C61\r\n */\r\n public static free<T extends IPoolable>(type: new (...args: any[]) => T, obj: T): void {\r\n this.getPool(type).free(obj);\r\n }\r\n\r\n /**\r\n * \u9759\u6001\u65B9\u6CD5\uFF1A\u9884\u70ED\u6307\u5B9A\u7C7B\u578B\u7684\u6C60\r\n * @param type \u5BF9\u8C61\u7C7B\u578B\r\n * @param count \u8981\u521B\u5EFA\u7684\u5BF9\u8C61\u6570\u91CF\r\n */\r\n public static warmUp<T extends IPoolable>(type: new (...args: any[]) => T, count: number): void {\r\n this.getPool(type).warmUp(count);\r\n }\r\n\r\n /**\r\n * \u9759\u6001\u65B9\u6CD5\uFF1A\u6E05\u7A7A\u6307\u5B9A\u7C7B\u578B\u7684\u6C60\r\n * @param type \u5BF9\u8C61\u7C7B\u578B\r\n */\r\n public static clearPool<T extends IPoolable>(type: new (...args: any[]) => T): void {\r\n const pool = this._pools.get(type);\r\n if (pool) {\r\n pool.clear();\r\n }\r\n }\r\n\r\n /**\r\n * \u9759\u6001\u65B9\u6CD5\uFF1A\u6E05\u7A7A\u6240\u6709\u6C60\r\n */\r\n public static clearAllPools(): void {\r\n for (const pool of this._pools.values()) {\r\n pool.clear();\r\n }\r\n this._pools.clear();\r\n }\r\n\r\n /**\r\n * \u9759\u6001\u65B9\u6CD5\uFF1A\u83B7\u53D6\u6C60\u7684\u7EDF\u8BA1\u4FE1\u606F\r\n * @returns \u6C60\u7684\u7EDF\u8BA1\u4FE1\u606F\r\n */\r\n public static getStats(): { [typeName: string]: PoolStats } {\r\n const stats: { [typeName: string]: PoolStats } = {};\r\n \r\n for (const [type, pool] of this._pools.entries()) {\r\n const typeName = (type as any).name || 'Unknown';\r\n stats[typeName] = pool.getStats();\r\n }\r\n \r\n return stats;\r\n }\r\n\r\n /**\r\n * \u9759\u6001\u65B9\u6CD5\uFF1A\u83B7\u53D6\u6240\u6709\u6C60\u7684\u603B\u5185\u5B58\u4F7F\u7528\u91CF\r\n * @returns \u603B\u5185\u5B58\u4F7F\u7528\u91CF\uFF08\u5B57\u8282\uFF09\r\n */\r\n public static getTotalMemoryUsage(): number {\r\n let total = 0;\r\n for (const pool of this._pools.values()) {\r\n total += pool.getStats().estimatedMemoryUsage;\r\n }\r\n return total;\r\n }\r\n\r\n /**\r\n * \u9759\u6001\u65B9\u6CD5\uFF1A\u83B7\u53D6\u6027\u80FD\u62A5\u544A\r\n * @returns \u683C\u5F0F\u5316\u7684\u6027\u80FD\u62A5\u544A\r\n */\r\n public static getPerformanceReport(): string {\r\n const stats = this.getStats();\r\n const lines: string[] = [];\r\n \r\n lines.push('=== Object Pool Performance Report ===');\r\n lines.push(`Total Memory Usage: ${(this.getTotalMemoryUsage() / 1024 / 1024).toFixed(2)} MB`);\r\n lines.push('');\r\n \r\n for (const [typeName, stat] of Object.entries(stats)) {\r\n lines.push(`${typeName}:`);\r\n lines.push(` Size: ${stat.size}/${stat.maxSize}`);\r\n lines.push(` Hit Rate: ${(stat.hitRate * 100).toFixed(1)}%`);\r\n lines.push(` Total Created: ${stat.totalCreated}`);\r\n lines.push(` Total Obtained: ${stat.totalObtained}`);\r\n lines.push(` Memory: ${(stat.estimatedMemoryUsage / 1024).toFixed(1)} KB`);\r\n lines.push('');\r\n }\r\n \r\n return lines.join('\\n');\r\n }\r\n}\r\n\r\n/**\r\n * \u5206\u5C42\u5BF9\u8C61\u6C60\r\n * \u4F7F\u7528\u591A\u4E2A\u4E0D\u540C\u5927\u5C0F\u7684\u6C60\u6765\u4F18\u5316\u5185\u5B58\u4F7F\u7528\r\n */\r\nexport class TieredObjectPool<T extends IPoolable> {\r\n private pools: Pool<T>[] = [];\r\n private createFn: () => T;\r\n private resetFn: (obj: T) => void;\r\n private tierSizes: number[];\r\n private totalObtained = 0;\r\n private totalReleased = 0;\r\n\r\n /**\r\n * \u6784\u9020\u51FD\u6570\r\n * @param createFn \u521B\u5EFA\u5BF9\u8C61\u7684\u51FD\u6570\r\n * @param resetFn \u91CD\u7F6E\u5BF9\u8C61\u7684\u51FD\u6570\r\n * @param tierSizes \u5404\u5C42\u7EA7\u7684\u5927\u5C0F\uFF0C\u9ED8\u8BA4[10, 50, 200]\r\n * @param estimatedObjectSize \u4F30\u7B97\u7684\u5355\u4E2A\u5BF9\u8C61\u5927\u5C0F\r\n */\r\n constructor(\r\n createFn: () => T, \r\n resetFn: (obj: T) => void, \r\n tierSizes: number[] = [10, 50, 200],\r\n estimatedObjectSize: number = 1024\r\n ) {\r\n this.createFn = createFn;\r\n this.resetFn = resetFn;\r\n this.tierSizes = tierSizes;\r\n \r\n // \u521D\u59CB\u5316\u4E0D\u540C\u5C42\u7EA7\u7684\u6C60\r\n for (const size of tierSizes) {\r\n this.pools.push(new Pool(createFn, size, estimatedObjectSize));\r\n }\r\n }\r\n\r\n /**\r\n * \u83B7\u53D6\u5BF9\u8C61\r\n * @returns \u5BF9\u8C61\u5B9E\u4F8B\r\n */\r\n public obtain(): T {\r\n this.totalObtained++;\r\n \r\n // \u4ECE\u6700\u5C0F\u7684\u6C60\u5F00\u59CB\u5C1D\u8BD5\u83B7\u53D6\r\n for (const pool of this.pools) {\r\n if (pool.size > 0) {\r\n return pool.obtain();\r\n }\r\n }\r\n \r\n // \u6240\u6709\u6C60\u90FD\u7A7A\u4E86\uFF0C\u521B\u5EFA\u65B0\u5BF9\u8C61\r\n return this.createFn();\r\n }\r\n\r\n /**\r\n * \u91CA\u653E\u5BF9\u8C61\r\n * @param obj \u8981\u91CA\u653E\u7684\u5BF9\u8C61\r\n */\r\n public release(obj: T): void {\r\n this.totalReleased++;\r\n this.resetFn(obj);\r\n \r\n // \u653E\u5165\u7B2C\u4E00\u4E2A\u6709\u7A7A\u95F4\u7684\u6C60\r\n for (const pool of this.pools) {\r\n if (pool.size < pool.maxSize) {\r\n pool.free(obj);\r\n return;\r\n }\r\n }\r\n \r\n // \u6240\u6709\u6C60\u90FD\u6EE1\u4E86\uFF0C\u76F4\u63A5\u4E22\u5F03\r\n }\r\n\r\n /**\r\n * \u9884\u70ED\u6240\u6709\u6C60\r\n * @param totalCount \u603B\u9884\u70ED\u6570\u91CF\r\n */\r\n public warmUp(totalCount: number): void {\r\n let remaining = totalCount;\r\n \r\n for (const pool of this.pools) {\r\n const warmUpCount = Math.min(remaining, pool.maxSize);\r\n pool.warmUp(warmUpCount);\r\n remaining -= warmUpCount;\r\n \r\n if (remaining <= 0) break;\r\n }\r\n }\r\n\r\n /**\r\n * \u6E05\u7A7A\u6240\u6709\u6C60\r\n */\r\n public clear(): void {\r\n for (const pool of this.pools) {\r\n pool.clear();\r\n }\r\n }\r\n\r\n /**\r\n * \u83B7\u53D6\u7EDF\u8BA1\u4FE1\u606F\r\n */\r\n public getStats(): {\r\n totalSize: number;\r\n totalMaxSize: number;\r\n totalMemoryUsage: number;\r\n tierStats: PoolStats[];\r\n hitRate: number;\r\n } {\r\n let totalSize = 0;\r\n let totalMaxSize = 0;\r\n let totalMemoryUsage = 0;\r\n const tierStats: PoolStats[] = [];\r\n \r\n for (const pool of this.pools) {\r\n const stats = pool.getStats();\r\n tierStats.push(stats);\r\n totalSize += stats.size;\r\n totalMaxSize += stats.maxSize;\r\n totalMemoryUsage += stats.estimatedMemoryUsage;\r\n }\r\n \r\n const hitRate = this.totalObtained > 0 ? \r\n (this.totalObtained - this.getTotalCreated()) / this.totalObtained : 0;\r\n \r\n return {\r\n totalSize,\r\n totalMaxSize,\r\n totalMemoryUsage,\r\n tierStats,\r\n hitRate\r\n };\r\n }\r\n\r\n /**\r\n * \u83B7\u53D6\u603B\u521B\u5EFA\u6570\u91CF\r\n */\r\n private getTotalCreated(): number {\r\n return this.pools.reduce((total, pool) => total + pool.getStats().totalCreated, 0);\r\n }\r\n}\r\n\r\n/**\r\n * \u6C60\u7BA1\u7406\u5668\r\n * \u7EDF\u4E00\u7BA1\u7406\u6240\u6709\u5BF9\u8C61\u6C60\r\n */\r\nexport class PoolManager {\r\n private static instance: PoolManager;\r\n private pools = new Map<string, Pool<any> | TieredObjectPool<any>>();\r\n private autoCompactInterval = 60000; // 60\u79D2\r\n private lastCompactTime = 0;\r\n\r\n public static getInstance(): PoolManager {\r\n if (!PoolManager.instance) {\r\n PoolManager.instance = new PoolManager();\r\n }\r\n return PoolManager.instance;\r\n }\r\n\r\n /**\r\n * \u6CE8\u518C\u6C60\r\n * @param name \u6C60\u540D\u79F0\r\n * @param pool \u6C60\u5B9E\u4F8B\r\n */\r\n public registerPool<T extends IPoolable>(name: string, pool: Pool<T> | TieredObjectPool<T>): void {\r\n this.pools.set(name, pool);\r\n }\r\n\r\n /**\r\n * \u83B7\u53D6\u6C60\r\n * @param name \u6C60\u540D\u79F0\r\n * @returns \u6C60\u5B9E\u4F8B\r\n */\r\n public getPool<T extends IPoolable>(name: string): Pool<T> | TieredObjectPool<T> | null {\r\n return this.pools.get(name) || null;\r\n }\r\n\r\n /**\r\n * \u66F4\u65B0\u6C60\u7BA1\u7406\u5668\uFF08\u5E94\u5728\u6E38\u620F\u5FAA\u73AF\u4E2D\u8C03\u7528\uFF09\r\n */\r\n public update(): void {\r\n const now = Date.now();\r\n \r\n if (now - this.lastCompactTime > this.autoCompactInterval) {\r\n this.compactAllPools();\r\n this.lastCompactTime = now;\r\n }\r\n }\r\n\r\n /**\r\n * \u538B\u7F29\u6240\u6709\u6C60\uFF08\u6E05\u7406\u788E\u7247\uFF09\r\n */\r\n public compactAllPools(): void {\r\n // \u5BF9\u4E8E\u6807\u51C6\u6C60\uFF0C\u53EF\u4EE5\u8003\u8651\u6E05\u7406\u4E00\u4E9B\u957F\u65F6\u95F4\u672A\u4F7F\u7528\u7684\u5BF9\u8C61\r\n // \u8FD9\u91CC\u7B80\u5355\u5B9E\u73B0\u4E3A\u91CD\u7F6E\u7EDF\u8BA1\u4FE1\u606F\r\n for (const pool of this.pools.values()) {\r\n if (pool instanceof Pool) {\r\n pool.resetStats();\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * \u83B7\u53D6\u6240\u6709\u6C60\u7684\u7EDF\u8BA1\u4FE1\u606F\r\n */\r\n public getAllStats(): Map<string, any> {\r\n const stats = new Map<string, any>();\r\n \r\n for (const [name, pool] of this.pools.entries()) {\r\n if (pool instanceof Pool) {\r\n stats.set(name, pool.getStats());\r\n } else if (pool instanceof TieredObjectPool) {\r\n stats.set(name, pool.getStats());\r\n }\r\n }\r\n \r\n return stats;\r\n }\r\n\r\n /**\r\n * \u751F\u6210\u6027\u80FD\u62A5\u544A\r\n */\r\n public generateReport(): string {\r\n const lines: string[] = [];\r\n lines.push('=== Pool Manager Report ===');\r\n \r\n let totalMemory = 0;\r\n \r\n for (const [name, pool] of this.pools.entries()) {\r\n lines.push(`\\n${name}:`);\r\n \r\n if (pool instanceof Pool) {\r\n const stats = pool.getStats();\r\n lines.push(` Type: Standard Pool`);\r\n lines.push(` Size: ${stats.size}/${stats.maxSize}`);\r\n lines.push(` Hit Rate: ${(stats.hitRate * 100).toFixed(1)}%`);\r\n lines.push(` Memory: ${(stats.estimatedMemoryUsage / 1024).toFixed(1)} KB`);\r\n totalMemory += stats.estimatedMemoryUsage;\r\n } else if (pool instanceof TieredObjectPool) {\r\n const stats = pool.getStats();\r\n lines.push(` Type: Tiered Pool`);\r\n lines.push(` Total Size: ${stats.totalSize}/${stats.totalMaxSize}`);\r\n lines.push(` Hit Rate: ${(stats.hitRate * 100).toFixed(1)}%`);\r\n lines.push(` Memory: ${(stats.totalMemoryUsage / 1024).toFixed(1)} KB`);\r\n totalMemory += stats.totalMemoryUsage;\r\n }\r\n }\r\n \r\n lines.push(`\\nTotal Memory Usage: ${(totalMemory / 1024 / 1024).toFixed(2)} MB`);\r\n \r\n return lines.join('\\n');\r\n }\r\n} ", "import { Component } from '../Component';\r\n\r\n/**\r\n * \u7EC4\u4EF6\u7C7B\u578B\u5B9A\u4E49\r\n */\r\nexport type ComponentType<T extends Component = Component> = new (...args: any[]) => T;\r\n\r\n/**\r\n * \u7EC4\u4EF6\u6CE8\u518C\u8868\r\n * \u7BA1\u7406\u7EC4\u4EF6\u7C7B\u578B\u7684\u4F4D\u63A9\u7801\u5206\u914D\r\n */\r\nexport class ComponentRegistry {\r\n private static componentTypes = new Map<Function, number>();\r\n private static nextBitIndex = 0;\r\n private static maxComponents = 64; // \u652F\u6301\u6700\u591A64\u79CD\u7EC4\u4EF6\u7C7B\u578B\r\n\r\n /**\r\n * \u6CE8\u518C\u7EC4\u4EF6\u7C7B\u578B\u5E76\u5206\u914D\u4F4D\u63A9\u7801\r\n * @param componentType \u7EC4\u4EF6\u7C7B\u578B\r\n * @returns \u5206\u914D\u7684\u4F4D\u7D22\u5F15\r\n */\r\n public static register<T extends Component>(componentType: ComponentType<T>): number {\r\n if (this.componentTypes.has(componentType)) {\r\n return this.componentTypes.get(componentType)!;\r\n }\r\n\r\n if (this.nextBitIndex >= this.maxComponents) {\r\n throw new Error(`Maximum number of component types (${this.maxComponents}) exceeded`);\r\n }\r\n\r\n const bitIndex = this.nextBitIndex++;\r\n this.componentTypes.set(componentType, bitIndex);\r\n return bitIndex;\r\n }\r\n\r\n /**\r\n * \u83B7\u53D6\u7EC4\u4EF6\u7C7B\u578B\u7684\u4F4D\u63A9\u7801\r\n * @param componentType \u7EC4\u4EF6\u7C7B\u578B\r\n * @returns \u4F4D\u63A9\u7801\r\n */\r\n public static getBitMask<T extends Component>(componentType: ComponentType<T>): bigint {\r\n const bitIndex = this.componentTypes.get(componentType);\r\n if (bitIndex === undefined) {\r\n throw new Error(`Component type ${componentType.name} is not registered`);\r\n }\r\n return BigInt(1) << BigInt(bitIndex);\r\n }\r\n\r\n /**\r\n * \u83B7\u53D6\u7EC4\u4EF6\u7C7B\u578B\u7684\u4F4D\u7D22\u5F15\r\n * @param componentType \u7EC4\u4EF6\u7C7B\u578B\r\n * @returns \u4F4D\u7D22\u5F15\r\n */\r\n public static getBitIndex<T extends Component>(componentType: ComponentType<T>): number {\r\n const bitIndex = this.componentTypes.get(componentType);\r\n if (bitIndex === undefined) {\r\n throw new Error(`Component type ${componentType.name} is not registered`);\r\n }\r\n return bitIndex;\r\n }\r\n\r\n /**\r\n * \u68C0\u67E5\u7EC4\u4EF6\u7C7B\u578B\u662F\u5426\u5DF2\u6CE8\u518C\r\n * @param componentType \u7EC4\u4EF6\u7C7B\u578B\r\n * @returns \u662F\u5426\u5DF2\u6CE8\u518C\r\n */\r\n public static isRegistered<T extends Component>(componentType: ComponentType<T>): boolean {\r\n return this.componentTypes.has(componentType);\r\n }\r\n\r\n /**\r\n * \u83B7\u53D6\u6240\u6709\u5DF2\u6CE8\u518C\u7684\u7EC4\u4EF6\u7C7B\u578B\r\n * @returns \u7EC4\u4EF6\u7C7B\u578B\u6620\u5C04\r\n */\r\n public static getAllRegisteredTypes(): Map<Function, number> {\r\n return new Map(this.componentTypes);\r\n }\r\n}\r\n\r\n/**\r\n * \u9AD8\u6027\u80FD\u7EC4\u4EF6\u5B58\u50A8\u5668\r\n * \u4F7F\u7528SoA\uFF08Structure of Arrays\uFF09\u6A21\u5F0F\u5B58\u50A8\u7EC4\u4EF6\r\n */\r\nexport class ComponentStorage<T extends Component> {\r\n private components: (T | null)[] = [];\r\n private entityToIndex = new Map<number, number>();\r\n private indexToEntity: number[] = [];\r\n private freeIndices: number[] = [];\r\n private componentType: ComponentType<T>;\r\n private _size = 0;\r\n\r\n constructor(componentType: ComponentType<T>) {\r\n this.componentType = componentType;\r\n \r\n // \u786E\u4FDD\u7EC4\u4EF6\u7C7B\u578B\u5DF2\u6CE8\u518C\r\n if (!ComponentRegistry.isRegistered(componentType)) {\r\n ComponentRegistry.register(componentType);\r\n }\r\n }\r\n\r\n /**\r\n * \u6DFB\u52A0\u7EC4\u4EF6\r\n * @param entityId \u5B9E\u4F53ID\r\n * @param component \u7EC4\u4EF6\u5B9E\u4F8B\r\n */\r\n public addComponent(entityId: number, component: T): void {\r\n // \u68C0\u67E5\u5B9E\u4F53\u662F\u5426\u5DF2\u6709\u6B64\u7EC4\u4EF6\r\n if (this.entityToIndex.has(entityId)) {\r\n throw new Error(`Entity ${entityId} already has component ${this.componentType.name}`);\r\n }\r\n\r\n let index: number;\r\n \r\n if (this.freeIndices.length > 0) {\r\n // \u91CD\u7528\u7A7A\u95F2\u7D22\u5F15\r\n index = this.freeIndices.pop()!;\r\n this.components[index] = component;\r\n this.indexToEntity[index] = entityId;\r\n } else {\r\n // \u6DFB\u52A0\u5230\u672B\u5C3E\r\n index = this.components.length;\r\n this.components.push(component);\r\n this.indexToEntity.push(entityId);\r\n }\r\n \r\n this.entityToIndex.set(entityId, index);\r\n this._size++;\r\n }\r\n\r\n /**\r\n * \u83B7\u53D6\u7EC4\u4EF6\r\n * @param entityId \u5B9E\u4F53ID\r\n * @returns \u7EC4\u4EF6\u5B9E\u4F8B\u6216null\r\n */\r\n public getComponent(entityId: number): T | null {\r\n const index = this.entityToIndex.get(entityId);\r\n return index !== undefined ? this.components[index] : null;\r\n }\r\n\r\n /**\r\n * \u68C0\u67E5\u5B9E\u4F53\u662F\u5426\u6709\u6B64\u7EC4\u4EF6\r\n * @param entityId \u5B9E\u4F53ID\r\n * @returns \u662F\u5426\u6709\u7EC4\u4EF6\r\n */\r\n public hasComponent(entityId: number): boolean {\r\n return this.entityToIndex.has(entityId);\r\n }\r\n\r\n /**\r\n * \u79FB\u9664\u7EC4\u4EF6\r\n * @param entityId \u5B9E\u4F53ID\r\n * @returns \u88AB\u79FB\u9664\u7684\u7EC4\u4EF6\u6216null\r\n */\r\n public removeComponent(entityId: number): T | null {\r\n const index = this.entityToIndex.get(entityId);\r\n if (index === undefined) {\r\n return null;\r\n }\r\n\r\n const component = this.components[index];\r\n this.entityToIndex.delete(entityId);\r\n this.components[index] = null;\r\n this.freeIndices.push(index);\r\n this._size--;\r\n\r\n return component;\r\n }\r\n\r\n /**\r\n * \u9AD8\u6548\u904D\u5386\u6240\u6709\u7EC4\u4EF6\r\n * @param callback \u56DE\u8C03\u51FD\u6570\r\n */\r\n public forEach(callback: (component: T, entityId: number, index: number) => void): void {\r\n for (let i = 0; i < this.components.length; i++) {\r\n const component = this.components[i];\r\n if (component) {\r\n callback(component, this.indexToEntity[i], i);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * \u83B7\u53D6\u6240\u6709\u7EC4\u4EF6\uFF08\u5BC6\u96C6\u6570\u7EC4\uFF09\r\n * @returns \u7EC4\u4EF6\u6570\u7EC4\r\n */\r\n public getDenseArray(): { components: T[]; entityIds: number[] } {\r\n const components: T[] = [];\r\n const entityIds: number[] = [];\r\n\r\n for (let i = 0; i < this.components.length; i++) {\r\n const component = this.components[i];\r\n if (component) {\r\n components.push(component);\r\n entityIds.push(this.indexToEntity[i]);\r\n }\r\n }\r\n\r\n return { components, entityIds };\r\n }\r\n\r\n /**\r\n * \u6E05\u7A7A\u6240\u6709\u7EC4\u4EF6\r\n */\r\n public clear(): void {\r\n this.components.length = 0;\r\n this.entityToIndex.clear();\r\n this.indexToEntity.length = 0;\r\n this.freeIndices.length = 0;\r\n this._size = 0;\r\n }\r\n\r\n /**\r\n * \u83B7\u53D6\u7EC4\u4EF6\u6570\u91CF\r\n */\r\n public get size(): number {\r\n return this._size;\r\n }\r\n\r\n /**\r\n * \u83B7\u53D6\u7EC4\u4EF6\u7C7B\u578B\r\n */\r\n public get type(): ComponentType<T> {\r\n return this.componentType;\r\n }\r\n\r\n /**\r\n * \u538B\u7F29\u5B58\u50A8\uFF08\u79FB\u9664\u7A7A\u6D1E\uFF09\r\n */\r\n public compact(): void {\r\n if (this.freeIndices.length === 0) {\r\n return; // \u6CA1\u6709\u7A7A\u6D1E\uFF0C\u65E0\u9700\u538B\u7F29\r\n }\r\n\r\n const newComponents: T[] = [];\r\n const newIndexToEntity: number[] = [];\r\n const newEntityToIndex = new Map<number, number>();\r\n\r\n let newIndex = 0;\r\n for (let i = 0; i < this.components.length; i++) {\r\n const component = this.components[i];\r\n if (component) {\r\n newComponents[newIndex] = component;\r\n newIndexToEntity[newIndex] = this.indexToEntity[i];\r\n newEntityToIndex.set(this.indexToEntity[i], newIndex);\r\n newIndex++;\r\n }\r\n }\r\n\r\n this.components = newComponents;\r\n this.indexToEntity = newIndexToEntity;\r\n this.entityToIndex = newEntityToIndex;\r\n this.freeIndices.length = 0;\r\n }\r\n\r\n /**\r\n * \u83B7\u53D6\u5B58\u50A8\u7EDF\u8BA1\u4FE1\u606F\r\n */\r\n public getStats(): {\r\n totalSlots: number;\r\n usedSlots: number;\r\n freeSlots: number;\r\n fragmentation: number;\r\n } {\r\n const totalSlots = this.components.length;\r\n const usedSlots = this._size;\r\n const freeSlots = this.freeIndices.length;\r\n const fragmentation = totalSlots > 0 ? freeSlots / totalSlots : 0;\r\n\r\n return {\r\n totalSlots,\r\n usedSlots,\r\n freeSlots,\r\n fragmentation\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * \u7EC4\u4EF6\u5B58\u50A8\u7BA1\u7406\u5668\r\n * \u7BA1\u7406\u6240\u6709\u7EC4\u4EF6\u7C7B\u578B\u7684\u5B58\u50A8\u5668\r\n */\r\nexport class ComponentStorageManager {\r\n private storages = new Map<Function, ComponentStorage<any>>();\r\n\r\n /**\r\n * \u83B7\u53D6\u6216\u521B\u5EFA\u7EC4\u4EF6\u5B58\u50A8\u5668\r\n * @param componentType \u7EC4\u4EF6\u7C7B\u578B\r\n * @returns \u7EC4\u4EF6\u5B58\u50A8\u5668\r\n */\r\n public getStorage<T extends Component>(componentType: ComponentType<T>): ComponentStorage<T> {\r\n let storage = this.storages.get(componentType);\r\n \r\n if (!storage) {\r\n storage = new ComponentStorage(componentType);\r\n this.storages.set(componentType, storage);\r\n }\r\n \r\n return storage;\r\n }\r\n\r\n /**\r\n * \u6DFB\u52A0\u7EC4\u4EF6\r\n * @param entityId \u5B9E\u4F53ID\r\n * @param component \u7EC4\u4EF6\u5B9E\u4F8B\r\n */\r\n public addComponent<T extends Component>(entityId: number, component: T): void {\r\n const componentType = component.constructor as ComponentType<T>;\r\n const storage = this.getStorage(componentType);\r\n storage.addComponent(entityId, component);\r\n }\r\n\r\n /**\r\n * \u83B7\u53D6\u7EC4\u4EF6\r\n * @param entityId \u5B9E\u4F53ID\r\n * @param componentType \u7EC4\u4EF6\u7C7B\u578B\r\n * @returns \u7EC4\u4EF6\u5B9E\u4F8B\u6216null\r\n */\r\n public getComponent<T extends Component>(entityId: number, componentType: ComponentType<T>): T | null {\r\n const storage = this.storages.get(componentType);\r\n return storage ? storage.getComponent(entityId) : null;\r\n }\r\n\r\n /**\r\n * \u68C0\u67E5\u5B9E\u4F53\u662F\u5426\u6709\u7EC4\u4EF6\r\n * @param entityId \u5B9E\u4F53ID\r\n * @param componentType \u7EC4\u4EF6\u7C7B\u578B\r\n * @returns \u662F\u5426\u6709\u7EC4\u4EF6\r\n */\r\n public hasComponent<T extends Component>(entityId: number, componentType: ComponentType<T>): boolean {\r\n const storage = this.storages.get(componentType);\r\n return storage ? storage.hasComponent(entityId) : false;\r\n }\r\n\r\n /**\r\n * \u79FB\u9664\u7EC4\u4EF6\r\n * @param entityId \u5B9E\u4F53ID\r\n * @param componentType \u7EC4\u4EF6\u7C7B\u578B\r\n * @returns \u88AB\u79FB\u9664\u7684\u7EC4\u4EF6\u6216null\r\n */\r\n public removeComponent<T extends Component>(entityId: number, componentType: ComponentType<T>): T | null {\r\n const storage = this.storages.get(componentType);\r\n return storage ? storage.removeComponent(entityId) : null;\r\n }\r\n\r\n /**\r\n * \u79FB\u9664\u5B9E\u4F53\u7684\u6240\u6709\u7EC4\u4EF6\r\n * @param entityId \u5B9E\u4F53ID\r\n */\r\n public removeAllComponents(entityId: number): void {\r\n for (const storage of this.storages.values()) {\r\n storage.removeComponent(entityId);\r\n }\r\n }\r\n\r\n /**\r\n * \u83B7\u53D6\u5B9E\u4F53\u7684\u7EC4\u4EF6\u4F4D\u63A9\u7801\r\n * @param entityId \u5B9E\u4F53ID\r\n * @returns \u7EC4\u4EF6\u4F4D\u63A9\u7801\r\n */\r\n public getComponentMask(entityId: number): bigint {\r\n let mask = BigInt(0);\r\n \r\n for (const [componentType, storage] of this.storages.entries()) {\r\n if (storage.hasComponent(entityId)) {\r\n mask |= ComponentRegistry.getBitMask(componentType as ComponentType);\r\n }\r\n }\r\n \r\n return mask;\r\n }\r\n\r\n /**\r\n * \u538B\u7F29\u6240\u6709\u5B58\u50A8\u5668\r\n */\r\n public compactAll(): void {\r\n for (const storage of this.storages.values()) {\r\n storage.compact();\r\n }\r\n }\r\n\r\n /**\r\n * \u83B7\u53D6\u6240\u6709\u5B58\u50A8\u5668\u7684\u7EDF\u8BA1\u4FE1\u606F\r\n */\r\n public getAllStats(): Map<string, any> {\r\n const stats = new Map<string, any>();\r\n \r\n for (const [componentType, storage] of this.storages.entries()) {\r\n const typeName = (componentType as any).name || 'Unknown';\r\n stats.set(typeName, storage.getStats());\r\n }\r\n \r\n return stats;\r\n }\r\n\r\n /**\r\n * \u6E05\u7A7A\u6240\u6709\u5B58\u50A8\u5668\r\n */\r\n public clear(): void {\r\n for (const storage of this.storages.values()) {\r\n storage.clear();\r\n }\r\n this.storages.clear();\r\n }\r\n}", "import { Component } from './Component';\r\nimport { ComponentRegistry, ComponentType } from './Core/ComponentStorage';\r\n\r\n/**\r\n * \u5B9E\u4F53\u6BD4\u8F83\u5668\r\n * \r\n * \u7528\u4E8E\u6BD4\u8F83\u4E24\u4E2A\u5B9E\u4F53\u7684\u4F18\u5148\u7EA7\uFF0C\u9996\u5148\u6309\u66F4\u65B0\u987A\u5E8F\u6BD4\u8F83\uFF0C\u7136\u540E\u6309ID\u6BD4\u8F83\u3002\r\n */\r\nexport class EntityComparer {\r\n /**\r\n * \u6BD4\u8F83\u4E24\u4E2A\u5B9E\u4F53\r\n * \r\n * @param self - \u7B2C\u4E00\u4E2A\u5B9E\u4F53\r\n * @param other - \u7B2C\u4E8C\u4E2A\u5B9E\u4F53\r\n * @returns \u6BD4\u8F83\u7ED3\u679C\uFF0C\u8D1F\u6570\u8868\u793Aself\u4F18\u5148\u7EA7\u66F4\u9AD8\uFF0C\u6B63\u6570\u8868\u793Aother\u4F18\u5148\u7EA7\u66F4\u9AD8\uFF0C0\u8868\u793A\u76F8\u7B49\r\n */\r\n public compare(self: Entity, other: Entity): number {\r\n let compare = self.updateOrder - other.updateOrder;\r\n if (compare == 0)\r\n compare = self.id - other.id;\r\n return compare;\r\n }\r\n}\r\n\r\n/**\r\n * \u7EC4\u4EF6\u7F13\u5B58\u9879\r\n */\r\ninterface ComponentCacheEntry<T extends Component = Component> {\r\n component: T;\r\n lastAccessed: number;\r\n accessCount: number;\r\n}\r\n\r\n/**\r\n * \u7EC4\u4EF6\u7F13\u5B58\u914D\u7F6E\r\n */\r\ninterface ComponentCacheConfig {\r\n maxSize: number;\r\n ttl: number; // \u751F\u5B58\u65F6\u95F4\uFF08\u6BEB\u79D2\uFF09\r\n enableLRU: boolean; // \u662F\u5426\u542F\u7528LRU\u6DD8\u6C70\u7B56\u7565\r\n}\r\n\r\n/**\r\n * \u9AD8\u6027\u80FD\u7EC4\u4EF6\u7F13\u5B58\r\n */\r\nclass ComponentCache {\r\n private cache = new Map<ComponentType, ComponentCacheEntry>();\r\n private accessOrder: ComponentType[] = [];\r\n private config: ComponentCacheConfig;\r\n\r\n constructor(config: ComponentCacheConfig = {\r\n maxSize: 16,\r\n ttl: 5000,\r\n enableLRU: true\r\n }) {\r\n this.config = config;\r\n }\r\n\r\n public get<T extends Component>(type: ComponentType<T>): T | null {\r\n const entry = this.cache.get(type);\r\n if (!entry) {\r\n return null;\r\n }\r\n\r\n // \u68C0\u67E5TTL\r\n if (Date.now() - entry.lastAccessed > this.config.ttl) {\r\n this.cache.delete(type);\r\n this.removeFromAccessOrder(type);\r\n return null;\r\n }\r\n\r\n // \u66F4\u65B0\u8BBF\u95EE\u4FE1\u606F\r\n entry.lastAccessed = Date.now();\r\n entry.accessCount++;\r\n\r\n // \u66F4\u65B0LRU\u987A\u5E8F\r\n if (this.config.enableLRU) {\r\n this.updateAccessOrder(type);\r\n }\r\n\r\n return entry.component as T;\r\n }\r\n\r\n public set<T extends Component>(type: ComponentType<T>, component: T): void {\r\n // \u68C0\u67E5\u7F13\u5B58\u5927\u5C0F\u9650\u5236\r\n if (this.cache.size >= this.config.maxSize && !this.cache.has(type)) {\r\n this.evictLeastRecentlyUsed();\r\n }\r\n\r\n const entry: ComponentCacheEntry<T> = {\r\n component,\r\n lastAccessed: Date.now(),\r\n accessCount: 1\r\n };\r\n\r\n this.cache.set(type, entry);\r\n\r\n if (this.config.enableLRU) {\r\n this.updateAccessOrder(type);\r\n }\r\n }\r\n\r\n public delete(type: ComponentType): boolean {\r\n const deleted = this.cache.delete(type);\r\n if (deleted) {\r\n this.removeFromAccessOrder(type);\r\n }\r\n return deleted;\r\n }\r\n\r\n public clear(): void {\r\n this.cache.clear();\r\n this.accessOrder.length = 0;\r\n }\r\n\r\n public has(type: ComponentType): boolean {\r\n return this.cache.has(type);\r\n }\r\n\r\n private evictLeastRecentlyUsed(): void {\r\n if (this.accessOrder.length > 0) {\r\n const lruType = this.accessOrder[0];\r\n this.cache.delete(lruType);\r\n this.accessOrder.shift();\r\n }\r\n }\r\n\r\n private updateAccessOrder(type: ComponentType): void {\r\n this.removeFromAccessOrder(type);\r\n this.accessOrder.push(type);\r\n }\r\n\r\n private removeFromAccessOrder(type: ComponentType): void {\r\n const index = this.accessOrder.indexOf(type);\r\n if (index !== -1) {\r\n this.accessOrder.splice(index, 1);\r\n }\r\n }\r\n\r\n public getStats(): {\r\n size: number;\r\n maxSize: number;\r\n hitRate: number;\r\n averageAccessCount: number;\r\n } {\r\n let totalAccess = 0;\r\n let totalHits = 0;\r\n\r\n for (const entry of this.cache.values()) {\r\n totalAccess += entry.accessCount;\r\n totalHits++;\r\n }\r\n\r\n return {\r\n size: this.cache.size,\r\n maxSize: this.config.maxSize,\r\n hitRate: totalAccess > 0 ? totalHits / totalAccess : 0,\r\n averageAccessCount: this.cache.size > 0 ? totalAccess / this.cache.size : 0\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * \u6E38\u620F\u5B9E\u4F53\u7C7B\r\n * \r\n * ECS\u67B6\u6784\u4E2D\u7684\u5B9E\u4F53\uFF08Entity\uFF09\uFF0C\u4F5C\u4E3A\u7EC4\u4EF6\u7684\u5BB9\u5668\u3002\r\n * \u5B9E\u4F53\u672C\u8EAB\u4E0D\u5305\u542B\u6E38\u620F\u903B\u8F91\uFF0C\u6240\u6709\u529F\u80FD\u90FD\u901A\u8FC7\u7EC4\u4EF6\u6765\u5B9E\u73B0\u3002\r\n * \u652F\u6301\u7236\u5B50\u5173\u7CFB\uFF0C\u53EF\u4EE5\u6784\u5EFA\u5B9E\u4F53\u5C42\u6B21\u7ED3\u6784\u3002\r\n * \r\n * @example\r\n * ```typescript\r\n * // \u521B\u5EFA\u5B9E\u4F53\r\n * const entity = new Entity(\"Player\", 1);\r\n * \r\n * // \u6DFB\u52A0\u7EC4\u4EF6\r\n * const healthComponent = entity.addComponent(new HealthComponent(100));\r\n * \r\n * // \u83B7\u53D6\u7EC4\u4EF6\r\n * const health = entity.getComponent(HealthComponent);\r\n * \r\n * // \u8BBE\u7F6E\u4F4D\u7F6E\r\n * entity.position = new Vector2(100, 200);\r\n * \r\n * // \u6DFB\u52A0\u5B50\u5B9E\u4F53\r\n * const weapon = new Entity(\"Weapon\", 2);\r\n * entity.addChild(weapon);\r\n * ```\r\n */\r\nexport class Entity {\r\n /**\r\n * \u5B9E\u4F53\u6BD4\u8F83\u5668\u5B9E\u4F8B\r\n */\r\n public static entityComparer: EntityComparer = new EntityComparer();\r\n \r\n /**\r\n * \u5B9E\u4F53\u540D\u79F0\r\n * \r\n * \u7528\u4E8E\u6807\u8BC6\u548C\u8C03\u8BD5\u7684\u53CB\u597D\u540D\u79F0\u3002\r\n */\r\n public name: string;\r\n \r\n /**\r\n * \u5B9E\u4F53\u552F\u4E00\u6807\u8BC6\u7B26\r\n * \r\n * \u5728\u573A\u666F\u4E2D\u552F\u4E00\u7684\u6570\u5B57\u6807\u8BC6\u7B26\u3002\r\n */\r\n public readonly id: number;\r\n \r\n /**\r\n * \u7EC4\u4EF6\u96C6\u5408\r\n * \r\n * \u5B58\u50A8\u5B9E\u4F53\u62E5\u6709\u7684\u6240\u6709\u7EC4\u4EF6\u3002\r\n */\r\n public readonly components: Component[] = [];\r\n \r\n /**\r\n * \u6240\u5C5E\u573A\u666F\u5F15\u7528\r\n * \r\n * \u6307\u5411\u5B9E\u4F53\u6240\u5728\u7684\u573A\u666F\u5B9E\u4F8B\u3002\r\n */\r\n public scene: any; // \u4F7F\u7528any\u907F\u514D\u5FAA\u73AF\u4F9D\u8D56\r\n \r\n /**\r\n * \u66F4\u65B0\u95F4\u9694\r\n * \r\n * \u63A7\u5236\u5B9E\u4F53\u66F4\u65B0\u7684\u9891\u7387\uFF0C\u503C\u8D8A\u5927\u66F4\u65B0\u8D8A\u4E0D\u9891\u7E41\u3002\r\n */\r\n public updateInterval: number = 1;\r\n \r\n /**\r\n * \u9500\u6BC1\u72B6\u6001\u6807\u5FD7\r\n * \r\n * \u6807\u8BB0\u5B9E\u4F53\u662F\u5426\u5DF2\u88AB\u9500\u6BC1\u3002\r\n */\r\n public _isDestroyed: boolean = false;\r\n\r\n /**\r\n * \u7236\u5B9E\u4F53\u5F15\u7528\r\n * \r\n * \u6307\u5411\u7236\u7EA7\u5B9E\u4F53\uFF0C\u7528\u4E8E\u6784\u5EFA\u5B9E\u4F53\u5C42\u6B21\u7ED3\u6784\u3002\r\n */\r\n private _parent: Entity | null = null;\r\n\r\n /**\r\n * \u5B50\u5B9E\u4F53\u96C6\u5408\r\n * \r\n * \u5B58\u50A8\u6240\u6709\u5B50\u7EA7\u5B9E\u4F53\u7684\u6570\u7EC4\u3002\r\n */\r\n private _children: Entity[] = [];\r\n\r\n /**\r\n * \u6FC0\u6D3B\u72B6\u6001\r\n * \r\n * \u63A7\u5236\u5B9E\u4F53\u662F\u5426\u5904\u4E8E\u6FC0\u6D3B\u72B6\u6001\u3002\r\n */\r\n private _active: boolean = true;\r\n \r\n /**\r\n * \u5B9E\u4F53\u6807\u7B7E\r\n * \r\n * \u7528\u4E8E\u5206\u7C7B\u548C\u67E5\u8BE2\u7684\u6570\u5B57\u6807\u7B7E\u3002\r\n */\r\n private _tag: number = 0;\r\n \r\n /**\r\n * \u542F\u7528\u72B6\u6001\r\n * \r\n * \u63A7\u5236\u5B9E\u4F53\u662F\u5426\u542F\u7528\u66F4\u65B0\u548C\u5904\u7406\u3002\r\n */\r\n private _enabled: boolean = true;\r\n \r\n /**\r\n * \u66F4\u65B0\u987A\u5E8F\r\n * \r\n * \u63A7\u5236\u5B9E\u4F53\u5728\u7CFB\u7EDF\u4E2D\u7684\u66F4\u65B0\u4F18\u5148\u7EA7\u3002\r\n */\r\n private _updateOrder: number = 0;\r\n\r\n /**\r\n * \u7EC4\u4EF6\u4F4D\u63A9\u7801\r\n * \r\n * \u7528\u4E8E\u5FEB\u901F\u67E5\u8BE2\u5B9E\u4F53\u62E5\u6709\u7684\u7EC4\u4EF6\u7C7B\u578B\u3002\r\n */\r\n private _componentMask: bigint = BigInt(0);\r\n\r\n /**\r\n * \u7EC4\u4EF6\u7C7B\u578B\u5230\u7D22\u5F15\u7684\u6620\u5C04\r\n * \r\n * \u7528\u4E8E\u5FEB\u901F\u5B9A\u4F4D\u7EC4\u4EF6\u5728\u6570\u7EC4\u4E2D\u7684\u4F4D\u7F6E\u3002\r\n */\r\n private _componentTypeToIndex = new Map<ComponentType, number>();\r\n\r\n /**\r\n * \u7EC4\u4EF6\u7F13\u5B58\r\n * \r\n * \u9AD8\u6027\u80FD\u7EC4\u4EF6\u8BBF\u95EE\u7F13\u5B58\u3002\r\n */\r\n private _componentCache: ComponentCache;\r\n\r\n /**\r\n * \u7EC4\u4EF6\u8BBF\u95EE\u7EDF\u8BA1\r\n * \r\n * \u8BB0\u5F55\u7EC4\u4EF6\u8BBF\u95EE\u7684\u6027\u80FD\u7EDF\u8BA1\u4FE1\u606F\u3002\r\n */\r\n private _componentAccessStats = new Map<ComponentType, {\r\n accessCount: number;\r\n lastAccessed: number;\r\n cacheHits: number;\r\n cacheMisses: number;\r\n }>();\r\n\r\n /**\r\n * \u6784\u9020\u51FD\u6570\r\n * \r\n * @param name - \u5B9E\u4F53\u540D\u79F0\r\n * @param id - \u5B9E\u4F53\u552F\u4E00\u6807\u8BC6\u7B26\r\n */\r\n constructor(name: string, id: number) {\r\n this.name = name;\r\n this.id = id;\r\n \r\n // \u521D\u59CB\u5316\u7EC4\u4EF6\u7F13\u5B58\r\n this._componentCache = new ComponentCache();\r\n }\r\n\r\n /**\r\n * \u83B7\u53D6\u9500\u6BC1\u72B6\u6001\r\n * \r\n * @returns \u5982\u679C\u5B9E\u4F53\u5DF2\u88AB\u9500\u6BC1\u5219\u8FD4\u56DEtrue\r\n */\r\n public get isDestroyed(): boolean {\r\n return this._isDestroyed;\r\n }\r\n\r\n /**\r\n * \u83B7\u53D6\u7236\u5B9E\u4F53\r\n * \r\n * @returns \u7236\u5B9E\u4F53\uFF0C\u5982\u679C\u6CA1\u6709\u7236\u5B9E\u4F53\u5219\u8FD4\u56DEnull\r\n */\r\n public get parent(): Entity | null {\r\n return this._parent;\r\n }\r\n\r\n /**\r\n * \u83B7\u53D6\u5B50\u5B9E\u4F53\u6570\u7EC4\u7684\u53EA\u8BFB\u526F\u672C\r\n * \r\n * @returns \u5B50\u5B9E\u4F53\u6570\u7EC4\u7684\u526F\u672C\r\n */\r\n public get children(): readonly Entity[] {\r\n return [...this._children];\r\n }\r\n\r\n /**\r\n * \u83B7\u53D6\u5B50\u5B9E\u4F53\u6570\u91CF\r\n * \r\n * @returns \u5B50\u5B9E\u4F53\u7684\u6570\u91CF\r\n */\r\n public get childCount(): number {\r\n return this._children.length;\r\n }\r\n\r\n /**\r\n * \u83B7\u53D6\u6D3B\u8DC3\u72B6\u6001\r\n * \r\n * @returns \u5982\u679C\u5B9E\u4F53\u5904\u4E8E\u6D3B\u8DC3\u72B6\u6001\u5219\u8FD4\u56DEtrue\r\n */\r\n public get active(): boolean {\r\n return this._active;\r\n }\r\n\r\n /**\r\n * \u8BBE\u7F6E\u6D3B\u8DC3\u72B6\u6001\r\n * \r\n * \u8BBE\u7F6E\u5B9E\u4F53\u7684\u6D3B\u8DC3\u72B6\u6001\uFF0C\u4F1A\u5F71\u54CD\u5B50\u5B9E\u4F53\u7684\u6709\u6548\u6D3B\u8DC3\u72B6\u6001\u3002\r\n * \r\n * @param value - \u65B0\u7684\u6D3B\u8DC3\u72B6\u6001\r\n */\r\n public set active(value: boolean) {\r\n if (this._active !== value) {\r\n this._active = value;\r\n this.onActiveChanged();\r\n }\r\n }\r\n\r\n /**\r\n * \u83B7\u53D6\u5B9E\u4F53\u7684\u6709\u6548\u6D3B\u8DC3\u72B6\u6001\r\n * \r\n * \u8003\u8651\u7236\u5B9E\u4F53\u7684\u6D3B\u8DC3\u72B6\u6001\uFF0C\u53EA\u6709\u5F53\u5B9E\u4F53\u672C\u8EAB\u548C\u6240\u6709\u7236\u5B9E\u4F53\u90FD\u5904\u4E8E\u6D3B\u8DC3\u72B6\u6001\u65F6\u624D\u8FD4\u56DEtrue\u3002\r\n * \r\n * @returns \u6709\u6548\u7684\u6D3B\u8DC3\u72B6\u6001\r\n */\r\n public get activeInHierarchy(): boolean {\r\n if (!this._active) return false;\r\n if (this._parent) return this._parent.activeInHierarchy;\r\n return true;\r\n }\r\n\r\n /**\r\n * \u83B7\u53D6\u5B9E\u4F53\u6807\u7B7E\r\n * \r\n * @returns \u5B9E\u4F53\u7684\u6570\u5B57\u6807\u7B7E\r\n */\r\n public get tag(): number {\r\n return this._tag;\r\n }\r\n\r\n /**\r\n * \u8BBE\u7F6E\u5B9E\u4F53\u6807\u7B7E\r\n * \r\n * @param value - \u65B0\u7684\u6807\u7B7E\u503C\r\n */\r\n public set tag(value: number) {\r\n this._tag = value;\r\n }\r\n\r\n /**\r\n * \u83B7\u53D6\u542F\u7528\u72B6\u6001\r\n * \r\n * @returns \u5982\u679C\u5B9E\u4F53\u5DF2\u542F\u7528\u5219\u8FD4\u56DEtrue\r\n */\r\n public get enabled(): boolean {\r\n return this._enabled;\r\n }\r\n\r\n /**\r\n * \u8BBE\u7F6E\u542F\u7528\u72B6\u6001\r\n * \r\n * @param value - \u65B0\u7684\u542F\u7528\u72B6\u6001\r\n */\r\n public set enabled(value: boolean) {\r\n this._enabled = value;\r\n }\r\n\r\n /**\r\n * \u83B7\u53D6\u66F4\u65B0\u987A\u5E8F\r\n * \r\n * @returns \u5B9E\u4F53\u7684\u66F4\u65B0\u987A\u5E8F\u503C\r\n */\r\n public get updateOrder(): number {\r\n return this._updateOrder;\r\n }\r\n\r\n /**\r\n * \u8BBE\u7F6E\u66F4\u65B0\u987A\u5E8F\r\n * \r\n * @param value - \u65B0\u7684\u66F4\u65B0\u987A\u5E8F\u503C\r\n */\r\n public set updateOrder(value: number) {\r\n this._updateOrder = value;\r\n }\r\n\r\n /**\r\n * \u83B7\u53D6\u7EC4\u4EF6\u4F4D\u63A9\u7801\r\n * \r\n * @returns \u5B9E\u4F53\u7684\u7EC4\u4EF6\u4F4D\u63A9\u7801\r\n */\r\n public get componentMask(): bigint {\r\n return this._componentMask;\r\n }\r\n\r\n /**\r\n * \u521B\u5EFA\u5E76\u6DFB\u52A0\u7EC4\u4EF6\r\n * \r\n * @param componentType - \u7EC4\u4EF6\u7C7B\u578B\r\n * @param args - \u7EC4\u4EF6\u6784\u9020\u51FD\u6570\u53C2\u6570\r\n * @returns \u521B\u5EFA\u7684\u7EC4\u4EF6\u5B9E\u4F8B\r\n */\r\n public createComponent<T extends Component>(\r\n componentType: ComponentType<T>, \r\n ...args: any[]\r\n ): T {\r\n const component = new componentType(...args);\r\n return this.addComponent(component);\r\n }\r\n\r\n /**\r\n * \u5185\u90E8\u6DFB\u52A0\u7EC4\u4EF6\u65B9\u6CD5\uFF08\u4E0D\u8FDB\u884C\u91CD\u590D\u68C0\u67E5\uFF0C\u7528\u4E8E\u521D\u59CB\u5316\uFF09\r\n * \r\n * @param component - \u8981\u6DFB\u52A0\u7684\u7EC4\u4EF6\u5B9E\u4F8B\r\n * @returns \u6DFB\u52A0\u7684\u7EC4\u4EF6\u5B9E\u4F8B\r\n */\r\n private addComponentInternal<T extends Component>(component: T): T {\r\n const componentType = component.constructor as ComponentType<T>;\r\n \r\n // \u6CE8\u518C\u7EC4\u4EF6\u7C7B\u578B\uFF08\u5982\u679C\u5C1A\u672A\u6CE8\u518C\uFF09\r\n if (!ComponentRegistry.isRegistered(componentType)) {\r\n ComponentRegistry.register(componentType);\r\n }\r\n\r\n // \u8BBE\u7F6E\u7EC4\u4EF6\u7684\u5B9E\u4F53\u5F15\u7528\r\n component.entity = this;\r\n \r\n // \u6DFB\u52A0\u5230\u7EC4\u4EF6\u5217\u8868\u5E76\u5EFA\u7ACB\u7D22\u5F15\u6620\u5C04\r\n const index = this.components.length;\r\n this.components.push(component);\r\n this._componentTypeToIndex.set(componentType, index);\r\n \r\n // \u66F4\u65B0\u4F4D\u63A9\u7801\r\n this._componentMask |= ComponentRegistry.getBitMask(componentType);\r\n \r\n // \u6DFB\u52A0\u5230\u7F13\u5B58\r\n this._componentCache.set(componentType, component);\r\n \r\n // \u521D\u59CB\u5316\u8BBF\u95EE\u7EDF\u8BA1\r\n this._componentAccessStats.set(componentType, {\r\n accessCount: 0,\r\n lastAccessed: Date.now(),\r\n cacheHits: 0,\r\n cacheMisses: 0\r\n });\r\n\r\n return component;\r\n }\r\n\r\n /**\r\n * \u6DFB\u52A0\u7EC4\u4EF6\u5230\u5B9E\u4F53\r\n * \r\n * @param component - \u8981\u6DFB\u52A0\u7684\u7EC4\u4EF6\u5B9E\u4F8B\r\n * @returns \u6DFB\u52A0\u7684\u7EC4\u4EF6\u5B9E\u4F8B\r\n * @throws {Error} \u5982\u679C\u7EC4\u4EF6\u7C7B\u578B\u5DF2\u5B58\u5728\r\n */\r\n public addComponent<T extends Component>(component: T): T {\r\n const componentType = component.constructor as ComponentType<T>;\r\n \r\n // \u68C0\u67E5\u662F\u5426\u5DF2\u6709\u6B64\u7C7B\u578B\u7684\u7EC4\u4EF6\r\n if (this.hasComponent(componentType)) {\r\n throw new Error(`Entity ${this.name} already has component ${componentType.name}`);\r\n }\r\n\r\n // \u4F7F\u7528\u5185\u90E8\u65B9\u6CD5\u6DFB\u52A0\u7EC4\u4EF6\r\n this.addComponentInternal(component);\r\n \r\n // \u5982\u679C\u573A\u666F\u5B58\u5728\u4E14\u6709\u7EC4\u4EF6\u5B58\u50A8\u7BA1\u7406\u5668\uFF0C\u6DFB\u52A0\u5230\u5B58\u50A8\u5668\r\n if (this.scene && this.scene.componentStorageManager) {\r\n this.scene.componentStorageManager.addComponent(this.id, component);\r\n }\r\n\r\n // \u8C03\u7528\u7EC4\u4EF6\u7684\u751F\u547D\u5468\u671F\u65B9\u6CD5\r\n component.onAddedToEntity();\r\n \r\n // \u901A\u77E5\u573A\u666F\u5B9E\u4F53\u5DF2\u6539\u53D8\r\n if (this.scene && this.scene.entityProcessors) {\r\n for (const processor of this.scene.entityProcessors.processors) {\r\n processor.onChanged(this);\r\n }\r\n }\r\n\r\n return component;\r\n }\r\n\r\n /**\r\n * \u83B7\u53D6\u6307\u5B9A\u7C7B\u578B\u7684\u7EC4\u4EF6\r\n * \r\n * @param type - \u7EC4\u4EF6\u7C7B\u578B\r\n * @returns \u7EC4\u4EF6\u5B9E\u4F8B\u6216null\r\n */\r\n public getComponent<T extends Component>(type: ComponentType<T>): T | null {\r\n // \u66F4\u65B0\u8BBF\u95EE\u7EDF\u8BA1\r\n this.updateComponentAccessStats(type);\r\n\r\n // \u9996\u5148\u68C0\u67E5\u4F4D\u63A9\u7801\uFF0C\u5FEB\u901F\u6392\u9664\r\n if (!ComponentRegistry.isRegistered(type)) {\r\n this.recordCacheMiss(type);\r\n return null;\r\n }\r\n \r\n const mask = ComponentRegistry.getBitMask(type);\r\n if ((this._componentMask & mask) === BigInt(0)) {\r\n this.recordCacheMiss(type);\r\n return null;\r\n }\r\n\r\n // \u5C1D\u8BD5\u4ECE\u7F13\u5B58\u83B7\u53D6\uFF08O(1)\uFF09\r\n const cachedComponent = this._componentCache.get(type);\r\n if (cachedComponent) {\r\n this.recordCacheHit(type);\r\n return cachedComponent;\r\n }\r\n\r\n // \u5C1D\u8BD5\u4ECE\u7D22\u5F15\u6620\u5C04\u83B7\u53D6\uFF08O(1)\uFF09\r\n const index = this._componentTypeToIndex.get(type);\r\n if (index !== undefined && index < this.components.length) {\r\n const component = this.components[index];\r\n if (component && component.constructor === type) {\r\n // \u6DFB\u52A0\u5230\u7F13\u5B58\r\n this._componentCache.set(type, component);\r\n this.recordCacheHit(type);\r\n return component as T;\r\n }\r\n }\r\n\r\n // \u5982\u679C\u573A\u666F\u6709\u7EC4\u4EF6\u5B58\u50A8\u7BA1\u7406\u5668\uFF0C\u4ECE\u5B58\u50A8\u5668\u83B7\u53D6\r\n if (this.scene && this.scene.componentStorageManager) {\r\n const component = this.scene.componentStorageManager.getComponent(this.id, type);\r\n if (component) {\r\n // \u66F4\u65B0\u672C\u5730\u7F13\u5B58\u548C\u7D22\u5F15\r\n this._componentCache.set(type, component);\r\n this.rebuildComponentIndex();\r\n this.recordCacheHit(type);\r\n return component;\r\n }\r\n }\r\n\r\n // \u6700\u540E\u56DE\u9000\u5230\u7EBF\u6027\u641C\u7D22\u5E76\u91CD\u5EFA\u7D22\u5F15\r\n for (let i = 0; i < this.components.length; i++) {\r\n const component = this.components[i];\r\n if (component instanceof type) {\r\n // \u91CD\u5EFA\u7D22\u5F15\u6620\u5C04\r\n this._componentTypeToIndex.set(type, i);\r\n this._componentCache.set(type, component);\r\n this.recordCacheHit(type);\r\n return component as T;\r\n }\r\n }\r\n \r\n this.recordCacheMiss(type);\r\n return null;\r\n }\r\n\r\n /**\r\n * \u66F4\u65B0\u7EC4\u4EF6\u8BBF\u95EE\u7EDF\u8BA1\r\n * \r\n * @param type - \u7EC4\u4EF6\u7C7B\u578B\r\n */\r\n private updateComponentAccessStats(type: ComponentType): void {\r\n let stats = this._componentAccessStats.get(type);\r\n if (!stats) {\r\n stats = {\r\n accessCount: 0,\r\n lastAccessed: Date.now(),\r\n cacheHits: 0,\r\n cacheMisses: 0\r\n };\r\n this._componentAccessStats.set(type, stats);\r\n }\r\n \r\n stats.accessCount++;\r\n stats.lastAccessed = Date.now();\r\n }\r\n\r\n /**\r\n * \u8BB0\u5F55\u7F13\u5B58\u547D\u4E2D\r\n * \r\n * @param type - \u7EC4\u4EF6\u7C7B\u578B\r\n */\r\n private recordCacheHit(type: ComponentType): void {\r\n const stats = this._componentAccessStats.get(type);\r\n if (stats) {\r\n stats.cacheHits++;\r\n }\r\n }\r\n\r\n /**\r\n * \u8BB0\u5F55\u7F13\u5B58\u672A\u547D\u4E2D\r\n * \r\n * @param type - \u7EC4\u4EF6\u7C7B\u578B\r\n */\r\n private recordCacheMiss(type: ComponentType): void {\r\n const stats = this._componentAccessStats.get(type);\r\n if (stats) {\r\n stats.cacheMisses++;\r\n }\r\n }\r\n\r\n /**\r\n * \u91CD\u5EFA\u7EC4\u4EF6\u7D22\u5F15\u6620\u5C04\r\n */\r\n private rebuildComponentIndex(): void {\r\n this._componentTypeToIndex.clear();\r\n \r\n for (let i = 0; i < this.components.length; i++) {\r\n const component = this.components[i];\r\n const componentType = component.constructor as ComponentType;\r\n this._componentTypeToIndex.set(componentType, i);\r\n }\r\n }\r\n\r\n /**\r\n * \u68C0\u67E5\u5B9E\u4F53\u662F\u5426\u6709\u6307\u5B9A\u7C7B\u578B\u7684\u7EC4\u4EF6\r\n * \r\n * @param type - \u7EC4\u4EF6\u7C7B\u578B\r\n * @returns \u5982\u679C\u6709\u8BE5\u7EC4\u4EF6\u5219\u8FD4\u56DEtrue\r\n */\r\n public hasComponent<T extends Component>(type: ComponentType<T>): boolean {\r\n if (!ComponentRegistry.isRegistered(type)) {\r\n return false;\r\n }\r\n \r\n const mask = ComponentRegistry.getBitMask(type);\r\n return (this._componentMask & mask) !== BigInt(0);\r\n }\r\n\r\n /**\r\n * \u83B7\u53D6\u6216\u521B\u5EFA\u6307\u5B9A\u7C7B\u578B\u7684\u7EC4\u4EF6\r\n * \r\n * @param type - \u7EC4\u4EF6\u7C7B\u578B\r\n * @param args - \u7EC4\u4EF6\u6784\u9020\u51FD\u6570\u53C2\u6570\uFF08\u4EC5\u5728\u521B\u5EFA\u65F6\u4F7F\u7528\uFF09\r\n * @returns \u7EC4\u4EF6\u5B9E\u4F8B\r\n */\r\n public getOrCreateComponent<T extends Component>(\r\n type: ComponentType<T>, \r\n ...args: any[]\r\n ): T {\r\n let component = this.getComponent(type);\r\n if (!component) {\r\n component = this.createComponent(type, ...args);\r\n }\r\n return component;\r\n }\r\n\r\n /**\r\n * \u79FB\u9664\u6307\u5B9A\u7684\u7EC4\u4EF6\r\n * \r\n * @param component - \u8981\u79FB\u9664\u7684\u7EC4\u4EF6\u5B9E\u4F8B\r\n */\r\n public removeComponent(component: Component): void {\r\n const componentType = component.constructor as ComponentType;\r\n \r\n // \u4ECE\u7EC4\u4EF6\u5217\u8868\u4E2D\u79FB\u9664\r\n const index = this.components.indexOf(component);\r\n if (index !== -1) {\r\n this.components.splice(index, 1);\r\n \r\n // \u91CD\u5EFA\u7D22\u5F15\u6620\u5C04\uFF08\u56E0\u4E3A\u6570\u7EC4\u7D22\u5F15\u53D1\u751F\u4E86\u53D8\u5316\uFF09\r\n this.rebuildComponentIndex();\r\n }\r\n\r\n // \u4ECE\u7F13\u5B58\u4E2D\u79FB\u9664\r\n this._componentCache.delete(componentType);\r\n \r\n // \u6E05\u9664\u8BBF\u95EE\u7EDF\u8BA1\r\n this._componentAccessStats.delete(componentType);\r\n\r\n // \u66F4\u65B0\u4F4D\u63A9\u7801\r\n if (ComponentRegistry.isRegistered(componentType)) {\r\n this._componentMask &= ~ComponentRegistry.getBitMask(componentType);\r\n }\r\n\r\n // \u4ECE\u7EC4\u4EF6\u5B58\u50A8\u7BA1\u7406\u5668\u4E2D\u79FB\u9664\r\n if (this.scene && this.scene.componentStorageManager) {\r\n this.scene.componentStorageManager.removeComponent(this.id, componentType);\r\n }\r\n\r\n // \u8C03\u7528\u7EC4\u4EF6\u7684\u751F\u547D\u5468\u671F\u65B9\u6CD5\r\n component.onRemovedFromEntity();\r\n \r\n // \u6E05\u9664\u7EC4\u4EF6\u7684\u5B9E\u4F53\u5F15\u7528\r\n component.entity = null as any;\r\n\r\n // \u901A\u77E5\u573A\u666F\u5B9E\u4F53\u5DF2\u6539\u53D8\r\n if (this.scene && this.scene.entityProcessors) {\r\n for (const processor of this.scene.entityProcessors.processors) {\r\n processor.onChanged(this);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * \u79FB\u9664\u6307\u5B9A\u7C7B\u578B\u7684\u7EC4\u4EF6\r\n * \r\n * @param type - \u7EC4\u4EF6\u7C7B\u578B\r\n * @returns \u88AB\u79FB\u9664\u7684\u7EC4\u4EF6\u5B9E\u4F8B\u6216null\r\n */\r\n public removeComponentByType<T extends Component>(type: ComponentType<T>): T | null {\r\n const component = this.getComponent(type);\r\n if (component) {\r\n this.removeComponent(component);\r\n return component;\r\n }\r\n return null;\r\n }\r\n\r\n /**\r\n * \u79FB\u9664\u6240\u6709\u7EC4\u4EF6\r\n */\r\n public removeAllComponents(): void {\r\n // \u590D\u5236\u7EC4\u4EF6\u5217\u8868\uFF0C\u907F\u514D\u5728\u8FED\u4EE3\u65F6\u4FEE\u6539\r\n const componentsToRemove = [...this.components];\r\n \r\n // \u6E05\u7A7A\u6240\u6709\u7F13\u5B58\u548C\u7D22\u5F15\r\n this._componentCache.clear();\r\n this._componentTypeToIndex.clear();\r\n this._componentAccessStats.clear();\r\n this._componentMask = BigInt(0);\r\n \r\n // \u79FB\u9664\u7EC4\u4EF6\r\n for (const component of componentsToRemove) {\r\n const componentType = component.constructor as ComponentType;\r\n \r\n // \u4ECE\u7EC4\u4EF6\u5B58\u50A8\u7BA1\u7406\u5668\u4E2D\u79FB\u9664\r\n if (this.scene && this.scene.componentStorageManager) {\r\n this.scene.componentStorageManager.removeComponent(this.id, componentType);\r\n }\r\n\r\n // \u8C03\u7528\u7EC4\u4EF6\u7684\u751F\u547D\u5468\u671F\u65B9\u6CD5\r\n component.onRemovedFromEntity();\r\n \r\n // \u6E05\u9664\u7EC4\u4EF6\u7684\u5B9E\u4F53\u5F15\u7528\r\n component.entity = null as any;\r\n }\r\n \r\n // \u6E05\u7A7A\u7EC4\u4EF6\u5217\u8868\r\n this.components.length = 0;\r\n\r\n // \u901A\u77E5\u573A\u666F\u5B9E\u4F53\u5DF2\u6539\u53D8\r\n if (this.scene && this.scene.entityProcessors) {\r\n for (const processor of this.scene.entityProcessors.processors) {\r\n processor.onChanged(this);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * \u6279\u91CF\u6DFB\u52A0\u7EC4\u4EF6\r\n * \r\n * @param components - \u8981\u6DFB\u52A0\u7684\u7EC4\u4EF6\u6570\u7EC4\r\n * @returns \u6DFB\u52A0\u7684\u7EC4\u4EF6\u6570\u7EC4\r\n */\r\n public addComponents<T extends Component>(components: T[]): T[] {\r\n const addedComponents: T[] = [];\r\n \r\n for (const component of components) {\r\n try {\r\n addedComponents.push(this.addComponent(component));\r\n } catch (error) {\r\n // \u5982\u679C\u67D0\u4E2A\u7EC4\u4EF6\u6DFB\u52A0\u5931\u8D25\uFF0C\u7EE7\u7EED\u6DFB\u52A0\u5176\u4ED6\u7EC4\u4EF6\r\n console.warn(`Failed to add component ${component.constructor.name}:`, error);\r\n }\r\n }\r\n \r\n return addedComponents;\r\n }\r\n\r\n /**\r\n * \u6279\u91CF\u79FB\u9664\u7EC4\u4EF6\u7C7B\u578B\r\n * \r\n * @param componentTypes - \u8981\u79FB\u9664\u7684\u7EC4\u4EF6\u7C7B\u578B\u6570\u7EC4\r\n * @returns \u88AB\u79FB\u9664\u7684\u7EC4\u4EF6\u6570\u7EC4\r\n */\r\n public removeComponentsByTypes<T extends Component>(componentTypes: ComponentType<T>[]): (T | null)[] {\r\n const removedComponents: (T | null)[] = [];\r\n \r\n for (const componentType of componentTypes) {\r\n removedComponents.push(this.removeComponentByType(componentType));\r\n }\r\n \r\n return removedComponents;\r\n }\r\n\r\n /**\r\n * \u83B7\u53D6\u7EC4\u4EF6\u7F13\u5B58\u7EDF\u8BA1\u4FE1\u606F\r\n * \r\n * @returns \u7F13\u5B58\u7EDF\u8BA1\u4FE1\u606F\r\n */\r\n public getComponentCacheStats(): {\r\n cacheStats: ReturnType<ComponentCache['getStats']>;\r\n accessStats: Map<string, {\r\n accessCount: number;\r\n lastAccessed: number;\r\n cacheHits: number;\r\n cacheMisses: number;\r\n hitRate: number;\r\n }>;\r\n indexMappingSize: number;\r\n totalComponents: number;\r\n } {\r\n const accessStats = new Map<string, {\r\n accessCount: number;\r\n lastAccessed: number;\r\n cacheHits: number;\r\n cacheMisses: number;\r\n hitRate: number;\r\n }>();\r\n\r\n for (const [componentType, stats] of this._componentAccessStats) {\r\n const total = stats.cacheHits + stats.cacheMisses;\r\n accessStats.set(componentType.name, {\r\n ...stats,\r\n hitRate: total > 0 ? stats.cacheHits / total : 0\r\n });\r\n }\r\n\r\n return {\r\n cacheStats: this._componentCache.getStats(),\r\n accessStats,\r\n indexMappingSize: this._componentTypeToIndex.size,\r\n totalComponents: this.components.length\r\n };\r\n }\r\n\r\n /**\r\n * \u9884\u70ED\u7EC4\u4EF6\u7F13\u5B58\r\n * \r\n * \u5C06\u6240\u6709\u7EC4\u4EF6\u6DFB\u52A0\u5230\u7F13\u5B58\u4E2D\uFF0C\u63D0\u5347\u540E\u7EED\u8BBF\u95EE\u6027\u80FD\r\n */\r\n public warmUpComponentCache(): void {\r\n for (let i = 0; i < this.components.length; i++) {\r\n const component = this.components[i];\r\n const componentType = component.constructor as ComponentType;\r\n \r\n // \u66F4\u65B0\u7D22\u5F15\u6620\u5C04\r\n this._componentTypeToIndex.set(componentType, i);\r\n \r\n // \u6DFB\u52A0\u5230\u7F13\u5B58\r\n this._componentCache.set(componentType, component);\r\n }\r\n }\r\n\r\n /**\r\n * \u6E05\u7406\u7EC4\u4EF6\u7F13\u5B58\r\n * \r\n * \u6E05\u9664\u8FC7\u671F\u7684\u7F13\u5B58\u9879\uFF0C\u91CA\u653E\u5185\u5B58\r\n */\r\n public cleanupComponentCache(): void {\r\n // ComponentCache\u5185\u90E8\u4F1A\u81EA\u52A8\u5904\u7406TTL\u8FC7\u671F\r\n // \u8FD9\u91CC\u6211\u4EEC\u53EF\u4EE5\u5F3A\u5236\u6E05\u7406\u4E00\u4E9B\u4E0D\u5E38\u7528\u7684\u7F13\u5B58\u9879\r\n \r\n const now = Date.now();\r\n const cleanupThreshold = 30000; // 30\u79D2\u672A\u8BBF\u95EE\u7684\u7EC4\u4EF6\u4ECE\u7F13\u5B58\u4E2D\u79FB\u9664\r\n \r\n for (const [componentType, stats] of this._componentAccessStats) {\r\n if (now - stats.lastAccessed > cleanupThreshold && stats.accessCount < 5) {\r\n this._componentCache.delete(componentType);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * \u83B7\u53D6\u6240\u6709\u6307\u5B9A\u7C7B\u578B\u7684\u7EC4\u4EF6\r\n * \r\n * @param type - \u7EC4\u4EF6\u7C7B\u578B\r\n * @returns \u7EC4\u4EF6\u5B9E\u4F8B\u6570\u7EC4\r\n */\r\n public getComponents<T extends Component>(type: ComponentType<T>): T[] {\r\n const result: T[] = [];\r\n \r\n for (const component of this.components) {\r\n if (component instanceof type) {\r\n result.push(component as T);\r\n }\r\n }\r\n \r\n return result;\r\n }\r\n\r\n /**\r\n * \u6DFB\u52A0\u5B50\u5B9E\u4F53\r\n * \r\n * @param child - \u8981\u6DFB\u52A0\u7684\u5B50\u5B9E\u4F53\r\n * @returns \u6DFB\u52A0\u7684\u5B50\u5B9E\u4F53\r\n */\r\n public addChild(child: Entity): Entity {\r\n if (child === this) {\r\n throw new Error(\"Entity cannot be its own child\");\r\n }\r\n\r\n if (child._parent === this) {\r\n return child; // \u5DF2\u7ECF\u662F\u5B50\u5B9E\u4F53\r\n }\r\n\r\n // \u5982\u679C\u5B50\u5B9E\u4F53\u5DF2\u6709\u7236\u5B9E\u4F53\uFF0C\u5148\u4ECE\u539F\u7236\u5B9E\u4F53\u79FB\u9664\r\n if (child._parent) {\r\n child._parent.removeChild(child);\r\n }\r\n\r\n // \u8BBE\u7F6E\u7236\u5B50\u5173\u7CFB\r\n child._parent = this;\r\n this._children.push(child);\r\n\r\n // \u5982\u679C\u5B50\u5B9E\u4F53\u8FD8\u6CA1\u6709\u573A\u666F\uFF0C\u8BBE\u7F6E\u4E3A\u7236\u5B9E\u4F53\u7684\u573A\u666F\r\n if (!child.scene && this.scene) {\r\n child.scene = this.scene;\r\n this.scene.addEntity(child);\r\n }\r\n\r\n return child;\r\n }\r\n\r\n /**\r\n * \u79FB\u9664\u5B50\u5B9E\u4F53\r\n * \r\n * @param child - \u8981\u79FB\u9664\u7684\u5B50\u5B9E\u4F53\r\n * @returns \u662F\u5426\u6210\u529F\u79FB\u9664\r\n */\r\n public removeChild(child: Entity): boolean {\r\n const index = this._children.indexOf(child);\r\n if (index === -1) {\r\n return false;\r\n }\r\n\r\n // \u79FB\u9664\u7236\u5B50\u5173\u7CFB\r\n this._children.splice(index, 1);\r\n child._parent = null;\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * \u79FB\u9664\u6240\u6709\u5B50\u5B9E\u4F53\r\n */\r\n public removeAllChildren(): void {\r\n // \u590D\u5236\u5B50\u5B9E\u4F53\u5217\u8868\uFF0C\u907F\u514D\u5728\u8FED\u4EE3\u65F6\u4FEE\u6539\r\n const childrenToRemove = [...this._children];\r\n \r\n for (const child of childrenToRemove) {\r\n this.removeChild(child);\r\n }\r\n }\r\n\r\n /**\r\n * \u6839\u636E\u540D\u79F0\u67E5\u627E\u5B50\u5B9E\u4F53\r\n * \r\n * @param name - \u5B50\u5B9E\u4F53\u540D\u79F0\r\n * @param recursive - \u662F\u5426\u9012\u5F52\u67E5\u627E\r\n * @returns \u627E\u5230\u7684\u5B50\u5B9E\u4F53\u6216null\r\n */\r\n public findChild(name: string, recursive: boolean = false): Entity | null {\r\n // \u5728\u76F4\u63A5\u5B50\u5B9E\u4F53\u4E2D\u67E5\u627E\r\n for (const child of this._children) {\r\n if (child.name === name) {\r\n return child;\r\n }\r\n }\r\n\r\n // \u9012\u5F52\u67E5\u627E\r\n if (recursive) {\r\n for (const child of this._children) {\r\n const found = child.findChild(name, true);\r\n if (found) {\r\n return found;\r\n }\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * \u6839\u636E\u6807\u7B7E\u67E5\u627E\u5B50\u5B9E\u4F53\r\n * \r\n * @param tag - \u6807\u7B7E\r\n * @param recursive - \u662F\u5426\u9012\u5F52\u67E5\u627E\r\n * @returns \u627E\u5230\u7684\u5B50\u5B9E\u4F53\u6570\u7EC4\r\n */\r\n public findChildrenByTag(tag: number, recursive: boolean = false): Entity[] {\r\n const result: Entity[] = [];\r\n\r\n // \u5728\u76F4\u63A5\u5B50\u5B9E\u4F53\u4E2D\u67E5\u627E\r\n for (const child of this._children) {\r\n if (child.tag === tag) {\r\n result.push(child);\r\n }\r\n }\r\n\r\n // \u9012\u5F52\u67E5\u627E\r\n if (recursive) {\r\n for (const child of this._children) {\r\n result.push(...child.findChildrenByTag(tag, true));\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * \u83B7\u53D6\u6839\u5B9E\u4F53\r\n * \r\n * @returns \u5C42\u6B21\u7ED3\u6784\u7684\u6839\u5B9E\u4F53\r\n */\r\n public getRoot(): Entity {\r\n let root: Entity = this;\r\n while (root._parent) {\r\n root = root._parent;\r\n }\r\n return root;\r\n }\r\n\r\n /**\r\n * \u68C0\u67E5\u662F\u5426\u662F\u6307\u5B9A\u5B9E\u4F53\u7684\u7956\u5148\r\n * \r\n * @param entity - \u8981\u68C0\u67E5\u7684\u5B9E\u4F53\r\n * @returns \u5982\u679C\u662F\u7956\u5148\u5219\u8FD4\u56DEtrue\r\n */\r\n public isAncestorOf(entity: Entity): boolean {\r\n let current = entity._parent;\r\n while (current) {\r\n if (current === this) {\r\n return true;\r\n }\r\n current = current._parent;\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * \u68C0\u67E5\u662F\u5426\u662F\u6307\u5B9A\u5B9E\u4F53\u7684\u540E\u4EE3\r\n * \r\n * @param entity - \u8981\u68C0\u67E5\u7684\u5B9E\u4F53\r\n * @returns \u5982\u679C\u662F\u540E\u4EE3\u5219\u8FD4\u56DEtrue\r\n */\r\n public isDescendantOf(entity: Entity): boolean {\r\n return entity.isAncestorOf(this);\r\n }\r\n\r\n /**\r\n * \u83B7\u53D6\u5C42\u6B21\u6DF1\u5EA6\r\n * \r\n * @returns \u5728\u5C42\u6B21\u7ED3\u6784\u4E2D\u7684\u6DF1\u5EA6\uFF08\u6839\u5B9E\u4F53\u4E3A0\uFF09\r\n */\r\n public getDepth(): number {\r\n let depth = 0;\r\n let current = this._parent;\r\n while (current) {\r\n depth++;\r\n current = current._parent;\r\n }\r\n return depth;\r\n }\r\n\r\n /**\r\n * \u904D\u5386\u6240\u6709\u5B50\u5B9E\u4F53\uFF08\u6DF1\u5EA6\u4F18\u5148\uFF09\r\n * \r\n * @param callback - \u5BF9\u6BCF\u4E2A\u5B50\u5B9E\u4F53\u6267\u884C\u7684\u56DE\u8C03\u51FD\u6570\r\n * @param recursive - \u662F\u5426\u9012\u5F52\u904D\u5386\r\n */\r\n public forEachChild(callback: (child: Entity, index: number) => void, recursive: boolean = false): void {\r\n this._children.forEach((child, index) => {\r\n callback(child, index);\r\n if (recursive) {\r\n child.forEachChild(callback, true);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * \u6D3B\u8DC3\u72B6\u6001\u6539\u53D8\u65F6\u7684\u56DE\u8C03\r\n */\r\n private onActiveChanged(): void {\r\n // \u901A\u77E5\u6240\u6709\u7EC4\u4EF6\u6D3B\u8DC3\u72B6\u6001\u6539\u53D8\r\n for (const component of this.components) {\r\n if ('onActiveChanged' in component && typeof component.onActiveChanged === 'function') {\r\n (component as any).onActiveChanged();\r\n }\r\n }\r\n\r\n // \u901A\u77E5\u573A\u666F\u5B9E\u4F53\u72B6\u6001\u6539\u53D8\r\n if (this.scene && this.scene.eventSystem) {\r\n this.scene.eventSystem.emitSync('entity:activeChanged', { \r\n entity: this, \r\n active: this._active,\r\n activeInHierarchy: this.activeInHierarchy\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * \u66F4\u65B0\u5B9E\u4F53\r\n * \r\n * \u8C03\u7528\u6240\u6709\u7EC4\u4EF6\u7684\u66F4\u65B0\u65B9\u6CD5\uFF0C\u5E76\u66F4\u65B0\u5B50\u5B9E\u4F53\u3002\r\n */\r\n public update(): void {\r\n if (!this.activeInHierarchy || this._isDestroyed) {\r\n return;\r\n }\r\n\r\n // \u66F4\u65B0\u6240\u6709\u7EC4\u4EF6\r\n for (const component of this.components) {\r\n if (component.enabled) {\r\n component.update();\r\n }\r\n }\r\n\r\n // \u66F4\u65B0\u6240\u6709\u5B50\u5B9E\u4F53\r\n for (const child of this._children) {\r\n child.update();\r\n }\r\n }\r\n\r\n /**\r\n * \u9500\u6BC1\u5B9E\u4F53\r\n * \r\n * \u79FB\u9664\u6240\u6709\u7EC4\u4EF6\u3001\u5B50\u5B9E\u4F53\u5E76\u6807\u8BB0\u4E3A\u5DF2\u9500\u6BC1\u3002\r\n */\r\n public destroy(): void {\r\n if (this._isDestroyed) {\r\n return;\r\n }\r\n\r\n this._isDestroyed = true;\r\n \r\n // \u9500\u6BC1\u6240\u6709\u5B50\u5B9E\u4F53\r\n const childrenToDestroy = [...this._children];\r\n for (const child of childrenToDestroy) {\r\n child.destroy();\r\n }\r\n \r\n // \u4ECE\u7236\u5B9E\u4F53\u4E2D\u79FB\u9664\r\n if (this._parent) {\r\n this._parent.removeChild(this);\r\n }\r\n \r\n // \u79FB\u9664\u6240\u6709\u7EC4\u4EF6\r\n this.removeAllComponents();\r\n \r\n // \u4ECE\u573A\u666F\u4E2D\u79FB\u9664\r\n if (this.scene && this.scene.entities) {\r\n this.scene.entities.remove(this);\r\n }\r\n }\r\n\r\n /**\r\n * \u6BD4\u8F83\u5B9E\u4F53\r\n * \r\n * @param other - \u53E6\u4E00\u4E2A\u5B9E\u4F53\r\n * @returns \u6BD4\u8F83\u7ED3\u679C\r\n */\r\n public compareTo(other: Entity): number {\r\n return EntityComparer.prototype.compare(this, other);\r\n }\r\n\r\n /**\r\n * \u83B7\u53D6\u5B9E\u4F53\u7684\u5B57\u7B26\u4E32\u8868\u793A\r\n * \r\n * @returns \u5B9E\u4F53\u7684\u5B57\u7B26\u4E32\u63CF\u8FF0\r\n */\r\n public toString(): string {\r\n return `Entity[${this.name}:${this.id}]`;\r\n }\r\n\r\n /**\r\n * \u83B7\u53D6\u5B9E\u4F53\u7684\u8C03\u8BD5\u4FE1\u606F\uFF08\u5305\u542B\u7EC4\u4EF6\u7F13\u5B58\u4FE1\u606F\uFF09\r\n * \r\n * @returns \u5305\u542B\u5B9E\u4F53\u8BE6\u7EC6\u4FE1\u606F\u7684\u5BF9\u8C61\r\n */\r\n public getDebugInfo(): {\r\n name: string;\r\n id: number;\r\n enabled: boolean;\r\n active: boolean;\r\n activeInHierarchy: boolean;\r\n destroyed: boolean;\r\n componentCount: number;\r\n componentTypes: string[];\r\n componentMask: string;\r\n parentId: number | null;\r\n childCount: number;\r\n childIds: number[];\r\n depth: number;\r\n componentCache: {\r\n size: number;\r\n maxSize: number;\r\n hitRate: number;\r\n averageAccessCount: number;\r\n };\r\n componentAccessStats: Array<{\r\n componentType: string;\r\n accessCount: number;\r\n cacheHits: number;\r\n cacheMisses: number;\r\n hitRate: number;\r\n lastAccessed: string;\r\n }>;\r\n indexMappingSize: number;\r\n } {\r\n const cacheStats = this.getComponentCacheStats();\r\n const accessStatsArray = Array.from(cacheStats.accessStats.entries()).map(([type, stats]) => ({\r\n componentType: type,\r\n accessCount: stats.accessCount,\r\n cacheHits: stats.cacheHits,\r\n cacheMisses: stats.cacheMisses,\r\n hitRate: stats.hitRate,\r\n lastAccessed: new Date(stats.lastAccessed).toISOString()\r\n }));\r\n\r\n return {\r\n name: this.name,\r\n id: this.id,\r\n enabled: this._enabled,\r\n active: this._active,\r\n activeInHierarchy: this.activeInHierarchy,\r\n destroyed: this._isDestroyed,\r\n componentCount: this.components.length,\r\n componentTypes: this.components.map(c => c.constructor.name),\r\n componentMask: this._componentMask.toString(2), // \u4E8C\u8FDB\u5236\u8868\u793A\r\n parentId: this._parent?.id || null,\r\n childCount: this._children.length,\r\n childIds: this._children.map(c => c.id),\r\n depth: this.getDepth(),\r\n componentCache: cacheStats.cacheStats,\r\n componentAccessStats: accessStatsArray,\r\n indexMappingSize: cacheStats.indexMappingSize\r\n };\r\n }\r\n}\r\n", "import { Entity } from '../Entity';\r\nimport { Component } from '../Component';\r\n\r\n/**\r\n * \u9AD8\u6027\u80FD\u5B9E\u4F53\u5217\u8868\u7BA1\u7406\u5668\r\n * \u7BA1\u7406\u573A\u666F\u4E2D\u7684\u6240\u6709\u5B9E\u4F53\uFF0C\u652F\u6301\u5FEB\u901F\u67E5\u627E\u548C\u6279\u91CF\u64CD\u4F5C\r\n */\r\nexport class EntityList {\r\n public buffer: Entity[] = [];\r\n private _scene: any; // \u4E34\u65F6\u4F7F\u7528any\uFF0C\u907F\u514D\u5FAA\u73AF\u4F9D\u8D56\r\n\r\n // \u7D22\u5F15\u6620\u5C04\uFF0C\u63D0\u5347\u67E5\u627E\u6027\u80FD\r\n private _idToEntity = new Map<number, Entity>();\r\n private _nameToEntities = new Map<string, Entity[]>();\r\n \r\n // \u5EF6\u8FDF\u64CD\u4F5C\u961F\u5217\r\n private _entitiesToAdd: Entity[] = [];\r\n private _entitiesToRemove: Entity[] = [];\r\n private _isUpdating = false;\r\n\r\n public get count(): number {\r\n return this.buffer.length;\r\n }\r\n\r\n constructor(scene: any) {\r\n this._scene = scene;\r\n }\r\n\r\n /**\r\n * \u6DFB\u52A0\u5B9E\u4F53\uFF08\u7ACB\u5373\u6DFB\u52A0\u6216\u5EF6\u8FDF\u6DFB\u52A0\uFF09\r\n * @param entity \u8981\u6DFB\u52A0\u7684\u5B9E\u4F53\r\n */\r\n public add(entity: Entity): void {\r\n if (this._isUpdating) {\r\n // \u5982\u679C\u6B63\u5728\u66F4\u65B0\u4E2D\uFF0C\u5EF6\u8FDF\u6DFB\u52A0\r\n this._entitiesToAdd.push(entity);\r\n } else {\r\n this.addImmediate(entity);\r\n }\r\n }\r\n\r\n /**\r\n * \u7ACB\u5373\u6DFB\u52A0\u5B9E\u4F53\r\n * @param entity \u8981\u6DFB\u52A0\u7684\u5B9E\u4F53\r\n */\r\n private addImmediate(entity: Entity): void {\r\n // \u68C0\u67E5\u662F\u5426\u5DF2\u5B58\u5728\r\n if (this._idToEntity.has(entity.id)) {\r\n return;\r\n }\r\n\r\n this.buffer.push(entity);\r\n this._idToEntity.set(entity.id, entity);\r\n \r\n // \u66F4\u65B0\u540D\u79F0\u7D22\u5F15\r\n this.updateNameIndex(entity, true);\r\n }\r\n\r\n /**\r\n * \u79FB\u9664\u5B9E\u4F53\uFF08\u7ACB\u5373\u79FB\u9664\u6216\u5EF6\u8FDF\u79FB\u9664\uFF09\r\n * @param entity \u8981\u79FB\u9664\u7684\u5B9E\u4F53\r\n */\r\n public remove(entity: Entity): void {\r\n if (this._isUpdating) {\r\n // \u5982\u679C\u6B63\u5728\u66F4\u65B0\u4E2D\uFF0C\u5EF6\u8FDF\u79FB\u9664\r\n this._entitiesToRemove.push(entity);\r\n } else {\r\n this.removeImmediate(entity);\r\n }\r\n }\r\n\r\n /**\r\n * \u7ACB\u5373\u79FB\u9664\u5B9E\u4F53\r\n * @param entity \u8981\u79FB\u9664\u7684\u5B9E\u4F53\r\n */\r\n private removeImmediate(entity: Entity): void {\r\n const index = this.buffer.indexOf(entity);\r\n if (index !== -1) {\r\n this.buffer.splice(index, 1);\r\n this._idToEntity.delete(entity.id);\r\n \r\n // \u66F4\u65B0\u540D\u79F0\u7D22\u5F15\r\n this.updateNameIndex(entity, false);\r\n }\r\n }\r\n\r\n /**\r\n * \u79FB\u9664\u6240\u6709\u5B9E\u4F53\r\n */\r\n public removeAllEntities(): void {\r\n for (let i = this.buffer.length - 1; i >= 0; i--) {\r\n this.buffer[i].destroy();\r\n }\r\n \r\n this.buffer.length = 0;\r\n this._idToEntity.clear();\r\n this._nameToEntities.clear();\r\n this._entitiesToAdd.length = 0;\r\n this._entitiesToRemove.length = 0;\r\n }\r\n\r\n /**\r\n * \u66F4\u65B0\u5B9E\u4F53\u5217\u8868\uFF0C\u5904\u7406\u5EF6\u8FDF\u64CD\u4F5C\r\n */\r\n public updateLists(): void {\r\n // \u5904\u7406\u5EF6\u8FDF\u6DFB\u52A0\u7684\u5B9E\u4F53\r\n if (this._entitiesToAdd.length > 0) {\r\n for (const entity of this._entitiesToAdd) {\r\n this.addImmediate(entity);\r\n }\r\n this._entitiesToAdd.length = 0;\r\n }\r\n\r\n // \u5904\u7406\u5EF6\u8FDF\u79FB\u9664\u7684\u5B9E\u4F53\r\n if (this._entitiesToRemove.length > 0) {\r\n for (const entity of this._entitiesToRemove) {\r\n this.removeImmediate(entity);\r\n }\r\n this._entitiesToRemove.length = 0;\r\n }\r\n }\r\n\r\n /**\r\n * \u66F4\u65B0\u6240\u6709\u5B9E\u4F53\r\n */\r\n public update(): void {\r\n this._isUpdating = true;\r\n \r\n try {\r\n for (let i = 0; i < this.buffer.length; i++) {\r\n const entity = this.buffer[i];\r\n if (entity.enabled && !entity.isDestroyed) {\r\n entity.update();\r\n }\r\n }\r\n } finally {\r\n this._isUpdating = false;\r\n }\r\n \r\n // \u5904\u7406\u5EF6\u8FDF\u64CD\u4F5C\r\n this.updateLists();\r\n }\r\n\r\n /**\r\n * \u6839\u636E\u540D\u79F0\u67E5\u627E\u5B9E\u4F53\uFF08\u4F7F\u7528\u7D22\u5F15\uFF0CO(1)\u590D\u6742\u5EA6\uFF09\r\n * @param name \u5B9E\u4F53\u540D\u79F0\r\n * @returns \u627E\u5230\u7684\u7B2C\u4E00\u4E2A\u5B9E\u4F53\u6216null\r\n */\r\n public findEntity(name: string): Entity | null {\r\n const entities = this._nameToEntities.get(name);\r\n return entities && entities.length > 0 ? entities[0] : null;\r\n }\r\n\r\n /**\r\n * \u6839\u636E\u540D\u79F0\u67E5\u627E\u6240\u6709\u5B9E\u4F53\r\n * @param name \u5B9E\u4F53\u540D\u79F0\r\n * @returns \u627E\u5230\u7684\u6240\u6709\u5B9E\u4F53\u6570\u7EC4\r\n */\r\n public findEntitiesByName(name: string): Entity[] {\r\n return this._nameToEntities.get(name) || [];\r\n }\r\n\r\n /**\r\n * \u6839\u636EID\u67E5\u627E\u5B9E\u4F53\uFF08\u4F7F\u7528\u7D22\u5F15\uFF0CO(1)\u590D\u6742\u5EA6\uFF09\r\n * @param id \u5B9E\u4F53ID\r\n * @returns \u627E\u5230\u7684\u5B9E\u4F53\u6216null\r\n */\r\n public findEntityById(id: number): Entity | null {\r\n return this._idToEntity.get(id) || null;\r\n }\r\n\r\n /**\r\n * \u6839\u636E\u6807\u7B7E\u67E5\u627E\u5B9E\u4F53\r\n * @param tag \u6807\u7B7E\r\n * @returns \u627E\u5230\u7684\u6240\u6709\u5B9E\u4F53\u6570\u7EC4\r\n */\r\n public findEntitiesByTag(tag: number): Entity[] {\r\n const result: Entity[] = [];\r\n \r\n for (const entity of this.buffer) {\r\n if (entity.tag === tag) {\r\n result.push(entity);\r\n }\r\n }\r\n \r\n return result;\r\n }\r\n\r\n /**\r\n * \u6839\u636E\u7EC4\u4EF6\u7C7B\u578B\u67E5\u627E\u5B9E\u4F53\r\n * @param componentType \u7EC4\u4EF6\u7C7B\u578B\r\n * @returns \u627E\u5230\u7684\u6240\u6709\u5B9E\u4F53\u6570\u7EC4\r\n */\r\n public findEntitiesWithComponent<T extends Component>(componentType: new (...args: any[]) => T): Entity[] {\r\n const result: Entity[] = [];\r\n \r\n for (const entity of this.buffer) {\r\n if (entity.hasComponent(componentType)) {\r\n result.push(entity);\r\n }\r\n }\r\n \r\n return result;\r\n }\r\n\r\n /**\r\n * \u6279\u91CF\u64CD\u4F5C\uFF1A\u5BF9\u6240\u6709\u5B9E\u4F53\u6267\u884C\u6307\u5B9A\u64CD\u4F5C\r\n * @param action \u8981\u6267\u884C\u7684\u64CD\u4F5C\r\n */\r\n public forEach(action: (entity: Entity) => void): void {\r\n for (const entity of this.buffer) {\r\n action(entity);\r\n }\r\n }\r\n\r\n /**\r\n * \u6279\u91CF\u64CD\u4F5C\uFF1A\u5BF9\u7B26\u5408\u6761\u4EF6\u7684\u5B9E\u4F53\u6267\u884C\u6307\u5B9A\u64CD\u4F5C\r\n * @param predicate \u7B5B\u9009\u6761\u4EF6\r\n * @param action \u8981\u6267\u884C\u7684\u64CD\u4F5C\r\n */\r\n public forEachWhere(predicate: (entity: Entity) => boolean, action: (entity: Entity) => void): void {\r\n for (const entity of this.buffer) {\r\n if (predicate(entity)) {\r\n action(entity);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * \u66F4\u65B0\u540D\u79F0\u7D22\u5F15\r\n * @param entity \u5B9E\u4F53\r\n * @param isAdd \u662F\u5426\u4E3A\u6DFB\u52A0\u64CD\u4F5C\r\n */\r\n private updateNameIndex(entity: Entity, isAdd: boolean): void {\r\n if (!entity.name) {\r\n return;\r\n }\r\n\r\n if (isAdd) {\r\n let entities = this._nameToEntities.get(entity.name);\r\n if (!entities) {\r\n entities = [];\r\n this._nameToEntities.set(entity.name, entities);\r\n }\r\n entities.push(entity);\r\n } else {\r\n const entities = this._nameToEntities.get(entity.name);\r\n if (entities) {\r\n const index = entities.indexOf(entity);\r\n if (index !== -1) {\r\n entities.splice(index, 1);\r\n \r\n // \u5982\u679C\u6570\u7EC4\u4E3A\u7A7A\uFF0C\u5220\u9664\u6620\u5C04\r\n if (entities.length === 0) {\r\n this._nameToEntities.delete(entity.name);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * \u83B7\u53D6\u5B9E\u4F53\u5217\u8868\u7684\u7EDF\u8BA1\u4FE1\u606F\r\n * @returns \u7EDF\u8BA1\u4FE1\u606F\r\n */\r\n public getStats(): {\r\n totalEntities: number;\r\n activeEntities: number;\r\n pendingAdd: number;\r\n pendingRemove: number;\r\n nameIndexSize: number;\r\n } {\r\n let activeCount = 0;\r\n for (const entity of this.buffer) {\r\n if (entity.enabled && !entity.isDestroyed) {\r\n activeCount++;\r\n }\r\n }\r\n\r\n return {\r\n totalEntities: this.buffer.length,\r\n activeEntities: activeCount,\r\n pendingAdd: this._entitiesToAdd.length,\r\n pendingRemove: this._entitiesToRemove.length,\r\n nameIndexSize: this._nameToEntities.size\r\n };\r\n }\r\n}\r\n", "import { EntitySystem } from '../Systems/EntitySystem';\r\n\r\n/**\r\n * \u5B9E\u4F53\u5904\u7406\u5668\u5217\u8868\u7BA1\u7406\u5668\r\n * \u7BA1\u7406\u573A\u666F\u4E2D\u7684\u6240\u6709\u5B9E\u4F53\u7CFB\u7EDF\r\n */\r\nexport class EntityProcessorList {\r\n private _processors: EntitySystem[] = [];\r\n private _isDirty = false;\r\n\r\n /**\r\n * \u8BBE\u7F6E\u4E3A\u810F\u72B6\u6001\uFF0C\u9700\u8981\u91CD\u65B0\u6392\u5E8F\r\n */\r\n public setDirty(): void {\r\n this._isDirty = true;\r\n }\r\n\r\n /**\r\n * \u6DFB\u52A0\u5B9E\u4F53\u5904\u7406\u5668\r\n * @param processor \u8981\u6DFB\u52A0\u7684\u5904\u7406\u5668\r\n */\r\n public add(processor: EntitySystem): void {\r\n this._processors.push(processor);\r\n this.setDirty();\r\n }\r\n\r\n /**\r\n * \u79FB\u9664\u5B9E\u4F53\u5904\u7406\u5668\r\n * @param processor \u8981\u79FB\u9664\u7684\u5904\u7406\u5668\r\n */\r\n public remove(processor: EntitySystem): void {\r\n const index = this._processors.indexOf(processor);\r\n if (index !== -1) {\r\n this._processors.splice(index, 1);\r\n }\r\n }\r\n\r\n /**\r\n * \u83B7\u53D6\u6307\u5B9A\u7C7B\u578B\u7684\u5904\u7406\u5668\r\n * @param type \u5904\u7406\u5668\u7C7B\u578B\r\n */\r\n public getProcessor<T extends EntitySystem>(type: new (...args: any[]) => T): T | null {\r\n for (const processor of this._processors) {\r\n if (processor instanceof type) {\r\n return processor as T;\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n /**\r\n * \u5F00\u59CB\u5904\u7406\r\n */\r\n public begin(): void {\r\n this.sortProcessors();\r\n for (const processor of this._processors) {\r\n processor.initialize();\r\n }\r\n }\r\n\r\n /**\r\n * \u7ED3\u675F\u5904\u7406\r\n */\r\n public end(): void {\r\n // \u6E05\u7406\u5904\u7406\u5668\r\n }\r\n\r\n /**\r\n * \u66F4\u65B0\u6240\u6709\u5904\u7406\u5668\r\n */\r\n public update(): void {\r\n this.sortProcessors();\r\n for (const processor of this._processors) {\r\n processor.update();\r\n }\r\n }\r\n\r\n /**\r\n * \u540E\u671F\u66F4\u65B0\u6240\u6709\u5904\u7406\u5668\r\n */\r\n public lateUpdate(): void {\r\n for (const processor of this._processors) {\r\n processor.lateUpdate();\r\n }\r\n }\r\n\r\n /**\r\n * \u6392\u5E8F\u5904\u7406\u5668\r\n */\r\n private sortProcessors(): void {\r\n if (this._isDirty) {\r\n this._processors.sort((a, b) => a.updateOrder - b.updateOrder);\r\n this._isDirty = false;\r\n }\r\n }\r\n\r\n /** \u83B7\u53D6\u5904\u7406\u5668\u5217\u8868 */\r\n public get processors() {\r\n return this._processors;\r\n }\r\n\r\n /** \u83B7\u53D6\u5904\u7406\u5668\u6570\u91CF */\r\n public get count() {\r\n return this._processors.length;\r\n }\r\n\r\n\r\n}\r\n", "/**\r\n * ID\u6C60\u7BA1\u7406\u5668\r\n * \u7528\u4E8E\u7BA1\u7406\u5B9E\u4F53ID\u7684\u5206\u914D\u548C\u56DE\u6536\r\n */\r\nexport class IdentifierPool {\r\n private _nextAvailableId = 0;\r\n private _ids: number[] = [];\r\n\r\n /**\r\n * \u83B7\u53D6\u4E00\u4E2A\u53EF\u7528\u7684ID\r\n */\r\n public checkOut(): number {\r\n if (this._ids.length > 0) {\r\n return this._ids.pop()!;\r\n }\r\n return this._nextAvailableId++;\r\n }\r\n\r\n /**\r\n * \u56DE\u6536\u4E00\u4E2AID\r\n * @param id \u8981\u56DE\u6536\u7684ID\r\n */\r\n public checkIn(id: number): void {\r\n this._ids.push(id);\r\n }\r\n}", "/**\r\n * \u7EDF\u4E00\u7684WASM ECS\u6838\u5FC3\u6A21\u5757\r\n * \r\n * \u4E3A\u5C0F\u6E38\u620F\u4F18\u5316\u7684\u9AD8\u6027\u80FDECS\u5F15\u64CE\uFF0C\u63D0\u4F9B\u7B80\u6D01\u7684API\u548C\u81EA\u52A8\u56DE\u9000\u673A\u5236\r\n * \u9002\u7528\u4E8ENPM\u5305\u53D1\u5E03\u548C\u591A\u79CD\u90E8\u7F72\u73AF\u5883\r\n * \r\n */\r\n\r\n/** \u5B9E\u4F53ID\u7C7B\u578B */\r\nexport type EntityId = number;\r\n\r\n/** \u7EC4\u4EF6\u63A9\u7801\u7C7B\u578B */\r\nexport type ComponentMask = bigint;\r\n\r\n/** \u67E5\u8BE2\u7ED3\u679C\u63A5\u53E3 */\r\nexport interface QueryResult {\r\n /** \u67E5\u8BE2\u5230\u7684\u5B9E\u4F53ID\u6570\u7EC4 */\r\n entities: Uint32Array;\r\n /** \u5B9E\u4F53\u6570\u91CF */\r\n count: number;\r\n}\r\n\r\n/** \u6027\u80FD\u7EDF\u8BA1\u63A5\u53E3 */\r\nexport interface PerformanceStats {\r\n /** \u5B9E\u4F53\u603B\u6570 */\r\n entityCount: number;\r\n /** \u7D22\u5F15\u6570\u91CF */\r\n indexCount: number;\r\n /** \u67E5\u8BE2\u6B21\u6570 */\r\n queryCount: number;\r\n /** \u66F4\u65B0\u6B21\u6570 */\r\n updateCount: number;\r\n /** \u662F\u5426\u4F7F\u7528WASM */\r\n wasmEnabled: boolean;\r\n}\r\n\r\n/** WASM\u6A21\u5757\u7C7B\u578B\u5B9A\u4E49 */\r\ninterface WasmEcsCoreInstance {\r\n create_entity(): number;\r\n destroy_entity(entity_id: number): boolean;\r\n update_entity_mask(entity_id: number, mask: bigint): void;\r\n batch_update_masks(entity_ids: Uint32Array, masks: BigUint64Array): void;\r\n query_entities(mask: bigint, max_results: number): number;\r\n get_query_result_count(): number;\r\n query_cached(mask: bigint): number;\r\n get_cached_query_count(mask: bigint): number;\r\n query_multiple_components(masks: BigUint64Array, max_results: number): number;\r\n query_with_exclusion(include_mask: bigint, exclude_mask: bigint, max_results: number): number;\r\n get_entity_mask(entity_id: number): bigint;\r\n entity_exists(entity_id: number): boolean;\r\n get_entity_count(): number;\r\n get_performance_stats(): Array<any>;\r\n clear(): void;\r\n rebuild_query_cache(): void;\r\n free?(): void;\r\n}\r\n\r\ninterface WasmModule {\r\n EcsCore: new () => WasmEcsCoreInstance;\r\n create_component_mask: (componentIds: Uint32Array) => ComponentMask;\r\n mask_contains_component: (mask: ComponentMask, componentId: number) => boolean;\r\n default: (input?: any) => Promise<any>;\r\n initSync?: (input: any) => any;\r\n memory?: WebAssembly.Memory;\r\n}\r\n\r\n/**\r\n * \u7EDF\u4E00\u7684WASM ECS\u6838\u5FC3\u7C7B\r\n * \r\n * \u63D0\u4F9B\u9AD8\u6027\u80FD\u7684ECS\u64CD\u4F5C\uFF0C\u81EA\u52A8\u9009\u62E9WASM\u6216JavaScript\u5B9E\u73B0\r\n * \u9488\u5BF9\u5C0F\u6E38\u620F\u573A\u666F\u4F18\u5316\uFF0C\u6613\u4E8E\u4F7F\u7528\u4E14\u6027\u80FD\u5353\u8D8A\r\n * \u652F\u6301NPM\u5305\u53D1\u5E03\u548C\u591A\u79CD\u90E8\u7F72\u73AF\u5883\r\n */\r\nexport class WasmEcsCore {\r\n /** WASM\u6838\u5FC3\u5B9E\u4F8B */\r\n private wasmCore: WasmEcsCoreInstance | null = null;\r\n /** WASM\u6A21\u5757 */\r\n private wasmModule: WasmModule | null = null;\r\n /** \u662F\u5426\u5DF2\u521D\u59CB\u5316 */\r\n private initialized = false;\r\n /** \u662F\u5426\u4F7F\u7528WASM */\r\n private usingWasm = false;\r\n private silent = false;\r\n\r\n \r\n // JavaScript\u56DE\u9000\u5B9E\u73B0\r\n private jsEntityMasks = new Map<EntityId, ComponentMask>();\r\n private jsNextEntityId = 1;\r\n private jsQueryCount = 0;\r\n private jsUpdateCount = 0;\r\n\r\n /**\r\n * \u8BBE\u7F6E\u9759\u9ED8\u6A21\u5F0F\r\n */\r\n public setSilent(silent: boolean): void {\r\n this.silent = silent;\r\n }\r\n\r\n /**\r\n * \u521D\u59CB\u5316ECS\u6838\u5FC3\r\n * \r\n * \u5C1D\u8BD5\u52A0\u8F7DWASM\u6A21\u5757\uFF0C\u5931\u8D25\u65F6\u81EA\u52A8\u56DE\u9000\u5230JavaScript\u5B9E\u73B0\r\n * \r\n * @returns \u521D\u59CB\u5316\u662F\u5426\u6210\u529F\r\n */\r\n async initialize(): Promise<boolean> {\r\n if (this.initialized) return true;\r\n\r\n if (!this.silent) {\r\n console.log('\uD83D\uDD04 \u521D\u59CB\u5316ECS\u6838\u5FC3...');\r\n }\r\n\r\n try {\r\n // \u5C1D\u8BD5\u4ECEbin\u76EE\u5F55\u52A0\u8F7DWASM\u6A21\u5757\r\n const wasmPath = '../../bin/wasm/ecs_wasm_core';\r\n if (!this.silent) {\r\n console.log(`\uD83D\uDD0D \u5C1D\u8BD5\u52A0\u8F7DWASM\u6A21\u5757: ${wasmPath}`);\r\n console.log(`\uD83D\uDCC1 \u5F53\u524D\u6587\u4EF6\u4F4D\u7F6E: ${typeof __filename !== 'undefined' ? __filename : 'unknown'}`);\r\n console.log(`\uD83D\uDCC2 \u5DE5\u4F5C\u76EE\u5F55: ${typeof process !== 'undefined' ? process.cwd() : 'unknown'}`);\r\n \r\n // \u8BA1\u7B97\u7EDD\u5BF9\u8DEF\u5F84\r\n if (typeof __filename !== 'undefined' && typeof require !== 'undefined') {\r\n const path = require('path');\r\n const fs = require('fs');\r\n const currentDir = path.dirname(__filename);\r\n const absoluteWasmPath = path.resolve(currentDir, wasmPath);\r\n console.log(`\uD83D\uDCCD \u8BA1\u7B97\u7684\u7EDD\u5BF9\u8DEF\u5F84: ${absoluteWasmPath}`);\r\n \r\n // \u68C0\u67E5\u6587\u4EF6\u662F\u5426\u5B58\u5728\r\n const jsFile = absoluteWasmPath + '.js';\r\n const wasmFile = path.resolve(currentDir, '../../bin/wasm/ecs_wasm_core_bg.wasm');\r\n console.log(`\uD83D\uDCC4 \u68C0\u67E5JS\u6587\u4EF6: ${jsFile} - ${fs.existsSync(jsFile) ? '\u5B58\u5728' : '\u4E0D\u5B58\u5728'}`);\r\n console.log(`\uD83D\uDCC4 \u68C0\u67E5WASM\u6587\u4EF6: ${wasmFile} - ${fs.existsSync(wasmFile) ? '\u5B58\u5728' : '\u4E0D\u5B58\u5728'}`);\r\n }\r\n }\r\n \r\n this.wasmModule = await import(wasmPath);\r\n \r\n if (!this.silent) {\r\n console.log('\u2705 WASM\u6A21\u5757\u5BFC\u5165\u6210\u529F\uFF0C\u6B63\u5728\u521D\u59CB\u5316...');\r\n }\r\n \r\n if (this.wasmModule) {\r\n // \u5728\u521D\u59CB\u5316\u524D\uFF0C\u5148\u68C0\u67E5.wasm\u6587\u4EF6\u7684\u52A0\u8F7D\u8DEF\u5F84\r\n if (!this.silent) {\r\n console.log('\uD83D\uDD0D WASM\u6A21\u5757\u5C06\u5C1D\u8BD5\u52A0\u8F7D .wasm \u6587\u4EF6...');\r\n // \u6A21\u62DFWASM\u6A21\u5757\u5185\u90E8\u7684\u8DEF\u5F84\u8BA1\u7B97\r\n if (typeof __filename !== 'undefined' && typeof require !== 'undefined') {\r\n const path = require('path');\r\n const { pathToFileURL } = require('url');\r\n const currentDir = path.dirname(__filename);\r\n const wasmJsFile = path.resolve(currentDir, '../../bin/wasm/ecs_wasm_core.js');\r\n const wasmBgFile = path.resolve(currentDir, '../../bin/wasm/ecs_wasm_core_bg.wasm');\r\n const wasmJsUrl = pathToFileURL(wasmJsFile).href;\r\n const expectedWasmUrl = new URL('ecs_wasm_core_bg.wasm', wasmJsUrl).href;\r\n console.log(`\uD83D\uDCCD WASM JS\u6587\u4EF6URL: ${wasmJsUrl}`);\r\n console.log(`\uD83D\uDCCD \u9884\u671F\u7684.wasm\u6587\u4EF6URL: ${expectedWasmUrl}`);\r\n console.log(`\uD83D\uDCCD \u5B9E\u9645.wasm\u6587\u4EF6\u8DEF\u5F84: ${wasmBgFile}`);\r\n \r\n const fs = require('fs');\r\n console.log(`\uD83D\uDCC4 .wasm\u6587\u4EF6\u662F\u5426\u5B58\u5728: ${fs.existsSync(wasmBgFile) ? '\u5B58\u5728' : '\u4E0D\u5B58\u5728'}`);\r\n }\r\n }\r\n \r\n // \u5728Node.js\u73AF\u5883\u4E2D\uFF0C\u9700\u8981\u624B\u52A8\u8BFB\u53D6WASM\u6587\u4EF6\r\n if (typeof require !== 'undefined') {\r\n const fs = require('fs');\r\n const path = require('path');\r\n const currentDir = path.dirname(__filename);\r\n const wasmPath = path.resolve(currentDir, '../../bin/wasm/ecs_wasm_core_bg.wasm');\r\n \r\n if (!this.silent) {\r\n console.log(`\uD83D\uDD27 \u5728Node.js\u73AF\u5883\u4E2D\u624B\u52A8\u52A0\u8F7DWASM\u6587\u4EF6: ${wasmPath}`);\r\n }\r\n \r\n if (fs.existsSync(wasmPath)) {\r\n const wasmBytes = fs.readFileSync(wasmPath);\r\n // \u4F7F\u7528initSync\u540C\u6B65\u521D\u59CB\u5316WASM\u6A21\u5757\r\n if (this.wasmModule.initSync) {\r\n this.wasmModule.initSync(wasmBytes);\r\n } else {\r\n await this.wasmModule.default({ module_or_path: wasmBytes });\r\n }\r\n } else {\r\n throw new Error(`WASM\u6587\u4EF6\u4E0D\u5B58\u5728: ${wasmPath}`);\r\n }\r\n } else {\r\n await this.wasmModule.default();\r\n }\r\n \r\n this.wasmCore = new this.wasmModule.EcsCore();\r\n }\r\n this.usingWasm = true;\r\n \r\n if (!this.silent) {\r\n console.log('\u2705 WASM\u6A21\u5757\u52A0\u8F7D\u6210\u529F');\r\n }\r\n } catch (error) {\r\n if (!this.silent) {\r\n console.warn('\u26A0\uFE0F WASM\u52A0\u8F7D\u5931\u8D25\uFF0C\u4F7F\u7528JavaScript\u5B9E\u73B0');\r\n console.warn(`\u274C \u9519\u8BEF\u8BE6\u60C5: ${error}`);\r\n }\r\n this.usingWasm = false;\r\n }\r\n\r\n this.initialized = true;\r\n if (!this.silent) {\r\n console.log(`\uD83C\uDFAE ECS\u6838\u5FC3\u521D\u59CB\u5316\u5B8C\u6210 (${this.usingWasm ? 'WASM' : 'JavaScript'})`);\r\n }\r\n return true;\r\n }\r\n\r\n /**\r\n * \u521B\u5EFA\u65B0\u5B9E\u4F53\r\n * \r\n * @returns \u65B0\u5B9E\u4F53\u7684ID\r\n */\r\n createEntity(): EntityId {\r\n this.ensureInitialized();\r\n \r\n if (this.usingWasm && this.wasmCore) {\r\n return this.wasmCore.create_entity();\r\n } else {\r\n const entityId = this.jsNextEntityId++;\r\n this.jsEntityMasks.set(entityId, BigInt(0));\r\n return entityId;\r\n }\r\n }\r\n\r\n /**\r\n * \u5220\u9664\u5B9E\u4F53\r\n * \r\n * @param entityId \u5B9E\u4F53ID\r\n * @returns \u662F\u5426\u5220\u9664\u6210\u529F\r\n */\r\n destroyEntity(entityId: EntityId): boolean {\r\n this.ensureInitialized();\r\n \r\n if (this.usingWasm && this.wasmCore) {\r\n return this.wasmCore.destroy_entity(entityId);\r\n } else {\r\n return this.jsEntityMasks.delete(entityId);\r\n }\r\n }\r\n\r\n /**\r\n * \u66F4\u65B0\u5B9E\u4F53\u7684\u7EC4\u4EF6\u63A9\u7801\r\n * \r\n * @param entityId \u5B9E\u4F53ID\r\n * @param mask \u7EC4\u4EF6\u63A9\u7801\r\n */\r\n updateEntityMask(entityId: EntityId, mask: ComponentMask): void {\r\n this.ensureInitialized();\r\n \r\n if (this.usingWasm && this.wasmCore) {\r\n this.wasmCore.update_entity_mask(entityId, mask);\r\n } else {\r\n this.jsEntityMasks.set(entityId, mask);\r\n this.jsUpdateCount++;\r\n }\r\n }\r\n\r\n /**\r\n * \u6279\u91CF\u66F4\u65B0\u5B9E\u4F53\u63A9\u7801\uFF08\u9AD8\u6027\u80FD\uFF09\r\n * \r\n * @param entityIds \u5B9E\u4F53ID\u6570\u7EC4\r\n * @param masks \u7EC4\u4EF6\u63A9\u7801\u6570\u7EC4\r\n */\r\n batchUpdateMasks(entityIds: EntityId[], masks: ComponentMask[]): void {\r\n this.ensureInitialized();\r\n \r\n if (entityIds.length !== masks.length) {\r\n throw new Error('\u5B9E\u4F53ID\u548C\u63A9\u7801\u6570\u7EC4\u957F\u5EA6\u5FC5\u987B\u76F8\u540C');\r\n }\r\n\r\n if (this.usingWasm && this.wasmCore) {\r\n const entityIdsArray = new Uint32Array(entityIds);\r\n const masksArray = new BigUint64Array(masks);\r\n this.wasmCore.batch_update_masks(entityIdsArray, masksArray);\r\n } else {\r\n for (let i = 0; i < entityIds.length; i++) {\r\n this.jsEntityMasks.set(entityIds[i], masks[i]);\r\n }\r\n this.jsUpdateCount += entityIds.length;\r\n }\r\n }\r\n\r\n /**\r\n * \u67E5\u8BE2\u5305\u542B\u6307\u5B9A\u7EC4\u4EF6\u7684\u5B9E\u4F53\r\n * \r\n * @param mask \u7EC4\u4EF6\u63A9\u7801\r\n * @param maxResults \u6700\u5927\u7ED3\u679C\u6570\r\n * @returns \u67E5\u8BE2\u7ED3\u679C\r\n */\r\n queryEntities(mask: ComponentMask, maxResults: number = 10000): QueryResult {\r\n this.ensureInitialized();\r\n \r\n if (this.usingWasm && this.wasmCore) {\r\n try {\r\n const ptr = this.wasmCore.query_entities(mask, maxResults);\r\n const count = this.wasmCore.get_query_result_count();\r\n \r\n if (ptr && count > 0 && this.wasmModule?.memory) {\r\n const entities = new Uint32Array(this.wasmModule.memory.buffer, ptr, count);\r\n return { \r\n entities: new Uint32Array(entities), // \u521B\u5EFA\u526F\u672C\u4EE5\u786E\u4FDD\u6570\u636E\u5B89\u5168\r\n count \r\n };\r\n } else {\r\n return { entities: new Uint32Array(0), count: 0 };\r\n }\r\n } catch (error) {\r\n if (!this.silent) {\r\n console.warn('WASM\u67E5\u8BE2\u5931\u8D25\uFF0C\u56DE\u9000\u5230JavaScript\u5B9E\u73B0:', error);\r\n }\r\n // \u56DE\u9000\u5230JavaScript\u5B9E\u73B0\r\n }\r\n }\r\n \r\n // JavaScript\u5B9E\u73B0\r\n this.jsQueryCount++;\r\n const entities: EntityId[] = [];\r\n \r\n for (const [entityId, entityMask] of this.jsEntityMasks) {\r\n if ((entityMask & mask) === mask) {\r\n entities.push(entityId);\r\n if (entities.length >= maxResults) break;\r\n }\r\n }\r\n \r\n return {\r\n entities: new Uint32Array(entities),\r\n count: entities.length\r\n };\r\n }\r\n\r\n /**\r\n * \u67E5\u8BE2\u6307\u5B9A\u63A9\u7801\u7684\u5B9E\u4F53\uFF08\u5E26\u7F13\u5B58\u4F18\u5316\uFF09\r\n * \r\n * @param mask \u7EC4\u4EF6\u63A9\u7801\r\n * @returns \u67E5\u8BE2\u7ED3\u679C\r\n */\r\n queryCached(mask: ComponentMask): QueryResult {\r\n this.ensureInitialized();\r\n \r\n if (this.usingWasm && this.wasmCore) {\r\n try {\r\n const ptr = this.wasmCore.query_cached(mask);\r\n const count = this.wasmCore.get_cached_query_count(mask);\r\n \r\n if (ptr && count > 0 && this.wasmModule?.memory) {\r\n const entities = new Uint32Array(this.wasmModule.memory.buffer, ptr, count);\r\n return {\r\n entities: new Uint32Array(entities), // \u590D\u5236\u6570\u636E\r\n count\r\n };\r\n }\r\n \r\n return { entities: new Uint32Array(0), count: 0 };\r\n } catch (error) {\r\n if (!this.silent) {\r\n console.warn('WASM\u7F13\u5B58\u67E5\u8BE2\u5931\u8D25\uFF0C\u56DE\u9000\u5230\u901A\u7528\u67E5\u8BE2:', error);\r\n }\r\n // \u56DE\u9000\u5230\u901A\u7528\u67E5\u8BE2\r\n return this.queryEntities(mask);\r\n }\r\n }\r\n\r\n // JavaScript\u5B9E\u73B0 - \u76F4\u63A5\u4F7F\u7528\u901A\u7528\u67E5\u8BE2\r\n return this.queryEntities(mask);\r\n }\r\n\r\n /**\r\n * \u67E5\u8BE2\u5305\u542B\u591A\u4E2A\u7EC4\u4EF6\u7684\u5B9E\u4F53\r\n * \r\n * @param masks \u7EC4\u4EF6\u63A9\u7801\u6570\u7EC4\r\n * @param maxResults \u6700\u5927\u7ED3\u679C\u6570\r\n * @returns \u67E5\u8BE2\u7ED3\u679C\r\n */\r\n queryMultipleComponents(masks: ComponentMask[], maxResults: number = 10000): QueryResult {\r\n this.ensureInitialized();\r\n \r\n if (this.usingWasm && this.wasmCore) {\r\n try {\r\n const masksArray = new BigUint64Array(masks);\r\n const ptr = this.wasmCore.query_multiple_components(masksArray, maxResults);\r\n \r\n if (ptr && this.wasmModule?.memory) {\r\n // \u6682\u65F6\u8FD4\u56DE\u7A7A\u7ED3\u679C\uFF0C\u9700\u8981\u5B9E\u73B0\u5185\u5B58\u8BBF\u95EE\r\n return { entities: new Uint32Array(0), count: 0 };\r\n }\r\n \r\n return { entities: new Uint32Array(0), count: 0 };\r\n } catch (error) {\r\n if (!this.silent) {\r\n console.warn('WASM\u591A\u7EC4\u4EF6\u67E5\u8BE2\u5931\u8D25\uFF0C\u56DE\u9000\u5230JavaScript\u5B9E\u73B0:', error);\r\n }\r\n // \u56DE\u9000\u5230JavaScript\u5B9E\u73B0\r\n }\r\n }\r\n \r\n // JavaScript\u5B9E\u73B0\r\n this.jsQueryCount++;\r\n const entities: EntityId[] = [];\r\n \r\n for (const [entityId, entityMask] of this.jsEntityMasks) {\r\n let hasAll = true;\r\n for (const mask of masks) {\r\n if ((entityMask & mask) !== mask) {\r\n hasAll = false;\r\n break;\r\n }\r\n }\r\n \r\n if (hasAll) {\r\n entities.push(entityId);\r\n if (entities.length >= maxResults) break;\r\n }\r\n }\r\n \r\n return {\r\n entities: new Uint32Array(entities),\r\n count: entities.length\r\n };\r\n }\r\n\r\n /**\r\n * \u6392\u9664\u67E5\u8BE2\uFF1A\u5305\u542B\u67D0\u4E9B\u7EC4\u4EF6\u4F46\u4E0D\u5305\u542B\u5176\u4ED6\u7EC4\u4EF6\r\n * \r\n * @param includeMask \u5FC5\u987B\u5305\u542B\u7684\u7EC4\u4EF6\u63A9\u7801\r\n * @param excludeMask \u5FC5\u987B\u6392\u9664\u7684\u7EC4\u4EF6\u63A9\u7801\r\n * @param maxResults \u6700\u5927\u7ED3\u679C\u6570\r\n * @returns \u67E5\u8BE2\u7ED3\u679C\r\n */\r\n queryWithExclusion(includeMask: ComponentMask, excludeMask: ComponentMask, maxResults: number = 10000): QueryResult {\r\n this.ensureInitialized();\r\n \r\n if (this.usingWasm && this.wasmCore) {\r\n try {\r\n const ptr = this.wasmCore.query_with_exclusion(includeMask, excludeMask, maxResults);\r\n \r\n if (ptr && this.wasmModule?.memory) {\r\n // \u6682\u65F6\u8FD4\u56DE\u7A7A\u7ED3\u679C\uFF0C\u9700\u8981\u5B9E\u73B0\u5185\u5B58\u8BBF\u95EE\r\n return { entities: new Uint32Array(0), count: 0 };\r\n }\r\n \r\n return { entities: new Uint32Array(0), count: 0 };\r\n } catch (error) {\r\n if (!this.silent) {\r\n console.warn('WASM\u6392\u9664\u67E5\u8BE2\u5931\u8D25\uFF0C\u56DE\u9000\u5230JavaScript\u5B9E\u73B0:', error);\r\n }\r\n // \u56DE\u9000\u5230JavaScript\u5B9E\u73B0\r\n }\r\n }\r\n \r\n // JavaScript\u5B9E\u73B0\r\n this.jsQueryCount++;\r\n const entities: EntityId[] = [];\r\n \r\n for (const [entityId, entityMask] of this.jsEntityMasks) {\r\n if ((entityMask & includeMask) === includeMask && (entityMask & excludeMask) === BigInt(0)) {\r\n entities.push(entityId);\r\n if (entities.length >= maxResults) break;\r\n }\r\n }\r\n \r\n return {\r\n entities: new Uint32Array(entities),\r\n count: entities.length\r\n };\r\n }\r\n\r\n /**\r\n * \u83B7\u53D6\u5B9E\u4F53\u7684\u7EC4\u4EF6\u63A9\u7801\r\n * \r\n * @param entityId \u5B9E\u4F53ID\r\n * @returns \u7EC4\u4EF6\u63A9\u7801\uFF0C\u5982\u679C\u5B9E\u4F53\u4E0D\u5B58\u5728\u5219\u8FD4\u56DEnull\r\n */\r\n getEntityMask(entityId: EntityId): ComponentMask | null {\r\n this.ensureInitialized();\r\n \r\n if (this.usingWasm && this.wasmCore) {\r\n return this.wasmCore.get_entity_mask(entityId) || null;\r\n } else {\r\n return this.jsEntityMasks.get(entityId) || null;\r\n }\r\n }\r\n\r\n /**\r\n * \u68C0\u67E5\u5B9E\u4F53\u662F\u5426\u5B58\u5728\r\n * \r\n * @param entityId \u5B9E\u4F53ID\r\n * @returns \u662F\u5426\u5B58\u5728\r\n */\r\n entityExists(entityId: EntityId): boolean {\r\n this.ensureInitialized();\r\n \r\n if (this.usingWasm && this.wasmCore) {\r\n return this.wasmCore.entity_exists(entityId);\r\n } else {\r\n return this.jsEntityMasks.has(entityId);\r\n }\r\n }\r\n\r\n /**\r\n * \u521B\u5EFA\u7EC4\u4EF6\u63A9\u7801\r\n * \r\n * @param componentIds \u7EC4\u4EF6ID\u6570\u7EC4\r\n * @returns \u7EC4\u4EF6\u63A9\u7801\r\n */\r\n createComponentMask(componentIds: number[]): ComponentMask {\r\n if (this.usingWasm && this.wasmModule) {\r\n return this.wasmModule.create_component_mask(new Uint32Array(componentIds));\r\n } else {\r\n let mask = BigInt(0);\r\n for (const id of componentIds) {\r\n if (id < 64) {\r\n mask |= BigInt(1) << BigInt(id);\r\n }\r\n }\r\n return mask;\r\n }\r\n }\r\n\r\n /**\r\n * \u68C0\u67E5\u63A9\u7801\u662F\u5426\u5305\u542B\u7EC4\u4EF6\r\n * \r\n * @param mask \u7EC4\u4EF6\u63A9\u7801\r\n * @param componentId \u7EC4\u4EF6ID\r\n * @returns \u662F\u5426\u5305\u542B\r\n */\r\n maskContainsComponent(mask: ComponentMask, componentId: number): boolean {\r\n if (this.usingWasm && this.wasmModule) {\r\n return this.wasmModule.mask_contains_component(mask, componentId);\r\n } else {\r\n if (componentId >= 64) return false;\r\n return (mask & (BigInt(1) << BigInt(componentId))) !== BigInt(0);\r\n }\r\n }\r\n\r\n /**\r\n * \u83B7\u53D6\u6027\u80FD\u7EDF\u8BA1\u4FE1\u606F\r\n * \r\n * @returns \u6027\u80FD\u7EDF\u8BA1\r\n */\r\n getPerformanceStats(): PerformanceStats {\r\n this.ensureInitialized();\r\n \r\n if (this.usingWasm && this.wasmCore) {\r\n const stats = Array.from(this.wasmCore.get_performance_stats());\r\n return {\r\n entityCount: stats[0] as number,\r\n indexCount: stats[1] as number,\r\n queryCount: stats[2] as number,\r\n updateCount: stats[3] as number,\r\n wasmEnabled: true\r\n };\r\n } else {\r\n return {\r\n entityCount: this.jsEntityMasks.size,\r\n indexCount: 0,\r\n queryCount: this.jsQueryCount,\r\n updateCount: this.jsUpdateCount,\r\n wasmEnabled: false\r\n };\r\n }\r\n }\r\n\r\n /**\r\n * \u6E05\u7A7A\u6240\u6709\u6570\u636E\r\n */\r\n clear(): void {\r\n this.ensureInitialized();\r\n \r\n if (this.usingWasm && this.wasmCore) {\r\n this.wasmCore.clear();\r\n } else {\r\n this.jsEntityMasks.clear();\r\n this.jsNextEntityId = 1;\r\n this.jsQueryCount = 0;\r\n this.jsUpdateCount = 0;\r\n }\r\n }\r\n\r\n /**\r\n * \u662F\u5426\u4F7F\u7528WASM\u5B9E\u73B0\r\n * \r\n * @returns \u662F\u5426\u4F7F\u7528WASM\r\n */\r\n isUsingWasm(): boolean {\r\n return this.usingWasm;\r\n }\r\n\r\n /**\r\n * \u662F\u5426\u5DF2\u521D\u59CB\u5316\r\n * \r\n * @returns \u662F\u5426\u5DF2\u521D\u59CB\u5316\r\n */\r\n isInitialized(): boolean {\r\n return this.initialized;\r\n }\r\n\r\n /**\r\n * \u786E\u4FDD\u5DF2\u521D\u59CB\u5316\r\n */\r\n private ensureInitialized(): void {\r\n if (!this.initialized) {\r\n throw new Error('ECS\u6838\u5FC3\u672A\u521D\u59CB\u5316\uFF0C\u8BF7\u5148\u8C03\u7528 initialize()');\r\n }\r\n }\r\n\r\n /**\r\n * \u6E05\u7406\u8D44\u6E90\r\n */\r\n cleanup(): void {\r\n if (this.usingWasm && this.wasmCore) {\r\n try {\r\n this.wasmCore.free?.();\r\n } catch (error) {\r\n if (!this.silent) {\r\n console.warn('\u26A0\uFE0F \u6E05\u7406WASM\u8D44\u6E90\u65F6\u51FA\u9519:', error);\r\n }\r\n }\r\n }\r\n \r\n this.wasmCore = null;\r\n this.wasmModule = null;\r\n this.jsEntityMasks.clear();\r\n this.initialized = false;\r\n this.usingWasm = false;\r\n }\r\n}\r\n\r\n/**\r\n * \u5168\u5C40ECS\u6838\u5FC3\u5B9E\u4F8B\r\n * \r\n * \u63D0\u4F9B\u5355\u4F8B\u6A21\u5F0F\u7684ECS\u6838\u5FC3\uFF0C\u786E\u4FDD\u6574\u4E2A\u5E94\u7528\u4F7F\u7528\u540C\u4E00\u4E2A\u5B9E\u4F8B\r\n */\r\nexport const ecsCore = new WasmEcsCore();\r\n\r\n/**\r\n * \u521D\u59CB\u5316ECS\u5F15\u64CE\r\n * \r\n * \u4FBF\u6377\u7684\u521D\u59CB\u5316\u51FD\u6570\uFF0C\u63A8\u8350\u5728\u5E94\u7528\u542F\u52A8\u65F6\u8C03\u7528\r\n * \r\n * @param silent \u662F\u5426\u9759\u9ED8\u6A21\u5F0F\r\n * @returns \u521D\u59CB\u5316\u662F\u5426\u6210\u529F\r\n * \r\n * @example\r\n * ```typescript\r\n * import { initializeEcs } from 'ecs-framework';\r\n * \r\n * async function main() {\r\n * // \u4F7F\u7528\u9ED8\u8BA4\u914D\u7F6E\uFF08JavaScript\u5B9E\u73B0\uFF09\r\n * await initializeEcs();\r\n * \r\n * // \u6216\u8005\u81EA\u5B9A\u4E49\u914D\u7F6E\r\n * await initializeEcs({\r\n * enabled: false, // \u7981\u7528WASM\r\n * silent: true // \u9759\u9ED8\u6A21\u5F0F\r\n * });\r\n * }\r\n * ```\r\n */\r\nexport async function initializeEcs(silent: boolean = false): Promise<boolean> {\r\n ecsCore.setSilent(silent);\r\n return ecsCore.initialize();\r\n}\r\n\r\n/**\r\n * \u5FEB\u901F\u67E5\u8BE2\u5DE5\u5177\u51FD\u6570\r\n * \r\n * \u4E3A\u5E38\u89C1\u67E5\u8BE2\u64CD\u4F5C\u63D0\u4F9B\u4FBF\u6377\u7684API\r\n */\r\nexport const Query = {\r\n /**\r\n * \u67E5\u8BE2\u62E5\u6709\u6307\u5B9A\u7EC4\u4EF6\u7684\u6240\u6709\u5B9E\u4F53\r\n */\r\n withComponent: (componentId: number, maxResults?: number): QueryResult => {\r\n const mask = ecsCore.createComponentMask([componentId]);\r\n return ecsCore.queryEntities(mask, maxResults);\r\n },\r\n\r\n /**\r\n * \u67E5\u8BE2\u62E5\u6709\u591A\u4E2A\u7EC4\u4EF6\u7684\u5B9E\u4F53\r\n */\r\n withComponents: (componentIds: number[], maxResults?: number): QueryResult => {\r\n const masks = componentIds.map(id => ecsCore.createComponentMask([id]));\r\n return ecsCore.queryMultipleComponents(masks, maxResults);\r\n },\r\n\r\n /**\r\n * \u67E5\u8BE2\u62E5\u6709\u67D0\u4E9B\u7EC4\u4EF6\u4F46\u4E0D\u62E5\u6709\u5176\u4ED6\u7EC4\u4EF6\u7684\u5B9E\u4F53\r\n */\r\n withExclusion: (includeIds: number[], excludeIds: number[], maxResults?: number): QueryResult => {\r\n const includeMask = ecsCore.createComponentMask(includeIds);\r\n const excludeMask = ecsCore.createComponentMask(excludeIds);\r\n return ecsCore.queryWithExclusion(includeMask, excludeMask, maxResults);\r\n }\r\n};\r\n\r\n ", "import { Component } from '../Component';\r\n\r\n/**\r\n * \u7EC4\u4EF6\u5BF9\u8C61\u6C60\uFF0C\u7528\u4E8E\u590D\u7528\u7EC4\u4EF6\u5B9E\u4F8B\u4EE5\u51CF\u5C11\u5185\u5B58\u5206\u914D\r\n */\r\nexport class ComponentPool<T extends Component> {\r\n private pool: T[] = [];\r\n private createFn: () => T;\r\n private resetFn?: (component: T) => void;\r\n private maxSize: number;\r\n\r\n constructor(\r\n createFn: () => T,\r\n resetFn?: (component: T) => void,\r\n maxSize: number = 1000\r\n ) {\r\n this.createFn = createFn;\r\n this.resetFn = resetFn;\r\n this.maxSize = maxSize;\r\n }\r\n\r\n /**\r\n * \u83B7\u53D6\u4E00\u4E2A\u7EC4\u4EF6\u5B9E\u4F8B\r\n */\r\n acquire(): T {\r\n if (this.pool.length > 0) {\r\n return this.pool.pop()!;\r\n }\r\n return this.createFn();\r\n }\r\n\r\n /**\r\n * \u91CA\u653E\u4E00\u4E2A\u7EC4\u4EF6\u5B9E\u4F8B\u56DE\u6C60\u4E2D\r\n */\r\n release(component: T): void {\r\n if (this.pool.length < this.maxSize) {\r\n if (this.resetFn) {\r\n this.resetFn(component);\r\n }\r\n this.pool.push(component);\r\n }\r\n }\r\n\r\n /**\r\n * \u9884\u586B\u5145\u5BF9\u8C61\u6C60\r\n */\r\n prewarm(count: number): void {\r\n for (let i = 0; i < count && this.pool.length < this.maxSize; i++) {\r\n this.pool.push(this.createFn());\r\n }\r\n }\r\n\r\n /**\r\n * \u6E05\u7A7A\u5BF9\u8C61\u6C60\r\n */\r\n clear(): void {\r\n this.pool.length = 0;\r\n }\r\n\r\n /**\r\n * \u83B7\u53D6\u6C60\u4E2D\u53EF\u7528\u5BF9\u8C61\u6570\u91CF\r\n */\r\n getAvailableCount(): number {\r\n return this.pool.length;\r\n }\r\n\r\n /**\r\n * \u83B7\u53D6\u6C60\u7684\u6700\u5927\u5BB9\u91CF\r\n */\r\n getMaxSize(): number {\r\n return this.maxSize;\r\n }\r\n}\r\n\r\n/**\r\n * \u5168\u5C40\u7EC4\u4EF6\u6C60\u7BA1\u7406\u5668\r\n */\r\nexport class ComponentPoolManager {\r\n private static instance: ComponentPoolManager;\r\n private pools = new Map<string, ComponentPool<any>>();\r\n\r\n private constructor() {}\r\n\r\n static getInstance(): ComponentPoolManager {\r\n if (!ComponentPoolManager.instance) {\r\n ComponentPoolManager.instance = new ComponentPoolManager();\r\n }\r\n return ComponentPoolManager.instance;\r\n }\r\n\r\n /**\r\n * \u6CE8\u518C\u7EC4\u4EF6\u6C60\r\n */\r\n registerPool<T extends Component>(\r\n componentName: string,\r\n createFn: () => T,\r\n resetFn?: (component: T) => void,\r\n maxSize?: number\r\n ): void {\r\n this.pools.set(componentName, new ComponentPool(createFn, resetFn, maxSize));\r\n }\r\n\r\n /**\r\n * \u83B7\u53D6\u7EC4\u4EF6\u5B9E\u4F8B\r\n */\r\n acquireComponent<T extends Component>(componentName: string): T | null {\r\n const pool = this.pools.get(componentName);\r\n return pool ? pool.acquire() : null;\r\n }\r\n\r\n /**\r\n * \u91CA\u653E\u7EC4\u4EF6\u5B9E\u4F8B\r\n */\r\n releaseComponent<T extends Component>(componentName: string, component: T): void {\r\n const pool = this.pools.get(componentName);\r\n if (pool) {\r\n pool.release(component);\r\n }\r\n }\r\n\r\n /**\r\n * \u9884\u70ED\u6240\u6709\u6C60\r\n */\r\n prewarmAll(count: number = 100): void {\r\n for (const pool of this.pools.values()) {\r\n pool.prewarm(count);\r\n }\r\n }\r\n\r\n /**\r\n * \u6E05\u7A7A\u6240\u6709\u6C60\r\n */\r\n clearAll(): void {\r\n for (const pool of this.pools.values()) {\r\n pool.clear();\r\n }\r\n }\r\n\r\n /**\r\n * \u83B7\u53D6\u6C60\u7EDF\u8BA1\u4FE1\u606F\r\n */\r\n getPoolStats(): Map<string, { available: number; maxSize: number }> {\r\n const stats = new Map();\r\n for (const [name, pool] of this.pools) {\r\n stats.set(name, {\r\n available: pool.getAvailableCount(),\r\n maxSize: pool.getMaxSize()\r\n });\r\n }\r\n return stats;\r\n }\r\n} ", "/**\r\n * \u4F4D\u63A9\u7801\u4F18\u5316\u5668\uFF0C\u7528\u4E8E\u9884\u8BA1\u7B97\u548C\u7F13\u5B58\u5E38\u7528\u7684\u7EC4\u4EF6\u63A9\u7801\r\n */\r\nexport class BitMaskOptimizer {\r\n private static instance: BitMaskOptimizer;\r\n private maskCache = new Map<string, bigint>();\r\n private componentTypeMap = new Map<string, number>();\r\n private nextComponentId = 0;\r\n\r\n private constructor() {}\r\n\r\n static getInstance(): BitMaskOptimizer {\r\n if (!BitMaskOptimizer.instance) {\r\n BitMaskOptimizer.instance = new BitMaskOptimizer();\r\n }\r\n return BitMaskOptimizer.instance;\r\n }\r\n\r\n /**\r\n * \u6CE8\u518C\u7EC4\u4EF6\u7C7B\u578B\r\n */\r\n registerComponentType(componentName: string): number {\r\n if (!this.componentTypeMap.has(componentName)) {\r\n this.componentTypeMap.set(componentName, this.nextComponentId++);\r\n }\r\n return this.componentTypeMap.get(componentName)!;\r\n }\r\n\r\n /**\r\n * \u83B7\u53D6\u7EC4\u4EF6\u7C7B\u578BID\r\n */\r\n getComponentTypeId(componentName: string): number | undefined {\r\n return this.componentTypeMap.get(componentName);\r\n }\r\n\r\n /**\r\n * \u521B\u5EFA\u5355\u4E2A\u7EC4\u4EF6\u7684\u63A9\u7801\r\n */\r\n createSingleComponentMask(componentName: string): bigint {\r\n const cacheKey = `single:${componentName}`;\r\n \r\n if (this.maskCache.has(cacheKey)) {\r\n return this.maskCache.get(cacheKey)!;\r\n }\r\n\r\n const componentId = this.getComponentTypeId(componentName);\r\n if (componentId === undefined) {\r\n throw new Error(`Component type not registered: ${componentName}`);\r\n }\r\n\r\n const mask = 1n << BigInt(componentId);\r\n this.maskCache.set(cacheKey, mask);\r\n return mask;\r\n }\r\n\r\n /**\r\n * \u521B\u5EFA\u591A\u4E2A\u7EC4\u4EF6\u7684\u7EC4\u5408\u63A9\u7801\r\n */\r\n createCombinedMask(componentNames: string[]): bigint {\r\n const sortedNames = [...componentNames].sort();\r\n const cacheKey = `combined:${sortedNames.join(',')}`;\r\n \r\n if (this.maskCache.has(cacheKey)) {\r\n return this.maskCache.get(cacheKey)!;\r\n }\r\n\r\n let mask = 0n;\r\n for (const componentName of componentNames) {\r\n const componentId = this.getComponentTypeId(componentName);\r\n if (componentId === undefined) {\r\n throw new Error(`Component type not registered: ${componentName}`);\r\n }\r\n mask |= 1n << BigInt(componentId);\r\n }\r\n\r\n this.maskCache.set(cacheKey, mask);\r\n return mask;\r\n }\r\n\r\n /**\r\n * \u68C0\u67E5\u63A9\u7801\u662F\u5426\u5305\u542B\u6307\u5B9A\u7EC4\u4EF6\r\n */\r\n maskContainsComponent(mask: bigint, componentName: string): boolean {\r\n const componentMask = this.createSingleComponentMask(componentName);\r\n return (mask & componentMask) !== 0n;\r\n }\r\n\r\n /**\r\n * \u68C0\u67E5\u63A9\u7801\u662F\u5426\u5305\u542B\u6240\u6709\u6307\u5B9A\u7EC4\u4EF6\r\n */\r\n maskContainsAllComponents(mask: bigint, componentNames: string[]): boolean {\r\n const requiredMask = this.createCombinedMask(componentNames);\r\n return (mask & requiredMask) === requiredMask;\r\n }\r\n\r\n /**\r\n * \u68C0\u67E5\u63A9\u7801\u662F\u5426\u5305\u542B\u4EFB\u4E00\u6307\u5B9A\u7EC4\u4EF6\r\n */\r\n maskContainsAnyComponent(mask: bigint, componentNames: string[]): boolean {\r\n const anyMask = this.createCombinedMask(componentNames);\r\n return (mask & anyMask) !== 0n;\r\n }\r\n\r\n /**\r\n * \u6DFB\u52A0\u7EC4\u4EF6\u5230\u63A9\u7801\r\n */\r\n addComponentToMask(mask: bigint, componentName: string): bigint {\r\n const componentMask = this.createSingleComponentMask(componentName);\r\n return mask | componentMask;\r\n }\r\n\r\n /**\r\n * \u4ECE\u63A9\u7801\u4E2D\u79FB\u9664\u7EC4\u4EF6\r\n */\r\n removeComponentFromMask(mask: bigint, componentName: string): bigint {\r\n const componentMask = this.createSingleComponentMask(componentName);\r\n return mask & ~componentMask;\r\n }\r\n\r\n /**\r\n * \u9884\u8BA1\u7B97\u5E38\u7528\u63A9\u7801\u7EC4\u5408\r\n */\r\n precomputeCommonMasks(commonCombinations: string[][]): void {\r\n for (const combination of commonCombinations) {\r\n this.createCombinedMask(combination);\r\n }\r\n }\r\n\r\n /**\r\n * \u83B7\u53D6\u63A9\u7801\u7F13\u5B58\u7EDF\u8BA1\u4FE1\u606F\r\n */\r\n getCacheStats(): { size: number; componentTypes: number } {\r\n return {\r\n size: this.maskCache.size,\r\n componentTypes: this.componentTypeMap.size\r\n };\r\n }\r\n\r\n /**\r\n * \u6E05\u7A7A\u7F13\u5B58\r\n */\r\n clearCache(): void {\r\n this.maskCache.clear();\r\n }\r\n\r\n /**\r\n * \u91CD\u7F6E\u4F18\u5316\u5668\r\n */\r\n reset(): void {\r\n this.maskCache.clear();\r\n this.componentTypeMap.clear();\r\n this.nextComponentId = 0;\r\n }\r\n\r\n /**\r\n * \u5C06\u63A9\u7801\u8F6C\u6362\u4E3A\u7EC4\u4EF6\u540D\u79F0\u6570\u7EC4\r\n */\r\n maskToComponentNames(mask: bigint): string[] {\r\n const componentNames: string[] = [];\r\n \r\n for (const [componentName, componentId] of this.componentTypeMap) {\r\n const componentMask = 1n << BigInt(componentId);\r\n if ((mask & componentMask) !== 0n) {\r\n componentNames.push(componentName);\r\n }\r\n }\r\n \r\n return componentNames;\r\n }\r\n\r\n /**\r\n * \u83B7\u53D6\u63A9\u7801\u4E2D\u7EC4\u4EF6\u7684\u6570\u91CF\r\n */\r\n getComponentCount(mask: bigint): number {\r\n let count = 0;\r\n let tempMask = mask;\r\n \r\n while (tempMask !== 0n) {\r\n if ((tempMask & 1n) !== 0n) {\r\n count++;\r\n }\r\n tempMask >>= 1n;\r\n }\r\n \r\n return count;\r\n }\r\n} ", "import { Entity } from '../Entity';\r\n\r\n/**\r\n * \u7D22\u5F15\u66F4\u65B0\u64CD\u4F5C\u7C7B\u578B\r\n */\r\nexport enum IndexUpdateType {\r\n ADD_ENTITY = 'add_entity',\r\n REMOVE_ENTITY = 'remove_entity',\r\n UPDATE_ENTITY = 'update_entity'\r\n}\r\n\r\n/**\r\n * \u7D22\u5F15\u66F4\u65B0\u64CD\u4F5C\r\n */\r\nexport interface IndexUpdateOperation {\r\n type: IndexUpdateType;\r\n entity: Entity;\r\n oldMask?: bigint;\r\n newMask?: bigint;\r\n}\r\n\r\n/**\r\n * \u5EF6\u8FDF\u7D22\u5F15\u66F4\u65B0\u5668\uFF0C\u7528\u4E8E\u6279\u91CF\u66F4\u65B0\u67E5\u8BE2\u7D22\u5F15\u4EE5\u63D0\u9AD8\u6027\u80FD\r\n */\r\nexport class IndexUpdateBatcher {\r\n private pendingOperations: IndexUpdateOperation[] = [];\r\n private isProcessing = false;\r\n private batchSize = 1000;\r\n private flushTimeout: NodeJS.Timeout | null = null;\r\n private flushDelay = 16; // 16ms\uFF0C\u7EA660fps\r\n\r\n /**\r\n * \u6DFB\u52A0\u7D22\u5F15\u66F4\u65B0\u64CD\u4F5C\r\n */\r\n addOperation(operation: IndexUpdateOperation): void {\r\n this.pendingOperations.push(operation);\r\n \r\n // \u5982\u679C\u8FBE\u5230\u6279\u91CF\u5927\u5C0F\uFF0C\u7ACB\u5373\u5904\u7406\r\n if (this.pendingOperations.length >= this.batchSize) {\r\n this.flush();\r\n } else {\r\n // \u5426\u5219\u5EF6\u8FDF\u5904\u7406\r\n this.scheduleFlush();\r\n }\r\n }\r\n\r\n /**\r\n * \u6279\u91CF\u6DFB\u52A0\u5B9E\u4F53\r\n */\r\n addEntities(entities: Entity[]): void {\r\n for (const entity of entities) {\r\n this.pendingOperations.push({\r\n type: IndexUpdateType.ADD_ENTITY,\r\n entity\r\n });\r\n }\r\n \r\n if (this.pendingOperations.length >= this.batchSize) {\r\n this.flush();\r\n } else {\r\n this.scheduleFlush();\r\n }\r\n }\r\n\r\n /**\r\n * \u6279\u91CF\u79FB\u9664\u5B9E\u4F53\r\n */\r\n removeEntities(entities: Entity[]): void {\r\n for (const entity of entities) {\r\n this.pendingOperations.push({\r\n type: IndexUpdateType.REMOVE_ENTITY,\r\n entity\r\n });\r\n }\r\n \r\n if (this.pendingOperations.length >= this.batchSize) {\r\n this.flush();\r\n } else {\r\n this.scheduleFlush();\r\n }\r\n }\r\n\r\n /**\r\n * \u6279\u91CF\u66F4\u65B0\u5B9E\u4F53\r\n */\r\n updateEntities(updates: Array<{ entity: Entity; oldMask: bigint; newMask: bigint }>): void {\r\n for (const update of updates) {\r\n this.pendingOperations.push({\r\n type: IndexUpdateType.UPDATE_ENTITY,\r\n entity: update.entity,\r\n oldMask: update.oldMask,\r\n newMask: update.newMask\r\n });\r\n }\r\n \r\n if (this.pendingOperations.length >= this.batchSize) {\r\n this.flush();\r\n } else {\r\n this.scheduleFlush();\r\n }\r\n }\r\n\r\n /**\r\n * \u5B89\u6392\u5EF6\u8FDF\u5237\u65B0\r\n */\r\n private scheduleFlush(): void {\r\n if (this.flushTimeout) {\r\n return;\r\n }\r\n \r\n this.flushTimeout = setTimeout(() => {\r\n this.flush();\r\n }, this.flushDelay);\r\n }\r\n\r\n /**\r\n * \u7ACB\u5373\u5904\u7406\u6240\u6709\u5F85\u5904\u7406\u7684\u64CD\u4F5C\r\n */\r\n flush(): void {\r\n if (this.isProcessing || this.pendingOperations.length === 0) {\r\n return;\r\n }\r\n\r\n this.isProcessing = true;\r\n \r\n if (this.flushTimeout) {\r\n clearTimeout(this.flushTimeout);\r\n this.flushTimeout = null;\r\n }\r\n\r\n try {\r\n this.processBatch();\r\n } finally {\r\n this.isProcessing = false;\r\n }\r\n }\r\n\r\n /**\r\n * \u5904\u7406\u6279\u91CF\u64CD\u4F5C\r\n */\r\n private processBatch(): void {\r\n const operations = this.pendingOperations;\r\n this.pendingOperations = [];\r\n\r\n // \u6309\u64CD\u4F5C\u7C7B\u578B\u5206\u7EC4\u4EE5\u4F18\u5316\u5904\u7406\r\n const addOperations: Entity[] = [];\r\n const removeOperations: Entity[] = [];\r\n const updateOperations: Array<{ entity: Entity; oldMask: bigint; newMask: bigint }> = [];\r\n\r\n for (const operation of operations) {\r\n switch (operation.type) {\r\n case IndexUpdateType.ADD_ENTITY:\r\n addOperations.push(operation.entity);\r\n break;\r\n case IndexUpdateType.REMOVE_ENTITY:\r\n removeOperations.push(operation.entity);\r\n break;\r\n case IndexUpdateType.UPDATE_ENTITY:\r\n if (operation.oldMask !== undefined && operation.newMask !== undefined) {\r\n updateOperations.push({\r\n entity: operation.entity,\r\n oldMask: operation.oldMask,\r\n newMask: operation.newMask\r\n });\r\n }\r\n break;\r\n }\r\n }\r\n\r\n // \u6279\u91CF\u5904\u7406\u6BCF\u79CD\u7C7B\u578B\u7684\u64CD\u4F5C\r\n if (addOperations.length > 0) {\r\n this.processBatchAdd(addOperations);\r\n }\r\n \r\n if (removeOperations.length > 0) {\r\n this.processBatchRemove(removeOperations);\r\n }\r\n \r\n if (updateOperations.length > 0) {\r\n this.processBatchUpdate(updateOperations);\r\n }\r\n }\r\n\r\n /**\r\n * \u6279\u91CF\u5904\u7406\u6DFB\u52A0\u64CD\u4F5C\r\n */\r\n private processBatchAdd(entities: Entity[]): void {\r\n // \u8FD9\u91CC\u5E94\u8BE5\u8C03\u7528QuerySystem\u7684\u6279\u91CF\u6DFB\u52A0\u65B9\u6CD5\r\n // \u7531\u4E8E\u9700\u8981\u8BBF\u95EEQuerySystem\uFF0C\u8FD9\u4E2A\u65B9\u6CD5\u5E94\u8BE5\u7531\u5916\u90E8\u6CE8\u5165\u5904\u7406\u51FD\u6570\r\n if (this.onBatchAdd) {\r\n this.onBatchAdd(entities);\r\n }\r\n }\r\n\r\n /**\r\n * \u6279\u91CF\u5904\u7406\u79FB\u9664\u64CD\u4F5C\r\n */\r\n private processBatchRemove(entities: Entity[]): void {\r\n if (this.onBatchRemove) {\r\n this.onBatchRemove(entities);\r\n }\r\n }\r\n\r\n /**\r\n * \u6279\u91CF\u5904\u7406\u66F4\u65B0\u64CD\u4F5C\r\n */\r\n private processBatchUpdate(updates: Array<{ entity: Entity; oldMask: bigint; newMask: bigint }>): void {\r\n if (this.onBatchUpdate) {\r\n this.onBatchUpdate(updates);\r\n }\r\n }\r\n\r\n /**\r\n * \u8BBE\u7F6E\u6279\u91CF\u5927\u5C0F\r\n */\r\n setBatchSize(size: number): void {\r\n this.batchSize = Math.max(1, size);\r\n }\r\n\r\n /**\r\n * \u8BBE\u7F6E\u5237\u65B0\u5EF6\u8FDF\r\n */\r\n setFlushDelay(delay: number): void {\r\n this.flushDelay = Math.max(0, delay);\r\n }\r\n\r\n /**\r\n * \u83B7\u53D6\u5F85\u5904\u7406\u64CD\u4F5C\u6570\u91CF\r\n */\r\n getPendingCount(): number {\r\n return this.pendingOperations.length;\r\n }\r\n\r\n /**\r\n * \u6E05\u7A7A\u6240\u6709\u5F85\u5904\u7406\u64CD\u4F5C\r\n */\r\n clear(): void {\r\n this.pendingOperations.length = 0;\r\n if (this.flushTimeout) {\r\n clearTimeout(this.flushTimeout);\r\n this.flushTimeout = null;\r\n }\r\n }\r\n\r\n /**\r\n * \u68C0\u67E5\u662F\u5426\u6709\u5F85\u5904\u7406\u64CD\u4F5C\r\n */\r\n hasPendingOperations(): boolean {\r\n return this.pendingOperations.length > 0;\r\n }\r\n\r\n // \u56DE\u8C03\u51FD\u6570\uFF0C\u7531\u5916\u90E8\u8BBE\u7F6E\r\n public onBatchAdd?: (entities: Entity[]) => void;\r\n public onBatchRemove?: (entities: Entity[]) => void;\r\n public onBatchUpdate?: (updates: Array<{ entity: Entity; oldMask: bigint; newMask: bigint }>) => void;\r\n} ", "import { Entity } from '../Entity';\r\nimport { Component } from '../Component';\r\nimport { ComponentRegistry, ComponentType } from './ComponentStorage';\r\nimport { ecsCore } from '../../Utils/WasmCore';\r\nimport { ComponentPoolManager } from './ComponentPool';\r\nimport { BitMaskOptimizer } from './BitMaskOptimizer';\r\nimport { IndexUpdateBatcher } from './IndexUpdateBatcher';\r\n\r\n/**\r\n * \u67E5\u8BE2\u6761\u4EF6\u7C7B\u578B\r\n */\r\nexport enum QueryConditionType {\r\n /** \u5FC5\u987B\u5305\u542B\u6240\u6709\u6307\u5B9A\u7EC4\u4EF6 */\r\n ALL = 'all',\r\n /** \u5FC5\u987B\u5305\u542B\u4EFB\u610F\u4E00\u4E2A\u6307\u5B9A\u7EC4\u4EF6 */\r\n ANY = 'any',\r\n /** \u4E0D\u80FD\u5305\u542B\u4EFB\u4F55\u6307\u5B9A\u7EC4\u4EF6 */\r\n NONE = 'none'\r\n}\r\n\r\n/**\r\n * \u67E5\u8BE2\u6761\u4EF6\u63A5\u53E3\r\n */\r\nexport interface QueryCondition {\r\n type: QueryConditionType;\r\n componentTypes: ComponentType[];\r\n mask: bigint;\r\n}\r\n\r\n/**\r\n * \u5B9E\u4F53\u67E5\u8BE2\u7ED3\u679C\u63A5\u53E3\r\n */\r\nexport interface QueryResult {\r\n entities: Entity[];\r\n count: number;\r\n /** \u67E5\u8BE2\u6267\u884C\u65F6\u95F4\uFF08\u6BEB\u79D2\uFF09 */\r\n executionTime: number;\r\n /** \u662F\u5426\u6765\u81EA\u7F13\u5B58 */\r\n fromCache: boolean;\r\n}\r\n\r\n/**\r\n * \u5B9E\u4F53\u7D22\u5F15\u7ED3\u6784\r\n */\r\ninterface EntityIndex {\r\n byMask: Map<bigint, Set<Entity>>;\r\n byComponentType: Map<ComponentType, Set<Entity>>;\r\n byTag: Map<number, Set<Entity>>;\r\n byName: Map<string, Set<Entity>>;\r\n}\r\n\r\n/**\r\n * \u67E5\u8BE2\u7F13\u5B58\u6761\u76EE\r\n */\r\ninterface QueryCacheEntry {\r\n entities: Entity[];\r\n timestamp: number;\r\n hitCount: number;\r\n}\r\n\r\n/**\r\n * \u9AD8\u6027\u80FD\u5B9E\u4F53\u67E5\u8BE2\u7CFB\u7EDF\r\n * \r\n * \u63D0\u4F9B\u5FEB\u901F\u7684\u5B9E\u4F53\u67E5\u8BE2\u529F\u80FD\uFF0C\u652F\u6301\u6309\u7EC4\u4EF6\u7C7B\u578B\u3001\u6807\u7B7E\u3001\u540D\u79F0\u7B49\u591A\u79CD\u65B9\u5F0F\u67E5\u8BE2\u5B9E\u4F53\u3002\r\n * \u7CFB\u7EDF\u91C7\u7528\u591A\u7EA7\u7D22\u5F15\u548C\u667A\u80FD\u7F13\u5B58\u673A\u5236\uFF0C\u786E\u4FDD\u5728\u5927\u91CF\u5B9E\u4F53\u573A\u666F\u4E0B\u7684\u67E5\u8BE2\u6027\u80FD\u3002\r\n * \r\n * \u4E3B\u8981\u7279\u6027\uFF1A\r\n * - \u652F\u6301\u5355\u7EC4\u4EF6\u548C\u591A\u7EC4\u4EF6\u67E5\u8BE2\r\n * - \u81EA\u52A8\u7D22\u5F15\u7BA1\u7406\u548C\u7F13\u5B58\u4F18\u5316\r\n * - WebAssembly\u8BA1\u7B97\u52A0\u901F\uFF08\u5982\u679C\u53EF\u7528\uFF09\r\n * - \u8BE6\u7EC6\u7684\u6027\u80FD\u7EDF\u8BA1\u4FE1\u606F\r\n * \r\n * @example\r\n * ```typescript\r\n * // \u67E5\u8BE2\u6240\u6709\u5305\u542BPosition\u548CVelocity\u7EC4\u4EF6\u7684\u5B9E\u4F53\r\n * const movingEntities = querySystem.queryAll(PositionComponent, VelocityComponent);\r\n * \r\n * // \u67E5\u8BE2\u7279\u5B9A\u6807\u7B7E\u7684\u5B9E\u4F53\r\n * const playerEntities = querySystem.queryByTag(PLAYER_TAG);\r\n * ```\r\n */\r\nexport class QuerySystem {\r\n private entities: Entity[] = [];\r\n private wasmAvailable = false;\r\n private entityIndex: EntityIndex;\r\n private indexDirty = true;\r\n \r\n // \u67E5\u8BE2\u7F13\u5B58\u7CFB\u7EDF\r\n private queryCache = new Map<string, QueryCacheEntry>();\r\n private cacheMaxSize = 1000;\r\n private cacheTimeout = 5000; // 5\u79D2\u7F13\u5B58\u8FC7\u671F\r\n \r\n // \u4F18\u5316\u7EC4\u4EF6\r\n private componentPoolManager: ComponentPoolManager;\r\n private bitMaskOptimizer: BitMaskOptimizer;\r\n private indexUpdateBatcher: IndexUpdateBatcher;\r\n \r\n // \u6027\u80FD\u7EDF\u8BA1\r\n private queryStats = {\r\n totalQueries: 0,\r\n cacheHits: 0,\r\n indexHits: 0,\r\n linearScans: 0\r\n };\r\n\r\n constructor() {\r\n this.entityIndex = {\r\n byMask: new Map(),\r\n byComponentType: new Map(),\r\n byTag: new Map(),\r\n byName: new Map()\r\n };\r\n \r\n // \u521D\u59CB\u5316\u4F18\u5316\u7EC4\u4EF6\r\n this.componentPoolManager = ComponentPoolManager.getInstance();\r\n this.bitMaskOptimizer = BitMaskOptimizer.getInstance();\r\n this.indexUpdateBatcher = new IndexUpdateBatcher();\r\n \r\n // \u8BBE\u7F6E\u7D22\u5F15\u66F4\u65B0\u6279\u5904\u7406\u5668\u7684\u56DE\u8C03\r\n this.indexUpdateBatcher.onBatchAdd = (entities) => {\r\n for (const entity of entities) {\r\n this.addEntityToIndexes(entity);\r\n }\r\n };\r\n \r\n this.indexUpdateBatcher.onBatchRemove = (entities) => {\r\n for (const entity of entities) {\r\n this.removeEntityFromIndexes(entity);\r\n }\r\n };\r\n \r\n this.indexUpdateBatcher.onBatchUpdate = (updates) => {\r\n for (const update of updates) {\r\n this.removeEntityFromIndexes(update.entity);\r\n this.addEntityToIndexes(update.entity);\r\n }\r\n };\r\n \r\n this.initializeWasm();\r\n }\r\n\r\n /**\r\n * \u521D\u59CB\u5316WebAssembly\u652F\u6301\r\n * \r\n * \u81EA\u52A8\u68C0\u6D4B\u8FD0\u884C\u73AF\u5883\u5E76\u542F\u7528WebAssembly\u8BA1\u7B97\u52A0\u901F\u3002\r\n * \u5982\u679CWebAssembly\u4E0D\u53EF\u7528\uFF0C\u7CFB\u7EDF\u5C06\u81EA\u52A8\u56DE\u9000\u5230JavaScript\u5B9E\u73B0\u3002\r\n */\r\n private async initializeWasm(): Promise<void> {\r\n try {\r\n const wasmLoaded = await ecsCore.initialize();\r\n this.wasmAvailable = wasmLoaded && ecsCore.isUsingWasm();\r\n \r\n if (this.wasmAvailable) {\r\n console.log('QuerySystem: WebAssembly\u8BA1\u7B97\u52A0\u901F\u5DF2\u542F\u7528');\r\n } else {\r\n console.log('QuerySystem: \u4F7F\u7528JavaScript\u5B9E\u73B0');\r\n }\r\n } catch (error) {\r\n console.warn('QuerySystem: WebAssembly\u521D\u59CB\u5316\u5931\u8D25\uFF0C\u4F7F\u7528JavaScript\u5B9E\u73B0:', error);\r\n this.wasmAvailable = false;\r\n }\r\n }\r\n\r\n /**\r\n * \u8BBE\u7F6E\u5B9E\u4F53\u5217\u8868\u5E76\u91CD\u5EFA\u7D22\u5F15\r\n * \r\n * \u5F53\u5B9E\u4F53\u96C6\u5408\u53D1\u751F\u5927\u89C4\u6A21\u53D8\u5316\u65F6\u8C03\u7528\u6B64\u65B9\u6CD5\u3002\r\n * \u7CFB\u7EDF\u5C06\u91CD\u65B0\u6784\u5EFA\u6240\u6709\u7D22\u5F15\u4EE5\u786E\u4FDD\u67E5\u8BE2\u6027\u80FD\u3002\r\n * \r\n * @param entities \u65B0\u7684\u5B9E\u4F53\u5217\u8868\r\n */\r\n public setEntities(entities: Entity[]): void {\r\n this.entities = entities;\r\n this.clearQueryCache();\r\n this.rebuildIndexes();\r\n }\r\n\r\n /**\r\n * \u6DFB\u52A0\u5355\u4E2A\u5B9E\u4F53\u5230\u67E5\u8BE2\u7CFB\u7EDF\r\n * \r\n * \u5C06\u65B0\u5B9E\u4F53\u6DFB\u52A0\u5230\u67E5\u8BE2\u7CFB\u7EDF\u4E2D\uFF0C\u5E76\u81EA\u52A8\u66F4\u65B0\u76F8\u5173\u7D22\u5F15\u3002\r\n * \u4E3A\u4E86\u63D0\u9AD8\u6279\u91CF\u6DFB\u52A0\u6027\u80FD\uFF0C\u53EF\u4EE5\u5EF6\u8FDF\u7F13\u5B58\u6E05\u7406\u3002\r\n * \r\n * @param entity \u8981\u6DFB\u52A0\u7684\u5B9E\u4F53\r\n * @param deferCacheClear \u662F\u5426\u5EF6\u8FDF\u7F13\u5B58\u6E05\u7406\uFF08\u7528\u4E8E\u6279\u91CF\u64CD\u4F5C\uFF09\r\n */\r\n public addEntity(entity: Entity, deferCacheClear: boolean = false): void {\r\n if (!this.entities.includes(entity)) {\r\n this.entities.push(entity);\r\n this.addEntityToIndexes(entity);\r\n \r\n // \u53EA\u6709\u5728\u975E\u5EF6\u8FDF\u6A21\u5F0F\u4E0B\u624D\u7ACB\u5373\u6E05\u7406\u7F13\u5B58\r\n if (!deferCacheClear) {\r\n this.clearQueryCache();\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * \u6279\u91CF\u6DFB\u52A0\u5B9E\u4F53\r\n * \r\n * \u9AD8\u6548\u5730\u6279\u91CF\u6DFB\u52A0\u591A\u4E2A\u5B9E\u4F53\uFF0C\u51CF\u5C11\u7F13\u5B58\u6E05\u7406\u6B21\u6570\u3002\r\n * \u4F7F\u7528Set\u6765\u907F\u514DO(n)\u7684\u91CD\u590D\u68C0\u67E5\u3002\r\n * \r\n * @param entities \u8981\u6DFB\u52A0\u7684\u5B9E\u4F53\u5217\u8868\r\n */\r\n public addEntities(entities: Entity[]): void {\r\n if (entities.length === 0) return;\r\n \r\n // \u4F7F\u7528Set\u6765\u5FEB\u901F\u68C0\u67E5\u91CD\u590D\r\n const existingIds = new Set(this.entities.map(e => e.id));\r\n let addedCount = 0;\r\n \r\n for (const entity of entities) {\r\n if (!existingIds.has(entity.id)) {\r\n this.entities.push(entity);\r\n this.addEntityToIndexes(entity);\r\n existingIds.add(entity.id);\r\n addedCount++;\r\n }\r\n }\r\n \r\n // \u53EA\u5728\u6709\u5B9E\u4F53\u88AB\u6DFB\u52A0\u65F6\u624D\u6E05\u7406\u7F13\u5B58\r\n if (addedCount > 0) {\r\n this.clearQueryCache();\r\n }\r\n }\r\n\r\n /**\r\n * \u6279\u91CF\u6DFB\u52A0\u5B9E\u4F53\uFF08\u65E0\u91CD\u590D\u68C0\u67E5\u7248\u672C\uFF09\r\n * \r\n * \u5047\u8BBE\u6240\u6709\u5B9E\u4F53\u90FD\u662F\u65B0\u7684\uFF0C\u8DF3\u8FC7\u91CD\u590D\u68C0\u67E5\u4EE5\u83B7\u5F97\u6700\u5927\u6027\u80FD\u3002\r\n * \u4EC5\u5728\u786E\u4FDD\u6CA1\u6709\u91CD\u590D\u5B9E\u4F53\u65F6\u4F7F\u7528\u3002\r\n * \r\n * @param entities \u8981\u6DFB\u52A0\u7684\u5B9E\u4F53\u5217\u8868\r\n */\r\n public addEntitiesUnchecked(entities: Entity[]): void {\r\n if (entities.length === 0) return;\r\n \r\n // \u907F\u514D\u8C03\u7528\u6808\u6EA2\u51FA\uFF0C\u5206\u6279\u6DFB\u52A0\r\n for (const entity of entities) {\r\n this.entities.push(entity);\r\n }\r\n \r\n // \u6279\u91CF\u66F4\u65B0\u7D22\u5F15\r\n for (const entity of entities) {\r\n this.addEntityToIndexes(entity);\r\n }\r\n \r\n // \u6E05\u7406\u7F13\u5B58\r\n this.clearQueryCache();\r\n }\r\n\r\n /**\r\n * \u4ECE\u67E5\u8BE2\u7CFB\u7EDF\u79FB\u9664\u5B9E\u4F53\r\n * \r\n * \u4ECE\u67E5\u8BE2\u7CFB\u7EDF\u4E2D\u79FB\u9664\u6307\u5B9A\u5B9E\u4F53\uFF0C\u5E76\u6E05\u7406\u76F8\u5173\u7D22\u5F15\u3002\r\n * \r\n * @param entity \u8981\u79FB\u9664\u7684\u5B9E\u4F53\r\n */\r\n public removeEntity(entity: Entity): void {\r\n const index = this.entities.indexOf(entity);\r\n if (index !== -1) {\r\n this.entities.splice(index, 1);\r\n this.removeEntityFromIndexes(entity);\r\n this.clearQueryCache();\r\n }\r\n }\r\n\r\n /**\r\n * \u5C06\u5B9E\u4F53\u6DFB\u52A0\u5230\u5404\u79CD\u7D22\u5F15\u4E2D\uFF08\u4F18\u5316\u7248\u672C\uFF09\r\n */\r\n private addEntityToIndexes(entity: Entity): void {\r\n const mask = entity.componentMask;\r\n \r\n // \u7EC4\u4EF6\u63A9\u7801\u7D22\u5F15 - \u4F18\u5316Map\u64CD\u4F5C\r\n let maskSet = this.entityIndex.byMask.get(mask);\r\n if (!maskSet) {\r\n maskSet = new Set();\r\n this.entityIndex.byMask.set(mask, maskSet);\r\n }\r\n maskSet.add(entity);\r\n \r\n // \u7EC4\u4EF6\u7C7B\u578B\u7D22\u5F15 - \u6279\u91CF\u5904\u7406\r\n const components = entity.components;\r\n for (let i = 0; i < components.length; i++) {\r\n const componentType = components[i].constructor as ComponentType;\r\n let typeSet = this.entityIndex.byComponentType.get(componentType);\r\n if (!typeSet) {\r\n typeSet = new Set();\r\n this.entityIndex.byComponentType.set(componentType, typeSet);\r\n }\r\n typeSet.add(entity);\r\n }\r\n \r\n // \u6807\u7B7E\u7D22\u5F15 - \u53EA\u5728\u6709\u6807\u7B7E\u65F6\u5904\u7406\r\n const tag = entity.tag;\r\n if (tag !== undefined) {\r\n let tagSet = this.entityIndex.byTag.get(tag);\r\n if (!tagSet) {\r\n tagSet = new Set();\r\n this.entityIndex.byTag.set(tag, tagSet);\r\n }\r\n tagSet.add(entity);\r\n }\r\n \r\n // \u540D\u79F0\u7D22\u5F15 - \u53EA\u5728\u6709\u540D\u79F0\u65F6\u5904\u7406\r\n const name = entity.name;\r\n if (name) {\r\n let nameSet = this.entityIndex.byName.get(name);\r\n if (!nameSet) {\r\n nameSet = new Set();\r\n this.entityIndex.byName.set(name, nameSet);\r\n }\r\n nameSet.add(entity);\r\n }\r\n }\r\n\r\n /**\r\n * \u4ECE\u5404\u79CD\u7D22\u5F15\u4E2D\u79FB\u9664\u5B9E\u4F53\r\n */\r\n private removeEntityFromIndexes(entity: Entity): void {\r\n const mask = entity.componentMask;\r\n \r\n // \u4ECE\u7EC4\u4EF6\u63A9\u7801\u7D22\u5F15\u79FB\u9664\r\n const maskSet = this.entityIndex.byMask.get(mask);\r\n if (maskSet) {\r\n maskSet.delete(entity);\r\n if (maskSet.size === 0) {\r\n this.entityIndex.byMask.delete(mask);\r\n }\r\n }\r\n \r\n // \u4ECE\u7EC4\u4EF6\u7C7B\u578B\u7D22\u5F15\u79FB\u9664\r\n for (const component of entity.components) {\r\n const componentType = component.constructor as ComponentType;\r\n const typeSet = this.entityIndex.byComponentType.get(componentType);\r\n if (typeSet) {\r\n typeSet.delete(entity);\r\n if (typeSet.size === 0) {\r\n this.entityIndex.byComponentType.delete(componentType);\r\n }\r\n }\r\n }\r\n \r\n // \u4ECE\u6807\u7B7E\u7D22\u5F15\u79FB\u9664\r\n if (entity.tag !== undefined) {\r\n const tagSet = this.entityIndex.byTag.get(entity.tag);\r\n if (tagSet) {\r\n tagSet.delete(entity);\r\n if (tagSet.size === 0) {\r\n this.entityIndex.byTag.delete(entity.tag);\r\n }\r\n }\r\n }\r\n \r\n // \u4ECE\u540D\u79F0\u7D22\u5F15\u79FB\u9664\r\n if (entity.name) {\r\n const nameSet = this.entityIndex.byName.get(entity.name);\r\n if (nameSet) {\r\n nameSet.delete(entity);\r\n if (nameSet.size === 0) {\r\n this.entityIndex.byName.delete(entity.name);\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * \u91CD\u5EFA\u6240\u6709\u7D22\u5F15\r\n * \r\n * \u6E05\u7A7A\u5E76\u91CD\u65B0\u6784\u5EFA\u6240\u6709\u67E5\u8BE2\u7D22\u5F15\u3002\r\n * \u901A\u5E38\u5728\u5927\u91CF\u5B9E\u4F53\u53D8\u66F4\u540E\u8C03\u7528\u4EE5\u786E\u4FDD\u7D22\u5F15\u4E00\u81F4\u6027\u3002\r\n */\r\n private rebuildIndexes(): void {\r\n this.entityIndex.byMask.clear();\r\n this.entityIndex.byComponentType.clear();\r\n this.entityIndex.byTag.clear();\r\n this.entityIndex.byName.clear();\r\n \r\n for (const entity of this.entities) {\r\n this.addEntityToIndexes(entity);\r\n }\r\n \r\n this.indexDirty = false;\r\n }\r\n\r\n /**\r\n * \u67E5\u8BE2\u5305\u542B\u6240\u6709\u6307\u5B9A\u7EC4\u4EF6\u7684\u5B9E\u4F53\r\n * \r\n * \u8FD4\u56DE\u540C\u65F6\u5305\u542B\u6240\u6709\u6307\u5B9A\u7EC4\u4EF6\u7C7B\u578B\u7684\u5B9E\u4F53\u5217\u8868\u3002\r\n * \u7CFB\u7EDF\u4F1A\u81EA\u52A8\u9009\u62E9\u6700\u9AD8\u6548\u7684\u67E5\u8BE2\u7B56\u7565\uFF0C\u5305\u62EC\u7D22\u5F15\u67E5\u627E\u548C\u7F13\u5B58\u673A\u5236\u3002\r\n * \r\n * @param componentTypes \u8981\u67E5\u8BE2\u7684\u7EC4\u4EF6\u7C7B\u578B\u5217\u8868\r\n * @returns \u67E5\u8BE2\u7ED3\u679C\uFF0C\u5305\u542B\u5339\u914D\u7684\u5B9E\u4F53\u548C\u6027\u80FD\u4FE1\u606F\r\n * \r\n * @example\r\n * ```typescript\r\n * // \u67E5\u8BE2\u540C\u65F6\u5177\u6709\u4F4D\u7F6E\u548C\u901F\u5EA6\u7EC4\u4EF6\u7684\u5B9E\u4F53\r\n * const result = querySystem.queryAll(PositionComponent, VelocityComponent);\r\n * console.log(`\u627E\u5230 ${result.count} \u4E2A\u79FB\u52A8\u5B9E\u4F53`);\r\n * ```\r\n */\r\n public queryAll(...componentTypes: ComponentType[]): QueryResult {\r\n const startTime = performance.now();\r\n this.queryStats.totalQueries++;\r\n \r\n // \u751F\u6210\u7F13\u5B58\u952E\r\n const cacheKey = `all:${componentTypes.map(t => t.name).sort().join(',')}`;\r\n \r\n // \u68C0\u67E5\u7F13\u5B58\r\n const cached = this.getFromCache(cacheKey);\r\n if (cached) {\r\n this.queryStats.cacheHits++;\r\n return {\r\n entities: cached,\r\n count: cached.length,\r\n executionTime: performance.now() - startTime,\r\n fromCache: true\r\n };\r\n }\r\n \r\n let entities: Entity[];\r\n \r\n // \u5355\u7EC4\u4EF6\u67E5\u8BE2\uFF1A\u76F4\u63A5\u4F7F\u7528\u7D22\u5F15\r\n if (componentTypes.length === 1) {\r\n this.queryStats.indexHits++;\r\n entities = Array.from(this.entityIndex.byComponentType.get(componentTypes[0]) || []);\r\n } else {\r\n // \u591A\u7EC4\u4EF6\u67E5\u8BE2\uFF1A\u4F7F\u7528\u9AD8\u6548\u7B97\u6CD5\r\n entities = this.queryMultipleComponents(componentTypes);\r\n }\r\n \r\n // \u7F13\u5B58\u7ED3\u679C\r\n this.addToCache(cacheKey, entities);\r\n \r\n return {\r\n entities,\r\n count: entities.length,\r\n executionTime: performance.now() - startTime,\r\n fromCache: false\r\n };\r\n }\r\n\r\n /**\r\n * \u591A\u7EC4\u4EF6\u67E5\u8BE2\u7B97\u6CD5\r\n * \r\n * \u9488\u5BF9\u591A\u7EC4\u4EF6\u67E5\u8BE2\u573A\u666F\u7684\u9AD8\u6548\u7B97\u6CD5\u5B9E\u73B0\u3002\r\n * \u901A\u8FC7\u9009\u62E9\u6700\u5C0F\u7684\u7EC4\u4EF6\u96C6\u5408\u4F5C\u4E3A\u8D77\u70B9\uFF0C\u51CF\u5C11\u9700\u8981\u68C0\u67E5\u7684\u5B9E\u4F53\u6570\u91CF\u3002\r\n * \r\n * @param componentTypes \u7EC4\u4EF6\u7C7B\u578B\u5217\u8868\r\n * @returns \u5339\u914D\u7684\u5B9E\u4F53\u5217\u8868\r\n */\r\n private queryMultipleComponents(componentTypes: ComponentType[]): Entity[] {\r\n // \u627E\u5230\u6700\u5C0F\u7684\u7EC4\u4EF6\u96C6\u5408\u4F5C\u4E3A\u8D77\u70B9\r\n let smallestSet: Set<Entity> | null = null;\r\n let smallestSize = Infinity;\r\n \r\n for (const componentType of componentTypes) {\r\n const set = this.entityIndex.byComponentType.get(componentType);\r\n if (!set || set.size === 0) {\r\n return []; // \u5982\u679C\u4EFB\u4F55\u7EC4\u4EF6\u6CA1\u6709\u5B9E\u4F53\uFF0C\u76F4\u63A5\u8FD4\u56DE\u7A7A\u7ED3\u679C\r\n }\r\n if (set.size < smallestSize) {\r\n smallestSize = set.size;\r\n smallestSet = set;\r\n }\r\n }\r\n \r\n if (!smallestSet) {\r\n this.queryStats.linearScans++;\r\n return this.queryByLinearScan(componentTypes);\r\n }\r\n \r\n // \u4ECE\u6700\u5C0F\u96C6\u5408\u5F00\u59CB\uFF0C\u9010\u6B65\u8FC7\u6EE4\r\n const mask = this.createComponentMask(componentTypes);\r\n const result: Entity[] = [];\r\n \r\n for (const entity of smallestSet) {\r\n if ((entity.componentMask & mask) === mask) {\r\n result.push(entity);\r\n }\r\n }\r\n \r\n return result;\r\n }\r\n\r\n /**\r\n * \u7EBF\u6027\u626B\u63CF\u67E5\u8BE2\r\n * \r\n * \u5F53\u7D22\u5F15\u4E0D\u53EF\u7528\u65F6\u7684\u5907\u7528\u67E5\u8BE2\u65B9\u6CD5\u3002\r\n * \u904D\u5386\u6240\u6709\u5B9E\u4F53\u8FDB\u884C\u7EC4\u4EF6\u5339\u914D\u68C0\u67E5\u3002\r\n * \r\n * @param componentTypes \u7EC4\u4EF6\u7C7B\u578B\u5217\u8868\r\n * @returns \u5339\u914D\u7684\u5B9E\u4F53\u5217\u8868\r\n */\r\n private queryByLinearScan(componentTypes: ComponentType[]): Entity[] {\r\n const mask = this.createComponentMask(componentTypes);\r\n return this.entities.filter(entity => \r\n (entity.componentMask & mask) === mask\r\n );\r\n }\r\n\r\n /**\r\n * \u67E5\u8BE2\u5305\u542B\u4EFB\u610F\u6307\u5B9A\u7EC4\u4EF6\u7684\u5B9E\u4F53\r\n * \r\n * \u8FD4\u56DE\u5305\u542B\u4EFB\u610F\u4E00\u4E2A\u6307\u5B9A\u7EC4\u4EF6\u7C7B\u578B\u7684\u5B9E\u4F53\u5217\u8868\u3002\r\n * \u4F7F\u7528\u96C6\u5408\u5408\u5E76\u7B97\u6CD5\u786E\u4FDD\u9AD8\u6548\u7684\u67E5\u8BE2\u6027\u80FD\u3002\r\n * \r\n * @param componentTypes \u8981\u67E5\u8BE2\u7684\u7EC4\u4EF6\u7C7B\u578B\u5217\u8868\r\n * @returns \u67E5\u8BE2\u7ED3\u679C\uFF0C\u5305\u542B\u5339\u914D\u7684\u5B9E\u4F53\u548C\u6027\u80FD\u4FE1\u606F\r\n * \r\n * @example\r\n * ```typescript\r\n * // \u67E5\u8BE2\u5177\u6709\u6B66\u5668\u6216\u62A4\u7532\u7EC4\u4EF6\u7684\u5B9E\u4F53\r\n * const result = querySystem.queryAny(WeaponComponent, ArmorComponent);\r\n * console.log(`\u627E\u5230 ${result.count} \u4E2A\u88C5\u5907\u5B9E\u4F53`);\r\n * ```\r\n */\r\n public queryAny(...componentTypes: ComponentType[]): QueryResult {\r\n const startTime = performance.now();\r\n this.queryStats.totalQueries++;\r\n \r\n const cacheKey = `any:${componentTypes.map(t => t.name).sort().join(',')}`;\r\n \r\n // \u68C0\u67E5\u7F13\u5B58\r\n const cached = this.getFromCache(cacheKey);\r\n if (cached) {\r\n this.queryStats.cacheHits++;\r\n return {\r\n entities: cached,\r\n count: cached.length,\r\n executionTime: performance.now() - startTime,\r\n fromCache: true\r\n };\r\n }\r\n \r\n // \u4F7F\u7528\u96C6\u5408\u5408\u5E76\r\n const entitySet = new Set<Entity>();\r\n for (const componentType of componentTypes) {\r\n const typeEntities = this.entityIndex.byComponentType.get(componentType);\r\n if (typeEntities) {\r\n for (const entity of typeEntities) {\r\n entitySet.add(entity);\r\n }\r\n }\r\n }\r\n \r\n const entities = Array.from(entitySet);\r\n this.addToCache(cacheKey, entities);\r\n \r\n return {\r\n entities,\r\n count: entities.length,\r\n executionTime: performance.now() - startTime,\r\n fromCache: false\r\n };\r\n }\r\n\r\n /**\r\n * \u67E5\u8BE2\u4E0D\u5305\u542B\u4EFB\u4F55\u6307\u5B9A\u7EC4\u4EF6\u7684\u5B9E\u4F53\r\n * \r\n * \u8FD4\u56DE\u4E0D\u5305\u542B\u4EFB\u4F55\u6307\u5B9A\u7EC4\u4EF6\u7C7B\u578B\u7684\u5B9E\u4F53\u5217\u8868\u3002\r\n * \u9002\u7528\u4E8E\u6392\u9664\u7279\u5B9A\u7C7B\u578B\u5B9E\u4F53\u7684\u67E5\u8BE2\u573A\u666F\u3002\r\n * \r\n * @param componentTypes \u8981\u6392\u9664\u7684\u7EC4\u4EF6\u7C7B\u578B\u5217\u8868\r\n * @returns \u67E5\u8BE2\u7ED3\u679C\uFF0C\u5305\u542B\u5339\u914D\u7684\u5B9E\u4F53\u548C\u6027\u80FD\u4FE1\u606F\r\n * \r\n * @example\r\n * ```typescript\r\n * // \u67E5\u8BE2\u4E0D\u5177\u6709AI\u548C\u73A9\u5BB6\u63A7\u5236\u7EC4\u4EF6\u7684\u5B9E\u4F53\uFF08\u5982\u9759\u6001\u7269\u4F53\uFF09\r\n * const result = querySystem.queryNone(AIComponent, PlayerControlComponent);\r\n * console.log(`\u627E\u5230 ${result.count} \u4E2A\u9759\u6001\u5B9E\u4F53`);\r\n * ```\r\n */\r\n public queryNone(...componentTypes: ComponentType[]): QueryResult {\r\n const startTime = performance.now();\r\n this.queryStats.totalQueries++;\r\n \r\n const cacheKey = `none:${componentTypes.map(t => t.name).sort().join(',')}`;\r\n \r\n // \u68C0\u67E5\u7F13\u5B58\r\n const cached = this.getFromCache(cacheKey);\r\n if (cached) {\r\n this.queryStats.cacheHits++;\r\n return {\r\n entities: cached,\r\n count: cached.length,\r\n executionTime: performance.now() - startTime,\r\n fromCache: true\r\n };\r\n }\r\n \r\n const mask = this.createComponentMask(componentTypes);\r\n const entities = this.entities.filter(entity => \r\n (entity.componentMask & mask) === BigInt(0)\r\n );\r\n \r\n this.addToCache(cacheKey, entities);\r\n \r\n return {\r\n entities,\r\n count: entities.length,\r\n executionTime: performance.now() - startTime,\r\n fromCache: false\r\n };\r\n }\r\n\r\n /**\r\n * \u6309\u6807\u7B7E\u67E5\u8BE2\u5B9E\u4F53\r\n * \r\n * \u8FD4\u56DE\u5177\u6709\u6307\u5B9A\u6807\u7B7E\u7684\u6240\u6709\u5B9E\u4F53\u3002\r\n * \u6807\u7B7E\u67E5\u8BE2\u4F7F\u7528\u4E13\u7528\u7D22\u5F15\uFF0C\u5177\u6709\u5F88\u9AD8\u7684\u67E5\u8BE2\u6027\u80FD\u3002\r\n * \r\n * @param tag \u8981\u67E5\u8BE2\u7684\u6807\u7B7E\u503C\r\n * @returns \u67E5\u8BE2\u7ED3\u679C\uFF0C\u5305\u542B\u5339\u914D\u7684\u5B9E\u4F53\u548C\u6027\u80FD\u4FE1\u606F\r\n * \r\n * @example\r\n * ```typescript\r\n * // \u67E5\u8BE2\u6240\u6709\u73A9\u5BB6\u5B9E\u4F53\r\n * const players = querySystem.queryByTag(PLAYER_TAG);\r\n * ```\r\n */\r\n public queryByTag(tag: number): QueryResult {\r\n const startTime = performance.now();\r\n this.queryStats.totalQueries++;\r\n \r\n const cacheKey = `tag:${tag}`;\r\n \r\n // \u68C0\u67E5\u7F13\u5B58\r\n const cached = this.getFromCache(cacheKey);\r\n if (cached) {\r\n this.queryStats.cacheHits++;\r\n return {\r\n entities: cached,\r\n count: cached.length,\r\n executionTime: performance.now() - startTime,\r\n fromCache: true\r\n };\r\n }\r\n \r\n // \u4F7F\u7528\u7D22\u5F15\u67E5\u8BE2\r\n this.queryStats.indexHits++;\r\n const entities = Array.from(this.entityIndex.byTag.get(tag) || []);\r\n \r\n // \u7F13\u5B58\u7ED3\u679C\r\n this.addToCache(cacheKey, entities);\r\n \r\n return {\r\n entities,\r\n count: entities.length,\r\n executionTime: performance.now() - startTime,\r\n fromCache: false\r\n };\r\n }\r\n\r\n /**\r\n * \u6309\u540D\u79F0\u67E5\u8BE2\u5B9E\u4F53\r\n * \r\n * \u8FD4\u56DE\u5177\u6709\u6307\u5B9A\u540D\u79F0\u7684\u6240\u6709\u5B9E\u4F53\u3002\r\n * \u540D\u79F0\u67E5\u8BE2\u4F7F\u7528\u4E13\u7528\u7D22\u5F15\uFF0C\u9002\u7528\u4E8E\u67E5\u627E\u7279\u5B9A\u7684\u547D\u540D\u5B9E\u4F53\u3002\r\n * \r\n * @param name \u8981\u67E5\u8BE2\u7684\u5B9E\u4F53\u540D\u79F0\r\n * @returns \u67E5\u8BE2\u7ED3\u679C\uFF0C\u5305\u542B\u5339\u914D\u7684\u5B9E\u4F53\u548C\u6027\u80FD\u4FE1\u606F\r\n * \r\n * @example\r\n * ```typescript\r\n * // \u67E5\u627E\u540D\u4E3A\"Player\"\u7684\u5B9E\u4F53\r\n * const player = querySystem.queryByName(\"Player\");\r\n * ```\r\n */\r\n public queryByName(name: string): QueryResult {\r\n const startTime = performance.now();\r\n this.queryStats.totalQueries++;\r\n \r\n const cacheKey = `name:${name}`;\r\n \r\n // \u68C0\u67E5\u7F13\u5B58\r\n const cached = this.getFromCache(cacheKey);\r\n if (cached) {\r\n this.queryStats.cacheHits++;\r\n return {\r\n entities: cached,\r\n count: cached.length,\r\n executionTime: performance.now() - startTime,\r\n fromCache: true\r\n };\r\n }\r\n \r\n // \u4F7F\u7528\u7D22\u5F15\u67E5\u8BE2\r\n this.queryStats.indexHits++;\r\n const entities = Array.from(this.entityIndex.byName.get(name) || []);\r\n \r\n // \u7F13\u5B58\u7ED3\u679C\r\n this.addToCache(cacheKey, entities);\r\n \r\n return {\r\n entities,\r\n count: entities.length,\r\n executionTime: performance.now() - startTime,\r\n fromCache: false\r\n };\r\n }\r\n\r\n /**\r\n * \u6309\u5355\u4E2A\u7EC4\u4EF6\u7C7B\u578B\u67E5\u8BE2\u5B9E\u4F53\r\n * \r\n * \u8FD4\u56DE\u5305\u542B\u6307\u5B9A\u7EC4\u4EF6\u7C7B\u578B\u7684\u6240\u6709\u5B9E\u4F53\u3002\r\n * \u8FD9\u662F\u6700\u57FA\u7840\u7684\u67E5\u8BE2\u65B9\u6CD5\uFF0C\u5177\u6709\u6700\u9AD8\u7684\u67E5\u8BE2\u6027\u80FD\u3002\r\n * \r\n * @param componentType \u8981\u67E5\u8BE2\u7684\u7EC4\u4EF6\u7C7B\u578B\r\n * @returns \u67E5\u8BE2\u7ED3\u679C\uFF0C\u5305\u542B\u5339\u914D\u7684\u5B9E\u4F53\u548C\u6027\u80FD\u4FE1\u606F\r\n * \r\n * @example\r\n * ```typescript\r\n * // \u67E5\u8BE2\u6240\u6709\u5177\u6709\u4F4D\u7F6E\u7EC4\u4EF6\u7684\u5B9E\u4F53\r\n * const entitiesWithPosition = querySystem.queryByComponent(PositionComponent);\r\n * ```\r\n */\r\n public queryByComponent<T extends Component>(componentType: ComponentType<T>): QueryResult {\r\n const startTime = performance.now();\r\n this.queryStats.totalQueries++;\r\n \r\n const cacheKey = `component:${componentType.name}`;\r\n \r\n // \u68C0\u67E5\u7F13\u5B58\r\n const cached = this.getFromCache(cacheKey);\r\n if (cached) {\r\n this.queryStats.cacheHits++;\r\n return {\r\n entities: cached,\r\n count: cached.length,\r\n executionTime: performance.now() - startTime,\r\n fromCache: true\r\n };\r\n }\r\n \r\n // \u4F7F\u7528\u7D22\u5F15\u67E5\u8BE2\r\n this.queryStats.indexHits++;\r\n const entities = Array.from(this.entityIndex.byComponentType.get(componentType) || []);\r\n \r\n // \u7F13\u5B58\u7ED3\u679C\r\n this.addToCache(cacheKey, entities);\r\n \r\n return {\r\n entities,\r\n count: entities.length,\r\n executionTime: performance.now() - startTime,\r\n fromCache: false\r\n };\r\n }\r\n\r\n /**\r\n * \u4ECE\u7F13\u5B58\u83B7\u53D6\u67E5\u8BE2\u7ED3\u679C\r\n */\r\n private getFromCache(cacheKey: string): Entity[] | null {\r\n const entry = this.queryCache.get(cacheKey);\r\n if (!entry) return null;\r\n \r\n // \u68C0\u67E5\u7F13\u5B58\u662F\u5426\u8FC7\u671F\r\n if (Date.now() - entry.timestamp > this.cacheTimeout) {\r\n this.queryCache.delete(cacheKey);\r\n return null;\r\n }\r\n \r\n entry.hitCount++;\r\n return entry.entities;\r\n }\r\n\r\n /**\r\n * \u6DFB\u52A0\u67E5\u8BE2\u7ED3\u679C\u5230\u7F13\u5B58\r\n */\r\n private addToCache(cacheKey: string, entities: Entity[]): void {\r\n // \u5982\u679C\u7F13\u5B58\u5DF2\u6EE1\uFF0C\u6E05\u7406\u6700\u5C11\u4F7F\u7528\u7684\u6761\u76EE\r\n if (this.queryCache.size >= this.cacheMaxSize) {\r\n this.cleanupCache();\r\n }\r\n \r\n this.queryCache.set(cacheKey, {\r\n entities: [...entities], // \u590D\u5236\u6570\u7EC4\u907F\u514D\u5F15\u7528\u95EE\u9898\r\n timestamp: Date.now(),\r\n hitCount: 0\r\n });\r\n }\r\n\r\n /**\r\n * \u6E05\u7406\u7F13\u5B58\r\n */\r\n private cleanupCache(): void {\r\n // \u79FB\u9664\u8FC7\u671F\u7684\u7F13\u5B58\u6761\u76EE\r\n const now = Date.now();\r\n for (const [key, entry] of this.queryCache.entries()) {\r\n if (now - entry.timestamp > this.cacheTimeout) {\r\n this.queryCache.delete(key);\r\n }\r\n }\r\n \r\n // \u5982\u679C\u8FD8\u662F\u592A\u6EE1\uFF0C\u79FB\u9664\u6700\u5C11\u4F7F\u7528\u7684\u6761\u76EE\r\n if (this.queryCache.size >= this.cacheMaxSize) {\r\n const entries = Array.from(this.queryCache.entries());\r\n entries.sort((a, b) => a[1].hitCount - b[1].hitCount);\r\n \r\n const toRemove = Math.floor(this.cacheMaxSize * 0.2); // \u79FB\u966420%\r\n for (let i = 0; i < toRemove && i < entries.length; i++) {\r\n this.queryCache.delete(entries[i][0]);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * \u6E05\u9664\u6240\u6709\u67E5\u8BE2\u7F13\u5B58\r\n */\r\n private clearQueryCache(): void {\r\n this.queryCache.clear();\r\n }\r\n\r\n /**\r\n * \u516C\u5171\u65B9\u6CD5\uFF1A\u6E05\u7406\u67E5\u8BE2\u7F13\u5B58\r\n * \r\n * \u7528\u4E8E\u5916\u90E8\u8C03\u7528\u6E05\u7406\u7F13\u5B58\uFF0C\u901A\u5E38\u5728\u6279\u91CF\u64CD\u4F5C\u540E\u4F7F\u7528\u3002\r\n */\r\n public clearCache(): void {\r\n this.clearQueryCache();\r\n }\r\n\r\n /**\r\n * \u6279\u91CF\u66F4\u65B0\u5B9E\u4F53\u7EC4\u4EF6\r\n * \r\n * \u5BF9\u5927\u91CF\u5B9E\u4F53\u8FDB\u884C\u6279\u91CF\u7EC4\u4EF6\u66F4\u65B0\u64CD\u4F5C\u3002\r\n * \u5F53\u66F4\u65B0\u6570\u91CF\u8D85\u8FC7\u9608\u503C\u65F6\uFF0C\u7CFB\u7EDF\u4F1A\u81EA\u52A8\u4F7F\u7528WebAssembly\u52A0\u901F\u3002\r\n * \r\n * @param updates \u66F4\u65B0\u64CD\u4F5C\u5217\u8868\uFF0C\u5305\u542B\u5B9E\u4F53ID\u548C\u65B0\u7684\u7EC4\u4EF6\u63A9\u7801\r\n * \r\n * @example\r\n * ```typescript\r\n * // \u6279\u91CF\u66F4\u65B0\u5B9E\u4F53\u7684\u7EC4\u4EF6\u914D\u7F6E\r\n * const updates = [\r\n * { entityId: 1, componentMask: BigInt(0b1011) },\r\n * { entityId: 2, componentMask: BigInt(0b1101) }\r\n * ];\r\n * querySystem.batchUpdateComponents(updates);\r\n * ```\r\n */\r\n public batchUpdateComponents(updates: Array<{entityId: number, componentMask: bigint}>): void {\r\n if (this.wasmAvailable && updates.length > 100) {\r\n try {\r\n const entityIds = updates.map(u => u.entityId);\r\n const masks = updates.map(u => u.componentMask);\r\n ecsCore.batchUpdateMasks(entityIds, masks);\r\n console.log(`WebAssembly\u52A0\u901F\u6279\u91CF\u66F4\u65B0 ${updates.length} \u4E2A\u5B9E\u4F53`);\r\n } catch (error) {\r\n console.warn('WebAssembly\u6279\u91CF\u66F4\u65B0\u5931\u8D25\uFF0C\u56DE\u9000\u5230JavaScript\u5B9E\u73B0:', error);\r\n this.batchUpdateComponentsJS(updates);\r\n }\r\n } else {\r\n this.batchUpdateComponentsJS(updates);\r\n }\r\n \r\n // \u6279\u91CF\u66F4\u65B0\u540E\u6E05\u9664\u7F13\u5B58\r\n this.clearQueryCache();\r\n }\r\n\r\n /**\r\n * JavaScript\u5B9E\u73B0\u7684\u6279\u91CF\u66F4\u65B0\r\n */\r\n private batchUpdateComponentsJS(updates: Array<{entityId: number, componentMask: bigint}>): void {\r\n for (const update of updates) {\r\n const entity = this.entities.find(e => e.id === update.entityId);\r\n if (entity) {\r\n // \u6CE8\u610F\uFF1AcomponentMask\u662F\u53EA\u8BFB\u5C5E\u6027\uFF0C\u5B9E\u9645\u5E94\u7528\u4E2D\u9700\u8981\u901A\u8FC7\u6DFB\u52A0/\u79FB\u9664\u7EC4\u4EF6\u6765\u66F4\u65B0\r\n console.log(`\u66F4\u65B0\u5B9E\u4F53 ${update.entityId} \u7684\u7EC4\u4EF6\u63A9\u7801: ${update.componentMask}`);\r\n }\r\n }\r\n this.rebuildIndexes();\r\n }\r\n\r\n /**\r\n * \u83B7\u53D6\u52A0\u901F\u72B6\u6001\u4FE1\u606F\r\n * \r\n * \u8FD4\u56DE\u5F53\u524D\u67E5\u8BE2\u7CFB\u7EDF\u7684\u52A0\u901F\u72B6\u6001\u548C\u6027\u80FD\u4FE1\u606F\u3002\r\n * \u5305\u62ECWebAssembly\u53EF\u7528\u6027\u3001\u7F13\u5B58\u7EDF\u8BA1\u7B49\u8BE6\u7EC6\u4FE1\u606F\u3002\r\n * \r\n * @returns \u52A0\u901F\u72B6\u6001\u4FE1\u606F\u5BF9\u8C61\r\n */\r\n public getAccelerationStatus(): {\r\n wasmEnabled: boolean;\r\n currentProvider: string;\r\n availableProviders: string[];\r\n performanceInfo?: any;\r\n } {\r\n return {\r\n wasmEnabled: this.wasmAvailable,\r\n currentProvider: this.wasmAvailable ? 'hybrid' : 'javascript',\r\n availableProviders: ['javascript', 'hybrid'],\r\n performanceInfo: {\r\n entityCount: this.entities.length,\r\n wasmEnabled: this.wasmAvailable,\r\n cacheStats: {\r\n size: this.queryCache.size,\r\n hitRate: this.queryStats.totalQueries > 0 ? \r\n (this.queryStats.cacheHits / this.queryStats.totalQueries * 100).toFixed(2) + '%' : '0%'\r\n }\r\n }\r\n };\r\n }\r\n\r\n /**\r\n * \u5207\u6362\u52A0\u901F\u63D0\u4F9B\u8005\r\n * \r\n * \u517C\u5BB9\u6027\u63A5\u53E3\uFF0C\u4FDD\u6301\u5411\u540E\u517C\u5BB9\u3002\r\n * \u7CFB\u7EDF\u4F1A\u81EA\u52A8\u9009\u62E9\u6700\u4F73\u7684\u5B9E\u73B0\u65B9\u5F0F\u3002\r\n * \r\n * @param providerName \u63D0\u4F9B\u8005\u540D\u79F0\r\n * @returns \u662F\u5426\u5207\u6362\u6210\u529F\r\n */\r\n public async switchAccelerationProvider(providerName: string): Promise<boolean> {\r\n return true;\r\n }\r\n\r\n /**\r\n * \u521B\u5EFA\u7EC4\u4EF6\u63A9\u7801\r\n * \r\n * \u6839\u636E\u7EC4\u4EF6\u7C7B\u578B\u5217\u8868\u751F\u6210\u5BF9\u5E94\u7684\u4F4D\u63A9\u7801\u3002\r\n * \u4F7F\u7528\u4F4D\u63A9\u7801\u4F18\u5316\u5668\u8FDB\u884C\u7F13\u5B58\u548C\u9884\u8BA1\u7B97\u3002\r\n * \r\n * @param componentTypes \u7EC4\u4EF6\u7C7B\u578B\u5217\u8868\r\n * @returns \u751F\u6210\u7684\u4F4D\u63A9\u7801\r\n */\r\n private createComponentMask(componentTypes: ComponentType[]): bigint {\r\n // \u4F7F\u7528\u4F4D\u63A9\u7801\u4F18\u5316\u5668\u521B\u5EFA\u63A9\u7801\r\n const componentNames = componentTypes.map(type => type.name);\r\n \r\n // \u786E\u4FDD\u7EC4\u4EF6\u7C7B\u578B\u5DF2\u6CE8\u518C\u5230\u4F18\u5316\u5668\r\n for (const name of componentNames) {\r\n this.bitMaskOptimizer.registerComponentType(name);\r\n }\r\n \r\n return this.bitMaskOptimizer.createCombinedMask(componentNames);\r\n }\r\n\r\n /**\r\n * \u83B7\u53D6\u7CFB\u7EDF\u7EDF\u8BA1\u4FE1\u606F\r\n * \r\n * \u8FD4\u56DE\u67E5\u8BE2\u7CFB\u7EDF\u7684\u8BE6\u7EC6\u7EDF\u8BA1\u4FE1\u606F\uFF0C\u5305\u62EC\u5B9E\u4F53\u6570\u91CF\u3001\u7D22\u5F15\u72B6\u6001\u3001\r\n * \u67E5\u8BE2\u6027\u80FD\u7EDF\u8BA1\u7B49\uFF0C\u7528\u4E8E\u6027\u80FD\u76D1\u63A7\u548C\u8C03\u8BD5\u3002\r\n * \r\n * @returns \u7CFB\u7EDF\u7EDF\u8BA1\u4FE1\u606F\u5BF9\u8C61\r\n */\r\n public getStats(): {\r\n entityCount: number;\r\n indexStats: {\r\n maskIndexSize: number;\r\n componentIndexSize: number;\r\n tagIndexSize: number;\r\n nameIndexSize: number;\r\n };\r\n accelerationStatus: ReturnType<QuerySystem['getAccelerationStatus']>;\r\n queryStats: {\r\n totalQueries: number;\r\n cacheHits: number;\r\n indexHits: number;\r\n linearScans: number;\r\n cacheHitRate: string;\r\n };\r\n } {\r\n return {\r\n entityCount: this.entities.length,\r\n indexStats: {\r\n maskIndexSize: this.entityIndex.byMask.size,\r\n componentIndexSize: this.entityIndex.byComponentType.size,\r\n tagIndexSize: this.entityIndex.byTag.size,\r\n nameIndexSize: this.entityIndex.byName.size\r\n },\r\n accelerationStatus: this.getAccelerationStatus(),\r\n queryStats: {\r\n ...this.queryStats,\r\n cacheHitRate: this.queryStats.totalQueries > 0 ? \r\n (this.queryStats.cacheHits / this.queryStats.totalQueries * 100).toFixed(2) + '%' : '0%'\r\n }\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * \u67E5\u8BE2\u6784\u5EFA\u5668\r\n * \r\n * \u63D0\u4F9B\u94FE\u5F0FAPI\u6765\u6784\u5EFA\u590D\u6742\u7684\u5B9E\u4F53\u67E5\u8BE2\u6761\u4EF6\u3002\r\n * \u652F\u6301\u7EC4\u5408\u591A\u79CD\u67E5\u8BE2\u6761\u4EF6\uFF0C\u521B\u5EFA\u7075\u6D3B\u7684\u67E5\u8BE2\u8868\u8FBE\u5F0F\u3002\r\n * \r\n * @example\r\n * ```typescript\r\n * const result = new QueryBuilder(querySystem)\r\n * .withAll(PositionComponent, VelocityComponent)\r\n * .without(DeadComponent)\r\n * .execute();\r\n * ```\r\n */\r\nexport class QueryBuilder {\r\n private conditions: QueryCondition[] = [];\r\n private querySystem: QuerySystem;\r\n\r\n constructor(querySystem: QuerySystem) {\r\n this.querySystem = querySystem;\r\n }\r\n\r\n /**\r\n * \u6DFB\u52A0\"\u5FC5\u987B\u5305\u542B\u6240\u6709\u7EC4\u4EF6\"\u6761\u4EF6\r\n * \r\n * @param componentTypes \u5FC5\u987B\u5305\u542B\u7684\u7EC4\u4EF6\u7C7B\u578B\r\n * @returns \u67E5\u8BE2\u6784\u5EFA\u5668\u5B9E\u4F8B\uFF0C\u652F\u6301\u94FE\u5F0F\u8C03\u7528\r\n */\r\n public withAll(...componentTypes: ComponentType[]): QueryBuilder {\r\n this.conditions.push({\r\n type: QueryConditionType.ALL,\r\n componentTypes,\r\n mask: this.createComponentMask(componentTypes)\r\n });\r\n return this;\r\n }\r\n\r\n /**\r\n * \u6DFB\u52A0\"\u5FC5\u987B\u5305\u542B\u4EFB\u610F\u7EC4\u4EF6\"\u6761\u4EF6\r\n * \r\n * @param componentTypes \u5FC5\u987B\u5305\u542B\u5176\u4E2D\u4EFB\u610F\u4E00\u4E2A\u7684\u7EC4\u4EF6\u7C7B\u578B\r\n * @returns \u67E5\u8BE2\u6784\u5EFA\u5668\u5B9E\u4F8B\uFF0C\u652F\u6301\u94FE\u5F0F\u8C03\u7528\r\n */\r\n public withAny(...componentTypes: ComponentType[]): QueryBuilder {\r\n this.conditions.push({\r\n type: QueryConditionType.ANY,\r\n componentTypes,\r\n mask: this.createComponentMask(componentTypes)\r\n });\r\n return this;\r\n }\r\n\r\n /**\r\n * \u6DFB\u52A0\"\u4E0D\u80FD\u5305\u542B\u4EFB\u4F55\u7EC4\u4EF6\"\u6761\u4EF6\r\n * \r\n * @param componentTypes \u4E0D\u80FD\u5305\u542B\u7684\u7EC4\u4EF6\u7C7B\u578B\r\n * @returns \u67E5\u8BE2\u6784\u5EFA\u5668\u5B9E\u4F8B\uFF0C\u652F\u6301\u94FE\u5F0F\u8C03\u7528\r\n */\r\n public without(...componentTypes: ComponentType[]): QueryBuilder {\r\n this.conditions.push({\r\n type: QueryConditionType.NONE,\r\n componentTypes,\r\n mask: this.createComponentMask(componentTypes)\r\n });\r\n return this;\r\n }\r\n\r\n /**\r\n * \u6267\u884C\u67E5\u8BE2\u5E76\u8FD4\u56DE\u7ED3\u679C\r\n * \r\n * \u6839\u636E\u5DF2\u6DFB\u52A0\u7684\u67E5\u8BE2\u6761\u4EF6\u6267\u884C\u5B9E\u4F53\u67E5\u8BE2\u3002\r\n * \r\n * @returns \u67E5\u8BE2\u7ED3\u679C\uFF0C\u5305\u542B\u5339\u914D\u7684\u5B9E\u4F53\u548C\u6027\u80FD\u4FE1\u606F\r\n */\r\n public execute(): QueryResult {\r\n const startTime = performance.now();\r\n \r\n // \u7B80\u5316\u5B9E\u73B0\uFF1A\u76EE\u524D\u53EA\u652F\u6301\u5355\u4E00\u6761\u4EF6\r\n if (this.conditions.length === 1) {\r\n const condition = this.conditions[0];\r\n switch (condition.type) {\r\n case QueryConditionType.ALL:\r\n return this.querySystem.queryAll(...condition.componentTypes);\r\n case QueryConditionType.ANY:\r\n return this.querySystem.queryAny(...condition.componentTypes);\r\n case QueryConditionType.NONE:\r\n return this.querySystem.queryNone(...condition.componentTypes);\r\n }\r\n }\r\n \r\n // \u591A\u6761\u4EF6\u67E5\u8BE2\u7684\u590D\u6742\u5B9E\u73B0\u7559\u5F85\u540E\u7EED\u6269\u5C55\r\n return {\r\n entities: [],\r\n count: 0,\r\n executionTime: performance.now() - startTime,\r\n fromCache: false\r\n };\r\n }\r\n\r\n /**\r\n * \u521B\u5EFA\u7EC4\u4EF6\u63A9\u7801\r\n */\r\n private createComponentMask(componentTypes: ComponentType[]): bigint {\r\n let mask = BigInt(0);\r\n for (const type of componentTypes) {\r\n try {\r\n const bitMask = ComponentRegistry.getBitMask(type);\r\n mask |= bitMask;\r\n } catch (error) {\r\n console.warn(`\u7EC4\u4EF6\u7C7B\u578B ${type.name} \u672A\u6CE8\u518C\uFF0C\u8DF3\u8FC7`);\r\n }\r\n }\r\n return mask;\r\n }\r\n\r\n /**\r\n * \u91CD\u7F6E\u67E5\u8BE2\u6784\u5EFA\u5668\r\n * \r\n * \u6E05\u9664\u6240\u6709\u5DF2\u6DFB\u52A0\u7684\u67E5\u8BE2\u6761\u4EF6\uFF0C\u91CD\u65B0\u5F00\u59CB\u6784\u5EFA\u67E5\u8BE2\u3002\r\n * \r\n * @returns \u67E5\u8BE2\u6784\u5EFA\u5668\u5B9E\u4F8B\uFF0C\u652F\u6301\u94FE\u5F0F\u8C03\u7528\r\n */\r\n public reset(): QueryBuilder {\r\n this.conditions = [];\r\n return this;\r\n }\r\n} ", "/**\r\n * \u4E8B\u4EF6\u5904\u7406\u5668\u51FD\u6570\u7C7B\u578B\r\n */\r\nexport type EventHandler<T = any> = (event: T) => void;\r\n\r\n/**\r\n * \u5F02\u6B65\u4E8B\u4EF6\u5904\u7406\u5668\u51FD\u6570\u7C7B\u578B\r\n */\r\nexport type AsyncEventHandler<T = any> = (event: T) => Promise<void>;\r\n\r\n/**\r\n * \u4E8B\u4EF6\u76D1\u542C\u5668\u914D\u7F6E\r\n */\r\nexport interface EventListenerConfig {\r\n /** \u662F\u5426\u53EA\u6267\u884C\u4E00\u6B21 */\r\n once?: boolean;\r\n /** \u4F18\u5148\u7EA7\uFF08\u6570\u5B57\u8D8A\u5927\u4F18\u5148\u7EA7\u8D8A\u9AD8\uFF09 */\r\n priority?: number;\r\n /** \u662F\u5426\u5F02\u6B65\u6267\u884C */\r\n async?: boolean;\r\n /** \u6267\u884C\u4E0A\u4E0B\u6587 */\r\n context?: any;\r\n}\r\n\r\n/**\r\n * \u5185\u90E8\u4E8B\u4EF6\u76D1\u542C\u5668\r\n */\r\ninterface InternalEventListener<T = any> {\r\n handler: EventHandler<T> | AsyncEventHandler<T>;\r\n config: EventListenerConfig;\r\n id: string;\r\n}\r\n\r\n/**\r\n * \u4E8B\u4EF6\u7EDF\u8BA1\u4FE1\u606F\r\n */\r\nexport interface EventStats {\r\n /** \u4E8B\u4EF6\u7C7B\u578B */\r\n eventType: string;\r\n /** \u76D1\u542C\u5668\u6570\u91CF */\r\n listenerCount: number;\r\n /** \u89E6\u53D1\u6B21\u6570 */\r\n triggerCount: number;\r\n /** \u603B\u6267\u884C\u65F6\u95F4\uFF08\u6BEB\u79D2\uFF09 */\r\n totalExecutionTime: number;\r\n /** \u5E73\u5747\u6267\u884C\u65F6\u95F4\uFF08\u6BEB\u79D2\uFF09 */\r\n averageExecutionTime: number;\r\n /** \u6700\u540E\u89E6\u53D1\u65F6\u95F4 */\r\n lastTriggerTime: number;\r\n}\r\n\r\n/**\r\n * \u4E8B\u4EF6\u6279\u5904\u7406\u914D\u7F6E\r\n */\r\nexport interface EventBatchConfig {\r\n /** \u6279\u5904\u7406\u5927\u5C0F */\r\n batchSize: number;\r\n /** \u6279\u5904\u7406\u5EF6\u8FDF\uFF08\u6BEB\u79D2\uFF09 */\r\n delay: number;\r\n /** \u662F\u5426\u542F\u7528\u6279\u5904\u7406 */\r\n enabled: boolean;\r\n}\r\n\r\n/**\r\n * \u7C7B\u578B\u5B89\u5168\u7684\u9AD8\u6027\u80FD\u4E8B\u4EF6\u7CFB\u7EDF\r\n * \u652F\u6301\u540C\u6B65/\u5F02\u6B65\u4E8B\u4EF6\u3001\u4F18\u5148\u7EA7\u3001\u6279\u5904\u7406\u7B49\u529F\u80FD\r\n */\r\nexport class TypeSafeEventSystem {\r\n private listeners = new Map<string, InternalEventListener[]>();\r\n private stats = new Map<string, EventStats>();\r\n private batchQueue = new Map<string, any[]>();\r\n private batchTimers = new Map<string, number>();\r\n private batchConfigs = new Map<string, EventBatchConfig>();\r\n private nextListenerId = 0;\r\n private isEnabled = true;\r\n private maxListeners = 100; // \u6BCF\u4E2A\u4E8B\u4EF6\u7C7B\u578B\u7684\u6700\u5927\u76D1\u542C\u5668\u6570\u91CF\r\n\r\n /**\r\n * \u6DFB\u52A0\u4E8B\u4EF6\u76D1\u542C\u5668\r\n * @param eventType \u4E8B\u4EF6\u7C7B\u578B\r\n * @param handler \u4E8B\u4EF6\u5904\u7406\u5668\r\n * @param config \u76D1\u542C\u5668\u914D\u7F6E\r\n * @returns \u76D1\u542C\u5668ID\uFF08\u7528\u4E8E\u79FB\u9664\uFF09\r\n */\r\n public on<T>(\r\n eventType: string, \r\n handler: EventHandler<T>, \r\n config: EventListenerConfig = {}\r\n ): string {\r\n return this.addListener(eventType, handler, config);\r\n }\r\n\r\n /**\r\n * \u6DFB\u52A0\u4E00\u6B21\u6027\u4E8B\u4EF6\u76D1\u542C\u5668\r\n * @param eventType \u4E8B\u4EF6\u7C7B\u578B\r\n * @param handler \u4E8B\u4EF6\u5904\u7406\u5668\r\n * @param config \u76D1\u542C\u5668\u914D\u7F6E\r\n * @returns \u76D1\u542C\u5668ID\r\n */\r\n public once<T>(\r\n eventType: string, \r\n handler: EventHandler<T>, \r\n config: EventListenerConfig = {}\r\n ): string {\r\n return this.addListener(eventType, handler, { ...config, once: true });\r\n }\r\n\r\n /**\r\n * \u6DFB\u52A0\u5F02\u6B65\u4E8B\u4EF6\u76D1\u542C\u5668\r\n * @param eventType \u4E8B\u4EF6\u7C7B\u578B\r\n * @param handler \u5F02\u6B65\u4E8B\u4EF6\u5904\u7406\u5668\r\n * @param config \u76D1\u542C\u5668\u914D\u7F6E\r\n * @returns \u76D1\u542C\u5668ID\r\n */\r\n public onAsync<T>(\r\n eventType: string, \r\n handler: AsyncEventHandler<T>, \r\n config: EventListenerConfig = {}\r\n ): string {\r\n return this.addListener(eventType, handler, { ...config, async: true });\r\n }\r\n\r\n /**\r\n * \u79FB\u9664\u4E8B\u4EF6\u76D1\u542C\u5668\r\n * @param eventType \u4E8B\u4EF6\u7C7B\u578B\r\n * @param listenerId \u76D1\u542C\u5668ID\r\n * @returns \u662F\u5426\u6210\u529F\u79FB\u9664\r\n */\r\n public off(eventType: string, listenerId: string): boolean {\r\n const listeners = this.listeners.get(eventType);\r\n if (!listeners) return false;\r\n\r\n const index = listeners.findIndex(l => l.id === listenerId);\r\n if (index === -1) return false;\r\n\r\n listeners.splice(index, 1);\r\n \r\n // \u5982\u679C\u6CA1\u6709\u76D1\u542C\u5668\u4E86\uFF0C\u6E05\u7406\u76F8\u5173\u6570\u636E\r\n if (listeners.length === 0) {\r\n this.listeners.delete(eventType);\r\n this.stats.delete(eventType);\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * \u79FB\u9664\u6307\u5B9A\u4E8B\u4EF6\u7C7B\u578B\u7684\u6240\u6709\u76D1\u542C\u5668\r\n * @param eventType \u4E8B\u4EF6\u7C7B\u578B\r\n */\r\n public offAll(eventType: string): void {\r\n this.listeners.delete(eventType);\r\n this.stats.delete(eventType);\r\n this.clearBatch(eventType);\r\n }\r\n\r\n /**\r\n * \u89E6\u53D1\u4E8B\u4EF6\r\n * @param eventType \u4E8B\u4EF6\u7C7B\u578B\r\n * @param event \u4E8B\u4EF6\u6570\u636E\r\n * @returns Promise\uFF08\u5982\u679C\u6709\u5F02\u6B65\u76D1\u542C\u5668\uFF09\r\n */\r\n public async emit<T>(eventType: string, event: T): Promise<void> {\r\n if (!this.isEnabled) return;\r\n\r\n // \u68C0\u67E5\u662F\u5426\u542F\u7528\u4E86\u6279\u5904\u7406\r\n const batchConfig = this.batchConfigs.get(eventType);\r\n if (batchConfig?.enabled) {\r\n this.addToBatch(eventType, event);\r\n return;\r\n }\r\n\r\n await this.executeEvent(eventType, event);\r\n }\r\n\r\n /**\r\n * \u540C\u6B65\u89E6\u53D1\u4E8B\u4EF6\uFF08\u5FFD\u7565\u5F02\u6B65\u76D1\u542C\u5668\uFF09\r\n * @param eventType \u4E8B\u4EF6\u7C7B\u578B\r\n * @param event \u4E8B\u4EF6\u6570\u636E\r\n */\r\n public emitSync<T>(eventType: string, event: T): void {\r\n if (!this.isEnabled) return;\r\n\r\n const listeners = this.listeners.get(eventType);\r\n if (!listeners || listeners.length === 0) return;\r\n\r\n const startTime = performance.now();\r\n const toRemove: string[] = [];\r\n\r\n // \u6309\u4F18\u5148\u7EA7\u6392\u5E8F\r\n const sortedListeners = this.sortListenersByPriority(listeners);\r\n\r\n for (const listener of sortedListeners) {\r\n if (listener.config.async) continue; // \u8DF3\u8FC7\u5F02\u6B65\u76D1\u542C\u5668\r\n\r\n try {\r\n if (listener.config.context) {\r\n (listener.handler as EventHandler<T>).call(listener.config.context, event);\r\n } else {\r\n (listener.handler as EventHandler<T>)(event);\r\n }\r\n\r\n if (listener.config.once) {\r\n toRemove.push(listener.id);\r\n }\r\n } catch (error) {\r\n console.error(`Error in event handler for ${eventType}:`, error);\r\n }\r\n }\r\n\r\n // \u79FB\u9664\u4E00\u6B21\u6027\u76D1\u542C\u5668\r\n this.removeListeners(eventType, toRemove);\r\n\r\n // \u66F4\u65B0\u7EDF\u8BA1\u4FE1\u606F\r\n this.updateStats(eventType, performance.now() - startTime);\r\n }\r\n\r\n /**\r\n * \u8BBE\u7F6E\u4E8B\u4EF6\u6279\u5904\u7406\u914D\u7F6E\r\n * @param eventType \u4E8B\u4EF6\u7C7B\u578B\r\n * @param config \u6279\u5904\u7406\u914D\u7F6E\r\n */\r\n public setBatchConfig(eventType: string, config: EventBatchConfig): void {\r\n this.batchConfigs.set(eventType, config);\r\n }\r\n\r\n /**\r\n * \u7ACB\u5373\u5904\u7406\u6307\u5B9A\u4E8B\u4EF6\u7C7B\u578B\u7684\u6279\u5904\u7406\u961F\u5217\r\n * @param eventType \u4E8B\u4EF6\u7C7B\u578B\r\n */\r\n public flushBatch(eventType: string): void {\r\n const batch = this.batchQueue.get(eventType);\r\n if (!batch || batch.length === 0) return;\r\n\r\n // \u6E05\u9664\u5B9A\u65F6\u5668\r\n const timer = this.batchTimers.get(eventType);\r\n if (timer) {\r\n clearTimeout(timer);\r\n this.batchTimers.delete(eventType);\r\n }\r\n\r\n // \u5904\u7406\u6279\u5904\u7406\u4E8B\u4EF6\r\n this.processBatch(eventType, batch);\r\n \r\n // \u6E05\u7A7A\u961F\u5217\r\n this.batchQueue.delete(eventType);\r\n }\r\n\r\n /**\r\n * \u83B7\u53D6\u4E8B\u4EF6\u7EDF\u8BA1\u4FE1\u606F\r\n * @param eventType \u4E8B\u4EF6\u7C7B\u578B\uFF08\u53EF\u9009\uFF09\r\n * @returns \u7EDF\u8BA1\u4FE1\u606F\r\n */\r\n public getStats(eventType?: string): EventStats | Map<string, EventStats> {\r\n if (eventType) {\r\n return this.stats.get(eventType) || this.createEmptyStats(eventType);\r\n }\r\n return new Map(this.stats);\r\n }\r\n\r\n /**\r\n * \u91CD\u7F6E\u7EDF\u8BA1\u4FE1\u606F\r\n * @param eventType \u4E8B\u4EF6\u7C7B\u578B\uFF08\u53EF\u9009\uFF0C\u4E0D\u6307\u5B9A\u5219\u91CD\u7F6E\u6240\u6709\uFF09\r\n */\r\n public resetStats(eventType?: string): void {\r\n if (eventType) {\r\n this.stats.delete(eventType);\r\n } else {\r\n this.stats.clear();\r\n }\r\n }\r\n\r\n /**\r\n * \u542F\u7528/\u7981\u7528\u4E8B\u4EF6\u7CFB\u7EDF\r\n * @param enabled \u662F\u5426\u542F\u7528\r\n */\r\n public setEnabled(enabled: boolean): void {\r\n this.isEnabled = enabled;\r\n }\r\n\r\n /**\r\n * \u68C0\u67E5\u662F\u5426\u6709\u6307\u5B9A\u4E8B\u4EF6\u7C7B\u578B\u7684\u76D1\u542C\u5668\r\n * @param eventType \u4E8B\u4EF6\u7C7B\u578B\r\n * @returns \u662F\u5426\u6709\u76D1\u542C\u5668\r\n */\r\n public hasListeners(eventType: string): boolean {\r\n const listeners = this.listeners.get(eventType);\r\n return listeners ? listeners.length > 0 : false;\r\n }\r\n\r\n /**\r\n * \u83B7\u53D6\u6307\u5B9A\u4E8B\u4EF6\u7C7B\u578B\u7684\u76D1\u542C\u5668\u6570\u91CF\r\n * @param eventType \u4E8B\u4EF6\u7C7B\u578B\r\n * @returns \u76D1\u542C\u5668\u6570\u91CF\r\n */\r\n public getListenerCount(eventType: string): number {\r\n const listeners = this.listeners.get(eventType);\r\n return listeners ? listeners.length : 0;\r\n }\r\n\r\n /**\r\n * \u6E05\u7A7A\u6240\u6709\u4E8B\u4EF6\u76D1\u542C\u5668\u548C\u6570\u636E\r\n */\r\n public clear(): void {\r\n this.listeners.clear();\r\n this.stats.clear();\r\n this.clearAllBatches();\r\n }\r\n\r\n /**\r\n * \u8BBE\u7F6E\u6BCF\u4E2A\u4E8B\u4EF6\u7C7B\u578B\u7684\u6700\u5927\u76D1\u542C\u5668\u6570\u91CF\r\n * @param max \u6700\u5927\u6570\u91CF\r\n */\r\n public setMaxListeners(max: number): void {\r\n this.maxListeners = max;\r\n }\r\n\r\n /**\r\n * \u6DFB\u52A0\u76D1\u542C\u5668\u7684\u5185\u90E8\u5B9E\u73B0\r\n * @param eventType \u4E8B\u4EF6\u7C7B\u578B\r\n * @param handler \u4E8B\u4EF6\u5904\u7406\u5668\r\n * @param config \u914D\u7F6E\r\n * @returns \u76D1\u542C\u5668ID\r\n */\r\n private addListener<T>(\r\n eventType: string, \r\n handler: EventHandler<T> | AsyncEventHandler<T>, \r\n config: EventListenerConfig\r\n ): string {\r\n let listeners = this.listeners.get(eventType);\r\n \r\n if (!listeners) {\r\n listeners = [];\r\n this.listeners.set(eventType, listeners);\r\n }\r\n\r\n // \u68C0\u67E5\u76D1\u542C\u5668\u6570\u91CF\u9650\u5236\r\n if (listeners.length >= this.maxListeners) {\r\n console.warn(`Maximum listeners (${this.maxListeners}) exceeded for event type: ${eventType}`);\r\n return '';\r\n }\r\n\r\n const listenerId = `listener_${this.nextListenerId++}`;\r\n const listener: InternalEventListener<T> = {\r\n handler,\r\n config: {\r\n priority: 0,\r\n ...config\r\n },\r\n id: listenerId\r\n };\r\n\r\n listeners.push(listener);\r\n\r\n // \u521D\u59CB\u5316\u7EDF\u8BA1\u4FE1\u606F\r\n if (!this.stats.has(eventType)) {\r\n this.stats.set(eventType, this.createEmptyStats(eventType));\r\n }\r\n\r\n return listenerId;\r\n }\r\n\r\n /**\r\n * \u6267\u884C\u4E8B\u4EF6\u7684\u5185\u90E8\u5B9E\u73B0\r\n * @param eventType \u4E8B\u4EF6\u7C7B\u578B\r\n * @param event \u4E8B\u4EF6\u6570\u636E\r\n */\r\n private async executeEvent<T>(eventType: string, event: T): Promise<void> {\r\n const listeners = this.listeners.get(eventType);\r\n if (!listeners || listeners.length === 0) return;\r\n\r\n const startTime = performance.now();\r\n const toRemove: string[] = [];\r\n\r\n // \u6309\u4F18\u5148\u7EA7\u6392\u5E8F\r\n const sortedListeners = this.sortListenersByPriority(listeners);\r\n\r\n // \u5206\u79BB\u540C\u6B65\u548C\u5F02\u6B65\u76D1\u542C\u5668\r\n const syncListeners = sortedListeners.filter(l => !l.config.async);\r\n const asyncListeners = sortedListeners.filter(l => l.config.async);\r\n\r\n // \u6267\u884C\u540C\u6B65\u76D1\u542C\u5668\r\n for (const listener of syncListeners) {\r\n try {\r\n if (listener.config.context) {\r\n (listener.handler as EventHandler<T>).call(listener.config.context, event);\r\n } else {\r\n (listener.handler as EventHandler<T>)(event);\r\n }\r\n\r\n if (listener.config.once) {\r\n toRemove.push(listener.id);\r\n }\r\n } catch (error) {\r\n console.error(`Error in sync event handler for ${eventType}:`, error);\r\n }\r\n }\r\n\r\n // \u6267\u884C\u5F02\u6B65\u76D1\u542C\u5668\r\n const asyncPromises = asyncListeners.map(async (listener) => {\r\n try {\r\n if (listener.config.context) {\r\n await (listener.handler as AsyncEventHandler<T>).call(listener.config.context, event);\r\n } else {\r\n await (listener.handler as AsyncEventHandler<T>)(event);\r\n }\r\n\r\n if (listener.config.once) {\r\n toRemove.push(listener.id);\r\n }\r\n } catch (error) {\r\n console.error(`Error in async event handler for ${eventType}:`, error);\r\n }\r\n });\r\n\r\n // \u7B49\u5F85\u6240\u6709\u5F02\u6B65\u76D1\u542C\u5668\u5B8C\u6210\r\n await Promise.all(asyncPromises);\r\n\r\n // \u79FB\u9664\u4E00\u6B21\u6027\u76D1\u542C\u5668\r\n this.removeListeners(eventType, toRemove);\r\n\r\n // \u66F4\u65B0\u7EDF\u8BA1\u4FE1\u606F\r\n this.updateStats(eventType, performance.now() - startTime);\r\n }\r\n\r\n /**\r\n * \u6309\u4F18\u5148\u7EA7\u6392\u5E8F\u76D1\u542C\u5668\r\n * @param listeners \u76D1\u542C\u5668\u6570\u7EC4\r\n * @returns \u6392\u5E8F\u540E\u7684\u76D1\u542C\u5668\u6570\u7EC4\r\n */\r\n private sortListenersByPriority<T>(listeners: InternalEventListener<T>[]): InternalEventListener<T>[] {\r\n return listeners.slice().sort((a, b) => (b.config.priority || 0) - (a.config.priority || 0));\r\n }\r\n\r\n /**\r\n * \u79FB\u9664\u6307\u5B9A\u7684\u76D1\u542C\u5668\r\n * @param eventType \u4E8B\u4EF6\u7C7B\u578B\r\n * @param listenerIds \u8981\u79FB\u9664\u7684\u76D1\u542C\u5668ID\u6570\u7EC4\r\n */\r\n private removeListeners(eventType: string, listenerIds: string[]): void {\r\n if (listenerIds.length === 0) return;\r\n\r\n const listeners = this.listeners.get(eventType);\r\n if (!listeners) return;\r\n\r\n for (const id of listenerIds) {\r\n const index = listeners.findIndex(l => l.id === id);\r\n if (index !== -1) {\r\n listeners.splice(index, 1);\r\n }\r\n }\r\n\r\n // \u5982\u679C\u6CA1\u6709\u76D1\u542C\u5668\u4E86\uFF0C\u6E05\u7406\u76F8\u5173\u6570\u636E\r\n if (listeners.length === 0) {\r\n this.listeners.delete(eventType);\r\n this.stats.delete(eventType);\r\n }\r\n }\r\n\r\n /**\r\n * \u6DFB\u52A0\u4E8B\u4EF6\u5230\u6279\u5904\u7406\u961F\u5217\r\n * @param eventType \u4E8B\u4EF6\u7C7B\u578B\r\n * @param event \u4E8B\u4EF6\u6570\u636E\r\n */\r\n private addToBatch<T>(eventType: string, event: T): void {\r\n let batch = this.batchQueue.get(eventType);\r\n if (!batch) {\r\n batch = [];\r\n this.batchQueue.set(eventType, batch);\r\n }\r\n\r\n batch.push(event);\r\n\r\n const config = this.batchConfigs.get(eventType)!;\r\n \r\n // \u5982\u679C\u8FBE\u5230\u6279\u5904\u7406\u5927\u5C0F\uFF0C\u7ACB\u5373\u5904\u7406\r\n if (batch.length >= config.batchSize) {\r\n this.flushBatch(eventType);\r\n return;\r\n }\r\n\r\n // \u8BBE\u7F6E\u5EF6\u8FDF\u5904\u7406\u5B9A\u65F6\u5668\r\n if (!this.batchTimers.has(eventType)) {\r\n const timer = setTimeout(() => {\r\n this.flushBatch(eventType);\r\n }, config.delay);\r\n \r\n this.batchTimers.set(eventType, timer as any);\r\n }\r\n }\r\n\r\n /**\r\n * \u5904\u7406\u6279\u5904\u7406\u4E8B\u4EF6\r\n * @param eventType \u4E8B\u4EF6\u7C7B\u578B\r\n * @param batch \u6279\u5904\u7406\u4E8B\u4EF6\u6570\u7EC4\r\n */\r\n private async processBatch<T>(eventType: string, batch: T[]): Promise<void> {\r\n // \u521B\u5EFA\u6279\u5904\u7406\u4E8B\u4EF6\u5BF9\u8C61\r\n const batchEvent = {\r\n type: eventType,\r\n events: batch,\r\n count: batch.length,\r\n timestamp: Date.now()\r\n };\r\n\r\n // \u89E6\u53D1\u6279\u5904\u7406\u4E8B\u4EF6\r\n await this.executeEvent(`${eventType}:batch`, batchEvent);\r\n }\r\n\r\n /**\r\n * \u6E05\u9664\u6307\u5B9A\u4E8B\u4EF6\u7C7B\u578B\u7684\u6279\u5904\u7406\r\n * @param eventType \u4E8B\u4EF6\u7C7B\u578B\r\n */\r\n private clearBatch(eventType: string): void {\r\n this.batchQueue.delete(eventType);\r\n \r\n const timer = this.batchTimers.get(eventType);\r\n if (timer) {\r\n clearTimeout(timer);\r\n this.batchTimers.delete(eventType);\r\n }\r\n }\r\n\r\n /**\r\n * \u6E05\u9664\u6240\u6709\u6279\u5904\u7406\r\n */\r\n private clearAllBatches(): void {\r\n this.batchQueue.clear();\r\n \r\n for (const timer of this.batchTimers.values()) {\r\n clearTimeout(timer);\r\n }\r\n this.batchTimers.clear();\r\n this.batchConfigs.clear();\r\n }\r\n\r\n /**\r\n * \u66F4\u65B0\u4E8B\u4EF6\u7EDF\u8BA1\u4FE1\u606F\r\n * @param eventType \u4E8B\u4EF6\u7C7B\u578B\r\n * @param executionTime \u6267\u884C\u65F6\u95F4\r\n */\r\n private updateStats(eventType: string, executionTime: number): void {\r\n let stats = this.stats.get(eventType);\r\n if (!stats) {\r\n stats = this.createEmptyStats(eventType);\r\n this.stats.set(eventType, stats);\r\n }\r\n\r\n stats.triggerCount++;\r\n stats.totalExecutionTime += executionTime;\r\n stats.averageExecutionTime = stats.totalExecutionTime / stats.triggerCount;\r\n stats.lastTriggerTime = Date.now();\r\n stats.listenerCount = this.getListenerCount(eventType);\r\n }\r\n\r\n /**\r\n * \u521B\u5EFA\u7A7A\u7684\u7EDF\u8BA1\u4FE1\u606F\r\n * @param eventType \u4E8B\u4EF6\u7C7B\u578B\r\n * @returns \u7A7A\u7684\u7EDF\u8BA1\u4FE1\u606F\r\n */\r\n private createEmptyStats(eventType: string): EventStats {\r\n return {\r\n eventType,\r\n listenerCount: 0,\r\n triggerCount: 0,\r\n totalExecutionTime: 0,\r\n averageExecutionTime: 0,\r\n lastTriggerTime: 0\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * \u5168\u5C40\u4E8B\u4EF6\u7CFB\u7EDF\u5B9E\u4F8B\r\n */\r\nexport const GlobalEventSystem = new TypeSafeEventSystem();\r\n\r\n/**\r\n * \u4E8B\u4EF6\u88C5\u9970\u5668 - \u7528\u4E8E\u81EA\u52A8\u6CE8\u518C\u4E8B\u4EF6\u76D1\u542C\u5668\r\n * @param eventType \u4E8B\u4EF6\u7C7B\u578B\r\n * @param config \u76D1\u542C\u5668\u914D\u7F6E\r\n */\r\nexport function EventListener(eventType: string, config: EventListenerConfig = {}) {\r\n return function (target: any, propertyKey: string, descriptor: PropertyDescriptor) {\r\n const originalMethod = descriptor.value;\r\n \r\n // \u5728\u7C7B\u5B9E\u4F8B\u5316\u65F6\u81EA\u52A8\u6CE8\u518C\u76D1\u542C\u5668\r\n const initMethod = target.constructor.prototype.initEventListeners || function() {};\r\n target.constructor.prototype.initEventListeners = function() {\r\n initMethod.call(this);\r\n GlobalEventSystem.on(eventType, originalMethod.bind(this), config);\r\n };\r\n };\r\n}\r\n\r\n/**\r\n * \u5F02\u6B65\u4E8B\u4EF6\u88C5\u9970\u5668\r\n * @param eventType \u4E8B\u4EF6\u7C7B\u578B\r\n * @param config \u76D1\u542C\u5668\u914D\u7F6E\r\n */\r\nexport function AsyncEventListener(eventType: string, config: EventListenerConfig = {}) {\r\n return function (target: any, propertyKey: string, descriptor: PropertyDescriptor) {\r\n const originalMethod = descriptor.value;\r\n \r\n const initMethod = target.constructor.prototype.initEventListeners || function() {};\r\n target.constructor.prototype.initEventListeners = function() {\r\n initMethod.call(this);\r\n GlobalEventSystem.onAsync(eventType, originalMethod.bind(this), config);\r\n };\r\n };\r\n} ", "import { Entity } from './Entity';\r\nimport { EntityList } from './Utils/EntityList';\r\nimport { EntityProcessorList } from './Utils/EntityProcessorList';\r\nimport { IdentifierPool } from './Utils/IdentifierPool';\r\nimport { EntitySystem } from './Systems/EntitySystem';\r\nimport { ComponentStorageManager } from './Core/ComponentStorage';\r\nimport { QuerySystem } from './Core/QuerySystem';\r\nimport { TypeSafeEventSystem, GlobalEventSystem } from './Core/EventSystem';\r\n\r\n/**\r\n * \u6E38\u620F\u573A\u666F\u7C7B\r\n * \r\n * \u7BA1\u7406\u6E38\u620F\u573A\u666F\u4E2D\u7684\u6240\u6709\u5B9E\u4F53\u548C\u7CFB\u7EDF\uFF0C\u63D0\u4F9B\u573A\u666F\u751F\u547D\u5468\u671F\u7BA1\u7406\u3002\r\n * \u573A\u666F\u662F\u6E38\u620F\u4E16\u754C\u7684\u5BB9\u5668\uFF0C\u8D1F\u8D23\u534F\u8C03\u5B9E\u4F53\u548C\u7CFB\u7EDF\u7684\u8FD0\u884C\u3002\r\n * \r\n * @example\r\n * ```typescript\r\n * class GameScene extends Scene {\r\n * public initialize(): void {\r\n * // \u521B\u5EFA\u6E38\u620F\u5B9E\u4F53\r\n * const player = this.createEntity(\"Player\");\r\n * \r\n * // \u6DFB\u52A0\u7CFB\u7EDF\r\n * this.addEntityProcessor(new MovementSystem());\r\n * }\r\n * }\r\n * ```\r\n */\r\nexport class Scene {\r\n /**\r\n * \u573A\u666F\u540D\u79F0\r\n * \r\n * \u7528\u4E8E\u6807\u8BC6\u548C\u8C03\u8BD5\u7684\u53CB\u597D\u540D\u79F0\u3002\r\n */\r\n public name: string = \"\";\r\n\r\n /**\r\n * \u573A\u666F\u4E2D\u7684\u5B9E\u4F53\u96C6\u5408\r\n * \r\n * \u7BA1\u7406\u573A\u666F\u5185\u6240\u6709\u5B9E\u4F53\u7684\u751F\u547D\u5468\u671F\u3002\r\n */\r\n public readonly entities: EntityList;\r\n \r\n /**\r\n * \u5B9E\u4F53\u7CFB\u7EDF\u5904\u7406\u5668\u96C6\u5408\r\n * \r\n * \u7BA1\u7406\u573A\u666F\u5185\u6240\u6709\u5B9E\u4F53\u7CFB\u7EDF\u7684\u6267\u884C\u3002\r\n */\r\n public readonly entityProcessors: EntityProcessorList;\r\n\r\n /**\r\n * \u5B9E\u4F53ID\u6C60\r\n * \r\n * \u7528\u4E8E\u5206\u914D\u548C\u56DE\u6536\u5B9E\u4F53\u7684\u552F\u4E00\u6807\u8BC6\u7B26\u3002\r\n */\r\n public readonly identifierPool: IdentifierPool;\r\n\r\n /**\r\n * \u7EC4\u4EF6\u5B58\u50A8\u7BA1\u7406\u5668\r\n * \r\n * \u9AD8\u6027\u80FD\u7684\u7EC4\u4EF6\u5B58\u50A8\u548C\u67E5\u8BE2\u7CFB\u7EDF\u3002\r\n */\r\n public readonly componentStorageManager: ComponentStorageManager;\r\n\r\n /**\r\n * \u67E5\u8BE2\u7CFB\u7EDF\r\n * \r\n * \u57FA\u4E8E\u4F4D\u63A9\u7801\u7684\u9AD8\u6027\u80FD\u5B9E\u4F53\u67E5\u8BE2\u7CFB\u7EDF\u3002\r\n */\r\n public readonly querySystem: QuerySystem;\r\n\r\n /**\r\n * \u4E8B\u4EF6\u7CFB\u7EDF\r\n * \r\n * \u7C7B\u578B\u5B89\u5168\u7684\u4E8B\u4EF6\u7CFB\u7EDF\u3002\r\n */\r\n public readonly eventSystem: TypeSafeEventSystem;\r\n \r\n /**\r\n * \u573A\u666F\u662F\u5426\u5DF2\u5F00\u59CB\u8FD0\u884C\r\n */\r\n private _didSceneBegin: boolean = false;\r\n\r\n /**\r\n * \u83B7\u53D6\u7CFB\u7EDF\u5217\u8868\uFF08\u517C\u5BB9\u6027\u5C5E\u6027\uFF09\r\n */\r\n public get systems(): EntitySystem[] {\r\n return this.entityProcessors.processors;\r\n }\r\n\r\n /**\r\n * \u521B\u5EFA\u573A\u666F\u5B9E\u4F8B\r\n * @param enableWasmAcceleration \u662F\u5426\u542F\u7528WebAssembly\u52A0\u901F\uFF0C\u9ED8\u8BA4\u4E3Atrue\r\n */\r\n constructor(enableWasmAcceleration: boolean = true) {\r\n this.entities = new EntityList(this);\r\n this.entityProcessors = new EntityProcessorList();\r\n this.identifierPool = new IdentifierPool();\r\n this.componentStorageManager = new ComponentStorageManager();\r\n this.querySystem = new QuerySystem();\r\n this.eventSystem = new TypeSafeEventSystem();\r\n\r\n this.initialize();\r\n }\r\n\r\n /**\r\n * \u521D\u59CB\u5316\u573A\u666F\r\n * \r\n * \u5728\u573A\u666F\u521B\u5EFA\u65F6\u8C03\u7528\uFF0C\u5B50\u7C7B\u53EF\u4EE5\u91CD\u5199\u6B64\u65B9\u6CD5\u6765\u8BBE\u7F6E\u521D\u59CB\u5B9E\u4F53\u548C\u7EC4\u4EF6\u3002\r\n */\r\n public initialize(): void {\r\n }\r\n\r\n /**\r\n * \u573A\u666F\u5F00\u59CB\u8FD0\u884C\u65F6\u7684\u56DE\u8C03\r\n * \r\n * \u5728\u573A\u666F\u5F00\u59CB\u8FD0\u884C\u65F6\u8C03\u7528\uFF0C\u53EF\u4EE5\u5728\u6B64\u65B9\u6CD5\u4E2D\u6267\u884C\u573A\u666F\u542F\u52A8\u903B\u8F91\u3002\r\n */\r\n public onStart(): void {\r\n }\r\n\r\n /**\r\n * \u573A\u666F\u5378\u8F7D\u65F6\u7684\u56DE\u8C03\r\n * \r\n * \u5728\u573A\u666F\u88AB\u9500\u6BC1\u65F6\u8C03\u7528\uFF0C\u53EF\u4EE5\u5728\u6B64\u65B9\u6CD5\u4E2D\u6267\u884C\u6E05\u7406\u5DE5\u4F5C\u3002\r\n */\r\n public unload(): void {\r\n }\r\n\r\n /**\r\n * \u5F00\u59CB\u573A\u666F\uFF0C\u542F\u52A8\u5B9E\u4F53\u5904\u7406\u5668\u7B49\r\n *\r\n * \u8FD9\u4E2A\u65B9\u6CD5\u4F1A\u542F\u52A8\u573A\u666F\u3002\u5B83\u5C06\u542F\u52A8\u5B9E\u4F53\u5904\u7406\u5668\u7B49\uFF0C\u5E76\u8C03\u7528onStart\u65B9\u6CD5\u3002\r\n */\r\n public begin() {\r\n // \u542F\u52A8\u5B9E\u4F53\u5904\u7406\u5668\r\n if (this.entityProcessors != null)\r\n this.entityProcessors.begin();\r\n\r\n // \u6807\u8BB0\u573A\u666F\u5DF2\u5F00\u59CB\u8FD0\u884C\u5E76\u8C03\u7528onStart\u65B9\u6CD5\r\n this._didSceneBegin = true;\r\n this.onStart();\r\n }\r\n\r\n /**\r\n * \u7ED3\u675F\u573A\u666F\uFF0C\u6E05\u9664\u5B9E\u4F53\u3001\u5B9E\u4F53\u5904\u7406\u5668\u7B49\r\n *\r\n * \u8FD9\u4E2A\u65B9\u6CD5\u4F1A\u7ED3\u675F\u573A\u666F\u3002\u5B83\u5C06\u79FB\u9664\u6240\u6709\u5B9E\u4F53\uFF0C\u7ED3\u675F\u5B9E\u4F53\u5904\u7406\u5668\u7B49\uFF0C\u5E76\u8C03\u7528unload\u65B9\u6CD5\u3002\r\n */\r\n public end() {\r\n // \u6807\u8BB0\u573A\u666F\u5DF2\u7ED3\u675F\u8FD0\u884C\r\n this._didSceneBegin = false;\r\n\r\n // \u79FB\u9664\u6240\u6709\u5B9E\u4F53\r\n this.entities.removeAllEntities();\r\n\r\n // \u6E05\u7A7A\u7EC4\u4EF6\u5B58\u50A8\r\n this.componentStorageManager.clear();\r\n\r\n // \u7ED3\u675F\u5B9E\u4F53\u5904\u7406\u5668\r\n if (this.entityProcessors)\r\n this.entityProcessors.end();\r\n\r\n // \u8C03\u7528\u5378\u8F7D\u65B9\u6CD5\r\n this.unload();\r\n }\r\n\r\n /**\r\n * \u66F4\u65B0\u573A\u666F\uFF0C\u66F4\u65B0\u5B9E\u4F53\u7EC4\u4EF6\u3001\u5B9E\u4F53\u5904\u7406\u5668\u7B49\r\n */\r\n public update() {\r\n // \u66F4\u65B0\u5B9E\u4F53\u5217\u8868\r\n this.entities.updateLists();\r\n\r\n // \u66F4\u65B0\u5B9E\u4F53\u5904\u7406\u5668\r\n if (this.entityProcessors != null)\r\n this.entityProcessors.update();\r\n\r\n // \u66F4\u65B0\u5B9E\u4F53\u7EC4\r\n this.entities.update();\r\n\r\n // \u66F4\u65B0\u5B9E\u4F53\u5904\u7406\u5668\u7684\u540E\u5904\u7406\u65B9\u6CD5\r\n if (this.entityProcessors != null)\r\n this.entityProcessors.lateUpdate();\r\n }\r\n\r\n /**\r\n * \u5C06\u5B9E\u4F53\u6DFB\u52A0\u5230\u6B64\u573A\u666F\uFF0C\u5E76\u8FD4\u56DE\u5B83\r\n * @param name \u5B9E\u4F53\u540D\u79F0\r\n */\r\n public createEntity(name: string) {\r\n let entity = new Entity(name, this.identifierPool.checkOut());\r\n return this.addEntity(entity);\r\n }\r\n\r\n /**\r\n * \u5728\u573A\u666F\u7684\u5B9E\u4F53\u5217\u8868\u4E2D\u6DFB\u52A0\u4E00\u4E2A\u5B9E\u4F53\r\n * @param entity \u8981\u6DFB\u52A0\u7684\u5B9E\u4F53\r\n * @param deferCacheClear \u662F\u5426\u5EF6\u8FDF\u7F13\u5B58\u6E05\u7406\uFF08\u7528\u4E8E\u6279\u91CF\u64CD\u4F5C\uFF09\r\n */\r\n public addEntity(entity: Entity, deferCacheClear: boolean = false) {\r\n this.entities.add(entity);\r\n entity.scene = this;\r\n \r\n // \u5C06\u5B9E\u4F53\u6DFB\u52A0\u5230\u67E5\u8BE2\u7CFB\u7EDF\uFF08\u53EF\u5EF6\u8FDF\u7F13\u5B58\u6E05\u7406\uFF09\r\n this.querySystem.addEntity(entity, deferCacheClear);\r\n \r\n // \u89E6\u53D1\u5B9E\u4F53\u6DFB\u52A0\u4E8B\u4EF6\r\n this.eventSystem.emitSync('entity:added', { entity, scene: this });\r\n \r\n return entity;\r\n }\r\n\r\n /**\r\n * \u6279\u91CF\u521B\u5EFA\u5B9E\u4F53\uFF08\u9AD8\u6027\u80FD\u7248\u672C\uFF09\r\n * @param count \u8981\u521B\u5EFA\u7684\u5B9E\u4F53\u6570\u91CF\r\n * @param namePrefix \u5B9E\u4F53\u540D\u79F0\u524D\u7F00\r\n * @returns \u521B\u5EFA\u7684\u5B9E\u4F53\u5217\u8868\r\n */\r\n public createEntities(count: number, namePrefix: string = \"Entity\"): Entity[] {\r\n const entities: Entity[] = [];\r\n \r\n // \u6279\u91CF\u521B\u5EFA\u5B9E\u4F53\u5BF9\u8C61\uFF0C\u4E0D\u7ACB\u5373\u6DFB\u52A0\u5230\u7CFB\u7EDF\r\n for (let i = 0; i < count; i++) {\r\n const entity = new Entity(`${namePrefix}_${i}`, this.identifierPool.checkOut());\r\n entity.scene = this;\r\n entities.push(entity);\r\n }\r\n \r\n // \u6279\u91CF\u6DFB\u52A0\u5230\u5B9E\u4F53\u5217\u8868\r\n for (const entity of entities) {\r\n this.entities.add(entity);\r\n }\r\n \r\n // \u6279\u91CF\u6DFB\u52A0\u5230\u67E5\u8BE2\u7CFB\u7EDF\uFF08\u65E0\u91CD\u590D\u68C0\u67E5\uFF0C\u6027\u80FD\u6700\u4F18\uFF09\r\n this.querySystem.addEntitiesUnchecked(entities);\r\n \r\n // \u6279\u91CF\u89E6\u53D1\u4E8B\u4EF6\uFF08\u53EF\u9009\uFF0C\u51CF\u5C11\u4E8B\u4EF6\u5F00\u9500\uFF09\r\n this.eventSystem.emitSync('entities:batch_added', { entities, scene: this, count });\r\n \r\n return entities;\r\n }\r\n\r\n /**\r\n * \u6279\u91CF\u521B\u5EFA\u5B9E\u4F53\r\n * @param count \u8981\u521B\u5EFA\u7684\u5B9E\u4F53\u6570\u91CF\r\n * @param namePrefix \u5B9E\u4F53\u540D\u79F0\u524D\u7F00\r\n * @returns \u521B\u5EFA\u7684\u5B9E\u4F53\u5217\u8868\r\n */\r\n public createEntitiesOld(count: number, namePrefix: string = \"Entity\"): Entity[] {\r\n const entities: Entity[] = [];\r\n \r\n // \u6279\u91CF\u521B\u5EFA\u5B9E\u4F53\uFF0C\u5EF6\u8FDF\u7F13\u5B58\u6E05\u7406\r\n for (let i = 0; i < count; i++) {\r\n const entity = new Entity(`${namePrefix}_${i}`, this.identifierPool.checkOut());\r\n entities.push(entity);\r\n this.addEntity(entity, true); // \u5EF6\u8FDF\u7F13\u5B58\u6E05\u7406\r\n }\r\n \r\n // \u6700\u540E\u7EDF\u4E00\u6E05\u7406\u7F13\u5B58\r\n this.querySystem.clearCache();\r\n \r\n return entities;\r\n }\r\n\r\n /**\r\n * \u4ECE\u573A\u666F\u4E2D\u5220\u9664\u6240\u6709\u5B9E\u4F53\r\n */\r\n public destroyAllEntities() {\r\n for (let i = 0; i < this.entities.count; i++) {\r\n this.entities.buffer[i].destroy();\r\n }\r\n }\r\n\r\n /**\r\n * \u641C\u7D22\u5E76\u8FD4\u56DE\u7B2C\u4E00\u4E2A\u5177\u6709\u540D\u79F0\u7684\u5B9E\u4F53\r\n * @param name \u5B9E\u4F53\u540D\u79F0\r\n */\r\n public findEntity(name: string): Entity | null {\r\n return this.entities.findEntity(name);\r\n }\r\n\r\n /**\r\n * \u6839\u636EID\u67E5\u627E\u5B9E\u4F53\r\n * @param id \u5B9E\u4F53ID\r\n */\r\n public findEntityById(id: number): Entity | null {\r\n return this.entities.findEntityById(id);\r\n }\r\n\r\n /**\r\n * \u6839\u636E\u6807\u7B7E\u67E5\u627E\u5B9E\u4F53\r\n * @param tag \u5B9E\u4F53\u6807\u7B7E\r\n */\r\n public findEntitiesByTag(tag: number): Entity[] {\r\n const result: Entity[] = [];\r\n for (const entity of this.entities.buffer) {\r\n if (entity.tag === tag) {\r\n result.push(entity);\r\n }\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * \u6839\u636E\u540D\u79F0\u67E5\u627E\u5B9E\u4F53\uFF08\u522B\u540D\u65B9\u6CD5\uFF09\r\n * @param name \u5B9E\u4F53\u540D\u79F0\r\n */\r\n public getEntityByName(name: string): Entity | null {\r\n return this.findEntity(name);\r\n }\r\n\r\n /**\r\n * \u6839\u636E\u6807\u7B7E\u67E5\u627E\u5B9E\u4F53\uFF08\u522B\u540D\u65B9\u6CD5\uFF09\r\n * @param tag \u5B9E\u4F53\u6807\u7B7E\r\n */\r\n public getEntitiesByTag(tag: number): Entity[] {\r\n return this.findEntitiesByTag(tag);\r\n }\r\n\r\n /**\r\n * \u5728\u573A\u666F\u4E2D\u6DFB\u52A0\u4E00\u4E2AEntitySystem\u5904\u7406\u5668\r\n * @param processor \u5904\u7406\u5668\r\n */\r\n public addEntityProcessor(processor: EntitySystem) {\r\n processor.scene = this;\r\n this.entityProcessors.add(processor);\r\n\r\n processor.setUpdateOrder(this.entityProcessors.count - 1);\r\n return processor;\r\n }\r\n\r\n /**\r\n * \u6DFB\u52A0\u7CFB\u7EDF\u5230\u573A\u666F\uFF08addEntityProcessor\u7684\u522B\u540D\uFF09\r\n * @param system \u7CFB\u7EDF\r\n */\r\n public addSystem(system: EntitySystem) {\r\n return this.addEntityProcessor(system);\r\n }\r\n\r\n /**\r\n * \u4ECE\u573A\u666F\u4E2D\u5220\u9664EntitySystem\u5904\u7406\u5668\r\n * @param processor \u8981\u5220\u9664\u7684\u5904\u7406\u5668\r\n */\r\n public removeEntityProcessor(processor: EntitySystem) {\r\n this.entityProcessors.remove(processor);\r\n }\r\n\r\n /**\r\n * \u83B7\u53D6\u6307\u5B9A\u7C7B\u578B\u7684EntitySystem\u5904\u7406\u5668\r\n * @param type \u5904\u7406\u5668\u7C7B\u578B\r\n */\r\n public getEntityProcessor<T extends EntitySystem>(type: new (...args: any[]) => T): T | null {\r\n return this.entityProcessors.getProcessor(type);\r\n }\r\n\r\n /**\r\n * \u83B7\u53D6\u573A\u666F\u7EDF\u8BA1\u4FE1\u606F\r\n */\r\n public getStats(): {\r\n entityCount: number;\r\n processorCount: number;\r\n componentStorageStats: Map<string, any>;\r\n } {\r\n return {\r\n entityCount: this.entities.count,\r\n processorCount: this.entityProcessors.count,\r\n componentStorageStats: this.componentStorageManager.getAllStats()\r\n };\r\n }\r\n\r\n /**\r\n * \u538B\u7F29\u7EC4\u4EF6\u5B58\u50A8\uFF08\u6E05\u7406\u788E\u7247\uFF09\r\n */\r\n public compactComponentStorage(): void {\r\n this.componentStorageManager.compactAll();\r\n }\r\n\r\n /**\r\n * \u83B7\u53D6\u573A\u666F\u7684\u8C03\u8BD5\u4FE1\u606F\r\n */\r\n public getDebugInfo(): {\r\n name: string;\r\n entityCount: number;\r\n processorCount: number;\r\n isRunning: boolean;\r\n entities: Array<{\r\n name: string;\r\n id: number;\r\n componentCount: number;\r\n componentTypes: string[];\r\n }>;\r\n processors: Array<{\r\n name: string;\r\n updateOrder: number;\r\n entityCount: number;\r\n }>;\r\n componentStats: Map<string, any>;\r\n } {\r\n return {\r\n name: this.constructor.name,\r\n entityCount: this.entities.count,\r\n processorCount: this.entityProcessors.count,\r\n isRunning: this._didSceneBegin,\r\n entities: this.entities.buffer.map(entity => ({\r\n name: entity.name,\r\n id: entity.id,\r\n componentCount: entity.components.length,\r\n componentTypes: entity.components.map(c => c.constructor.name)\r\n })),\r\n processors: this.entityProcessors.processors.map(processor => ({\r\n name: processor.constructor.name,\r\n updateOrder: processor.updateOrder,\r\n entityCount: (processor as any)._entities?.length || 0\r\n })),\r\n componentStats: this.componentStorageManager.getAllStats()\r\n };\r\n }\r\n}", "import { Entity } from '../Entity';\r\nimport { Component } from '../Component';\r\nimport { Scene } from '../Scene';\r\nimport { ComponentType, ComponentStorageManager } from './ComponentStorage';\r\nimport { QuerySystem, QueryBuilder } from './QuerySystem';\r\nimport { TypeSafeEventSystem } from './EventSystem';\r\n\r\n/**\r\n * \u5B9E\u4F53\u6784\u5EFA\u5668 - \u63D0\u4F9B\u6D41\u5F0FAPI\u521B\u5EFA\u548C\u914D\u7F6E\u5B9E\u4F53\r\n */\r\nexport class EntityBuilder {\r\n private entity: Entity;\r\n private scene: Scene;\r\n private storageManager: ComponentStorageManager;\r\n\r\n constructor(scene: Scene, storageManager: ComponentStorageManager) {\r\n this.scene = scene;\r\n this.storageManager = storageManager;\r\n this.entity = new Entity(\"\", scene.identifierPool.checkOut());\r\n }\r\n\r\n /**\r\n * \u8BBE\u7F6E\u5B9E\u4F53\u540D\u79F0\r\n * @param name \u5B9E\u4F53\u540D\u79F0\r\n * @returns \u5B9E\u4F53\u6784\u5EFA\u5668\r\n */\r\n public named(name: string): EntityBuilder {\r\n this.entity.name = name;\r\n return this;\r\n }\r\n\r\n /**\r\n * \u8BBE\u7F6E\u5B9E\u4F53\u6807\u7B7E\r\n * @param tag \u6807\u7B7E\r\n * @returns \u5B9E\u4F53\u6784\u5EFA\u5668\r\n */\r\n public tagged(tag: number): EntityBuilder {\r\n this.entity.tag = tag;\r\n return this;\r\n }\r\n\r\n /**\r\n * \u6DFB\u52A0\u7EC4\u4EF6\r\n * @param component \u7EC4\u4EF6\u5B9E\u4F8B\r\n * @returns \u5B9E\u4F53\u6784\u5EFA\u5668\r\n */\r\n public with<T extends Component>(component: T): EntityBuilder {\r\n this.entity.addComponent(component);\r\n return this;\r\n }\r\n\r\n /**\r\n * \u6DFB\u52A0\u591A\u4E2A\u7EC4\u4EF6\r\n * @param components \u7EC4\u4EF6\u6570\u7EC4\r\n * @returns \u5B9E\u4F53\u6784\u5EFA\u5668\r\n */\r\n public withComponents(...components: Component[]): EntityBuilder {\r\n for (const component of components) {\r\n this.entity.addComponent(component);\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * \u6761\u4EF6\u6027\u6DFB\u52A0\u7EC4\u4EF6\r\n * @param condition \u6761\u4EF6\r\n * @param component \u7EC4\u4EF6\u5B9E\u4F8B\r\n * @returns \u5B9E\u4F53\u6784\u5EFA\u5668\r\n */\r\n public withIf<T extends Component>(condition: boolean, component: T): EntityBuilder {\r\n if (condition) {\r\n this.entity.addComponent(component);\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * \u4F7F\u7528\u5DE5\u5382\u51FD\u6570\u521B\u5EFA\u5E76\u6DFB\u52A0\u7EC4\u4EF6\r\n * @param factory \u7EC4\u4EF6\u5DE5\u5382\u51FD\u6570\r\n * @returns \u5B9E\u4F53\u6784\u5EFA\u5668\r\n */\r\n public withFactory<T extends Component>(factory: () => T): EntityBuilder {\r\n const component = factory();\r\n this.entity.addComponent(component);\r\n return this;\r\n }\r\n\r\n /**\r\n * \u914D\u7F6E\u7EC4\u4EF6\u5C5E\u6027\r\n * @param componentType \u7EC4\u4EF6\u7C7B\u578B\r\n * @param configurator \u914D\u7F6E\u51FD\u6570\r\n * @returns \u5B9E\u4F53\u6784\u5EFA\u5668\r\n */\r\n public configure<T extends Component>(\r\n componentType: ComponentType<T>, \r\n configurator: (component: T) => void\r\n ): EntityBuilder {\r\n const component = this.entity.getComponent(componentType);\r\n if (component) {\r\n configurator(component);\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * \u8BBE\u7F6E\u5B9E\u4F53\u4E3A\u542F\u7528\u72B6\u6001\r\n * @param enabled \u662F\u5426\u542F\u7528\r\n * @returns \u5B9E\u4F53\u6784\u5EFA\u5668\r\n */\r\n public enabled(enabled: boolean = true): EntityBuilder {\r\n this.entity.enabled = enabled;\r\n return this;\r\n }\r\n\r\n /**\r\n * \u8BBE\u7F6E\u5B9E\u4F53\u4E3A\u6D3B\u8DC3\u72B6\u6001\r\n * @param active \u662F\u5426\u6D3B\u8DC3\r\n * @returns \u5B9E\u4F53\u6784\u5EFA\u5668\r\n */\r\n public active(active: boolean = true): EntityBuilder {\r\n this.entity.active = active;\r\n return this;\r\n }\r\n\r\n /**\r\n * \u6DFB\u52A0\u5B50\u5B9E\u4F53\r\n * @param childBuilder \u5B50\u5B9E\u4F53\u6784\u5EFA\u5668\r\n * @returns \u5B9E\u4F53\u6784\u5EFA\u5668\r\n */\r\n public withChild(childBuilder: EntityBuilder): EntityBuilder {\r\n const child = childBuilder.build();\r\n this.entity.addChild(child);\r\n return this;\r\n }\r\n\r\n /**\r\n * \u6279\u91CF\u6DFB\u52A0\u5B50\u5B9E\u4F53\r\n * @param childBuilders \u5B50\u5B9E\u4F53\u6784\u5EFA\u5668\u6570\u7EC4\r\n * @returns \u5B9E\u4F53\u6784\u5EFA\u5668\r\n */\r\n public withChildren(...childBuilders: EntityBuilder[]): EntityBuilder {\r\n for (const childBuilder of childBuilders) {\r\n const child = childBuilder.build();\r\n this.entity.addChild(child);\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * \u4F7F\u7528\u5DE5\u5382\u51FD\u6570\u521B\u5EFA\u5B50\u5B9E\u4F53\r\n * @param childFactory \u5B50\u5B9E\u4F53\u5DE5\u5382\u51FD\u6570\r\n * @returns \u5B9E\u4F53\u6784\u5EFA\u5668\r\n */\r\n public withChildFactory(childFactory: (parent: Entity) => EntityBuilder): EntityBuilder {\r\n const childBuilder = childFactory(this.entity);\r\n const child = childBuilder.build();\r\n this.entity.addChild(child);\r\n return this;\r\n }\r\n\r\n /**\r\n * \u6761\u4EF6\u6027\u6DFB\u52A0\u5B50\u5B9E\u4F53\r\n * @param condition \u6761\u4EF6\r\n * @param childBuilder \u5B50\u5B9E\u4F53\u6784\u5EFA\u5668\r\n * @returns \u5B9E\u4F53\u6784\u5EFA\u5668\r\n */\r\n public withChildIf(condition: boolean, childBuilder: EntityBuilder): EntityBuilder {\r\n if (condition) {\r\n const child = childBuilder.build();\r\n this.entity.addChild(child);\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * \u6784\u5EFA\u5E76\u8FD4\u56DE\u5B9E\u4F53\r\n * @returns \u6784\u5EFA\u7684\u5B9E\u4F53\r\n */\r\n public build(): Entity {\r\n return this.entity;\r\n }\r\n\r\n /**\r\n * \u6784\u5EFA\u5B9E\u4F53\u5E76\u6DFB\u52A0\u5230\u573A\u666F\r\n * @returns \u6784\u5EFA\u7684\u5B9E\u4F53\r\n */\r\n public spawn(): Entity {\r\n this.scene.addEntity(this.entity);\r\n return this.entity;\r\n }\r\n\r\n /**\r\n * \u514B\u9686\u5F53\u524D\u6784\u5EFA\u5668\r\n * @returns \u65B0\u7684\u5B9E\u4F53\u6784\u5EFA\u5668\r\n */\r\n public clone(): EntityBuilder {\r\n const newBuilder = new EntityBuilder(this.scene, this.storageManager);\r\n // \u8FD9\u91CC\u9700\u8981\u6DF1\u5EA6\u514B\u9686\u5B9E\u4F53\uFF0C\u7B80\u5316\u5B9E\u73B0\r\n newBuilder.entity = this.entity; // \u5B9E\u9645\u5E94\u8BE5\u662F\u6DF1\u5EA6\u514B\u9686\r\n return newBuilder;\r\n }\r\n}\r\n\r\n/**\r\n * \u573A\u666F\u6784\u5EFA\u5668 - \u63D0\u4F9B\u6D41\u5F0FAPI\u521B\u5EFA\u548C\u914D\u7F6E\u573A\u666F\r\n */\r\nexport class SceneBuilder {\r\n private scene: Scene;\r\n\r\n constructor() {\r\n this.scene = new Scene();\r\n }\r\n\r\n /**\r\n * \u8BBE\u7F6E\u573A\u666F\u540D\u79F0\r\n * @param name \u573A\u666F\u540D\u79F0\r\n * @returns \u573A\u666F\u6784\u5EFA\u5668\r\n */\r\n public named(name: string): SceneBuilder {\r\n this.scene.name = name;\r\n return this;\r\n }\r\n\r\n /**\r\n * \u6DFB\u52A0\u5B9E\u4F53\r\n * @param entity \u5B9E\u4F53\r\n * @returns \u573A\u666F\u6784\u5EFA\u5668\r\n */\r\n public withEntity(entity: Entity): SceneBuilder {\r\n this.scene.addEntity(entity);\r\n return this;\r\n }\r\n\r\n /**\r\n * \u4F7F\u7528\u5B9E\u4F53\u6784\u5EFA\u5668\u6DFB\u52A0\u5B9E\u4F53\r\n * @param builderFn \u5B9E\u4F53\u6784\u5EFA\u5668\u51FD\u6570\r\n * @returns \u573A\u666F\u6784\u5EFA\u5668\r\n */\r\n public withEntityBuilder(builderFn: (builder: EntityBuilder) => EntityBuilder): SceneBuilder {\r\n const builder = new EntityBuilder(this.scene, this.scene.componentStorageManager);\r\n const configuredBuilder = builderFn(builder);\r\n const entity = configuredBuilder.build();\r\n this.scene.addEntity(entity);\r\n return this;\r\n }\r\n\r\n /**\r\n * \u6279\u91CF\u6DFB\u52A0\u5B9E\u4F53\r\n * @param entities \u5B9E\u4F53\u6570\u7EC4\r\n * @returns \u573A\u666F\u6784\u5EFA\u5668\r\n */\r\n public withEntities(...entities: Entity[]): SceneBuilder {\r\n for (const entity of entities) {\r\n this.scene.addEntity(entity);\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * \u6DFB\u52A0\u7CFB\u7EDF\r\n * @param system \u7CFB\u7EDF\u5B9E\u4F8B\r\n * @returns \u573A\u666F\u6784\u5EFA\u5668\r\n */\r\n public withSystem(system: any): SceneBuilder {\r\n this.scene.addSystem(system);\r\n return this;\r\n }\r\n\r\n /**\r\n * \u6279\u91CF\u6DFB\u52A0\u7CFB\u7EDF\r\n * @param systems \u7CFB\u7EDF\u6570\u7EC4\r\n * @returns \u573A\u666F\u6784\u5EFA\u5668\r\n */\r\n public withSystems(...systems: any[]): SceneBuilder {\r\n for (const system of systems) {\r\n this.scene.addSystem(system);\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * \u6784\u5EFA\u5E76\u8FD4\u56DE\u573A\u666F\r\n * @returns \u6784\u5EFA\u7684\u573A\u666F\r\n */\r\n public build(): Scene {\r\n return this.scene;\r\n }\r\n}\r\n\r\n/**\r\n * \u7EC4\u4EF6\u6784\u5EFA\u5668 - \u63D0\u4F9B\u6D41\u5F0FAPI\u521B\u5EFA\u7EC4\u4EF6\r\n */\r\nexport class ComponentBuilder<T extends Component> {\r\n private component: T;\r\n\r\n constructor(componentClass: new (...args: any[]) => T, ...args: any[]) {\r\n this.component = new componentClass(...args);\r\n }\r\n\r\n /**\r\n * \u8BBE\u7F6E\u7EC4\u4EF6\u5C5E\u6027\r\n * @param property \u5C5E\u6027\u540D\r\n * @param value \u5C5E\u6027\u503C\r\n * @returns \u7EC4\u4EF6\u6784\u5EFA\u5668\r\n */\r\n public set<K extends keyof T>(property: K, value: T[K]): ComponentBuilder<T> {\r\n this.component[property] = value;\r\n return this;\r\n }\r\n\r\n /**\r\n * \u4F7F\u7528\u914D\u7F6E\u51FD\u6570\u8BBE\u7F6E\u7EC4\u4EF6\r\n * @param configurator \u914D\u7F6E\u51FD\u6570\r\n * @returns \u7EC4\u4EF6\u6784\u5EFA\u5668\r\n */\r\n public configure(configurator: (component: T) => void): ComponentBuilder<T> {\r\n configurator(this.component);\r\n return this;\r\n }\r\n\r\n /**\r\n * \u6761\u4EF6\u6027\u8BBE\u7F6E\u5C5E\u6027\r\n * @param condition \u6761\u4EF6\r\n * @param property \u5C5E\u6027\u540D\r\n * @param value \u5C5E\u6027\u503C\r\n * @returns \u7EC4\u4EF6\u6784\u5EFA\u5668\r\n */\r\n public setIf<K extends keyof T>(condition: boolean, property: K, value: T[K]): ComponentBuilder<T> {\r\n if (condition) {\r\n this.component[property] = value;\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * \u6784\u5EFA\u5E76\u8FD4\u56DE\u7EC4\u4EF6\r\n * @returns \u6784\u5EFA\u7684\u7EC4\u4EF6\r\n */\r\n public build(): T {\r\n return this.component;\r\n }\r\n}\r\n\r\n/**\r\n * ECS\u6D41\u5F0FAPI\u4E3B\u5165\u53E3\r\n * \u63D0\u4F9B\u7EDF\u4E00\u7684\u6D41\u5F0F\u63A5\u53E3\r\n */\r\nexport class ECSFluentAPI {\r\n private scene: Scene;\r\n private querySystem: QuerySystem;\r\n private eventSystem: TypeSafeEventSystem;\r\n\r\n constructor(scene: Scene, querySystem: QuerySystem, eventSystem: TypeSafeEventSystem) {\r\n this.scene = scene;\r\n this.querySystem = querySystem;\r\n this.eventSystem = eventSystem;\r\n }\r\n\r\n /**\r\n * \u521B\u5EFA\u5B9E\u4F53\u6784\u5EFA\u5668\r\n * @returns \u5B9E\u4F53\u6784\u5EFA\u5668\r\n */\r\n public createEntity(): EntityBuilder {\r\n return new EntityBuilder(this.scene, this.scene.componentStorageManager);\r\n }\r\n\r\n /**\r\n * \u521B\u5EFA\u573A\u666F\u6784\u5EFA\u5668\r\n * @returns \u573A\u666F\u6784\u5EFA\u5668\r\n */\r\n public createScene(): SceneBuilder {\r\n return new SceneBuilder();\r\n }\r\n\r\n /**\r\n * \u521B\u5EFA\u7EC4\u4EF6\u6784\u5EFA\u5668\r\n * @param componentClass \u7EC4\u4EF6\u7C7B\r\n * @param args \u6784\u9020\u53C2\u6570\r\n * @returns \u7EC4\u4EF6\u6784\u5EFA\u5668\r\n */\r\n public createComponent<T extends Component>(\r\n componentClass: new (...args: any[]) => T, \r\n ...args: any[]\r\n ): ComponentBuilder<T> {\r\n return new ComponentBuilder(componentClass, ...args);\r\n }\r\n\r\n /**\r\n * \u521B\u5EFA\u67E5\u8BE2\u6784\u5EFA\u5668\r\n * @returns \u67E5\u8BE2\u6784\u5EFA\u5668\r\n */\r\n public query(): QueryBuilder {\r\n return new QueryBuilder(this.querySystem);\r\n }\r\n\r\n /**\r\n * \u67E5\u627E\u5B9E\u4F53\uFF08\u7B80\u5316\u7248\uFF09\r\n * @param componentTypes \u7EC4\u4EF6\u7C7B\u578B\r\n * @returns \u5B9E\u4F53\u6570\u7EC4\r\n */\r\n public find(...componentTypes: ComponentType[]): Entity[] {\r\n return this.querySystem.queryAll(...componentTypes).entities;\r\n }\r\n\r\n /**\r\n * \u67E5\u627E\u7B2C\u4E00\u4E2A\u5339\u914D\u7684\u5B9E\u4F53\r\n * @param componentTypes \u7EC4\u4EF6\u7C7B\u578B\r\n * @returns \u5B9E\u4F53\u6216null\r\n */\r\n public findFirst(...componentTypes: ComponentType[]): Entity | null {\r\n const result = this.querySystem.queryAll(...componentTypes);\r\n return result.entities.length > 0 ? result.entities[0] : null;\r\n }\r\n\r\n /**\r\n * \u6309\u540D\u79F0\u67E5\u627E\u5B9E\u4F53\r\n * @param name \u5B9E\u4F53\u540D\u79F0\r\n * @returns \u5B9E\u4F53\u6216null\r\n */\r\n public findByName(name: string): Entity | null {\r\n return this.scene.getEntityByName(name);\r\n }\r\n\r\n /**\r\n * \u6309\u6807\u7B7E\u67E5\u627E\u5B9E\u4F53\r\n * @param tag \u6807\u7B7E\r\n * @returns \u5B9E\u4F53\u6570\u7EC4\r\n */\r\n public findByTag(tag: number): Entity[] {\r\n return this.scene.getEntitiesByTag(tag);\r\n }\r\n\r\n /**\r\n * \u89E6\u53D1\u4E8B\u4EF6\r\n * @param eventType \u4E8B\u4EF6\u7C7B\u578B\r\n * @param event \u4E8B\u4EF6\u6570\u636E\r\n */\r\n public emit<T>(eventType: string, event: T): void {\r\n this.eventSystem.emitSync(eventType, event);\r\n }\r\n\r\n /**\r\n * \u5F02\u6B65\u89E6\u53D1\u4E8B\u4EF6\r\n * @param eventType \u4E8B\u4EF6\u7C7B\u578B\r\n * @param event \u4E8B\u4EF6\u6570\u636E\r\n */\r\n public async emitAsync<T>(eventType: string, event: T): Promise<void> {\r\n await this.eventSystem.emit(eventType, event);\r\n }\r\n\r\n /**\r\n * \u76D1\u542C\u4E8B\u4EF6\r\n * @param eventType \u4E8B\u4EF6\u7C7B\u578B\r\n * @param handler \u4E8B\u4EF6\u5904\u7406\u5668\r\n * @returns \u76D1\u542C\u5668ID\r\n */\r\n public on<T>(eventType: string, handler: (event: T) => void): string {\r\n return this.eventSystem.on(eventType, handler);\r\n }\r\n\r\n /**\r\n * \u4E00\u6B21\u6027\u76D1\u542C\u4E8B\u4EF6\r\n * @param eventType \u4E8B\u4EF6\u7C7B\u578B\r\n * @param handler \u4E8B\u4EF6\u5904\u7406\u5668\r\n * @returns \u76D1\u542C\u5668ID\r\n */\r\n public once<T>(eventType: string, handler: (event: T) => void): string {\r\n return this.eventSystem.once(eventType, handler);\r\n }\r\n\r\n /**\r\n * \u79FB\u9664\u4E8B\u4EF6\u76D1\u542C\u5668\r\n * @param eventType \u4E8B\u4EF6\u7C7B\u578B\r\n * @param listenerId \u76D1\u542C\u5668ID\r\n */\r\n public off(eventType: string, listenerId: string): void {\r\n this.eventSystem.off(eventType, listenerId);\r\n }\r\n\r\n /**\r\n * \u6279\u91CF\u64CD\u4F5C\u5B9E\u4F53\r\n * @param entities \u5B9E\u4F53\u6570\u7EC4\r\n * @returns \u6279\u91CF\u64CD\u4F5C\u5668\r\n */\r\n public batch(entities: Entity[]): EntityBatchOperator {\r\n return new EntityBatchOperator(entities);\r\n }\r\n\r\n /**\r\n * \u83B7\u53D6\u573A\u666F\u7EDF\u8BA1\u4FE1\u606F\r\n * @returns \u7EDF\u8BA1\u4FE1\u606F\r\n */\r\n public getStats(): {\r\n entityCount: number;\r\n systemCount: number;\r\n componentStats: Map<string, any>;\r\n queryStats: any;\r\n eventStats: Map<string, any>;\r\n } {\r\n return {\r\n entityCount: this.scene.entities.count,\r\n systemCount: this.scene.systems.length,\r\n componentStats: this.scene.componentStorageManager.getAllStats(),\r\n queryStats: this.querySystem.getStats(),\r\n eventStats: this.eventSystem.getStats() as Map<string, any>\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * \u5B9E\u4F53\u6279\u91CF\u64CD\u4F5C\u5668\r\n * \u63D0\u4F9B\u5BF9\u591A\u4E2A\u5B9E\u4F53\u7684\u6279\u91CF\u64CD\u4F5C\r\n */\r\nexport class EntityBatchOperator {\r\n private entities: Entity[];\r\n\r\n constructor(entities: Entity[]) {\r\n this.entities = entities;\r\n }\r\n\r\n /**\r\n * \u6279\u91CF\u6DFB\u52A0\u7EC4\u4EF6\r\n * @param component \u7EC4\u4EF6\u5B9E\u4F8B\r\n * @returns \u6279\u91CF\u64CD\u4F5C\u5668\r\n */\r\n public addComponent<T extends Component>(component: T): EntityBatchOperator {\r\n for (const entity of this.entities) {\r\n entity.addComponent(component);\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * \u6279\u91CF\u79FB\u9664\u7EC4\u4EF6\r\n * @param componentType \u7EC4\u4EF6\u7C7B\u578B\r\n * @returns \u6279\u91CF\u64CD\u4F5C\u5668\r\n */\r\n public removeComponent<T extends Component>(componentType: ComponentType<T>): EntityBatchOperator {\r\n for (const entity of this.entities) {\r\n entity.removeComponentByType(componentType);\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * \u6279\u91CF\u8BBE\u7F6E\u6D3B\u8DC3\u72B6\u6001\r\n * @param active \u662F\u5426\u6D3B\u8DC3\r\n * @returns \u6279\u91CF\u64CD\u4F5C\u5668\r\n */\r\n public setActive(active: boolean): EntityBatchOperator {\r\n for (const entity of this.entities) {\r\n entity.active = active;\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * \u6279\u91CF\u8BBE\u7F6E\u6807\u7B7E\r\n * @param tag \u6807\u7B7E\r\n * @returns \u6279\u91CF\u64CD\u4F5C\u5668\r\n */\r\n public setTag(tag: number): EntityBatchOperator {\r\n for (const entity of this.entities) {\r\n entity.tag = tag;\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * \u6279\u91CF\u6267\u884C\u64CD\u4F5C\r\n * @param operation \u64CD\u4F5C\u51FD\u6570\r\n * @returns \u6279\u91CF\u64CD\u4F5C\u5668\r\n */\r\n public forEach(operation: (entity: Entity, index: number) => void): EntityBatchOperator {\r\n this.entities.forEach(operation);\r\n return this;\r\n }\r\n\r\n /**\r\n * \u8FC7\u6EE4\u5B9E\u4F53\r\n * @param predicate \u8FC7\u6EE4\u6761\u4EF6\r\n * @returns \u65B0\u7684\u6279\u91CF\u64CD\u4F5C\u5668\r\n */\r\n public filter(predicate: (entity: Entity) => boolean): EntityBatchOperator {\r\n return new EntityBatchOperator(this.entities.filter(predicate));\r\n }\r\n\r\n /**\r\n * \u83B7\u53D6\u5B9E\u4F53\u6570\u7EC4\r\n * @returns \u5B9E\u4F53\u6570\u7EC4\r\n */\r\n public toArray(): Entity[] {\r\n return this.entities.slice();\r\n }\r\n\r\n /**\r\n * \u83B7\u53D6\u5B9E\u4F53\u6570\u91CF\r\n * @returns \u5B9E\u4F53\u6570\u91CF\r\n */\r\n public count(): number {\r\n return this.entities.length;\r\n }\r\n}\r\n\r\n/**\r\n * \u521B\u5EFAECS\u6D41\u5F0FAPI\u5B9E\u4F8B\r\n * @param scene \u573A\u666F\r\n * @param querySystem \u67E5\u8BE2\u7CFB\u7EDF\r\n * @param eventSystem \u4E8B\u4EF6\u7CFB\u7EDF\r\n * @returns ECS\u6D41\u5F0FAPI\u5B9E\u4F8B\r\n */\r\nexport function createECSAPI(\r\n scene: Scene, \r\n querySystem: QuerySystem, \r\n eventSystem: TypeSafeEventSystem\r\n): ECSFluentAPI {\r\n return new ECSFluentAPI(scene, querySystem, eventSystem);\r\n}\r\n\r\n/**\r\n * \u5168\u5C40ECS\u6D41\u5F0FAPI\u5B9E\u4F8B\uFF08\u9700\u8981\u5728\u4F7F\u7528\u524D\u521D\u59CB\u5316\uFF09\r\n */\r\nexport let ECS: ECSFluentAPI;\r\n\r\n/**\r\n * \u521D\u59CB\u5316\u5168\u5C40ECS API\r\n * @param scene \u573A\u666F\r\n * @param querySystem \u67E5\u8BE2\u7CFB\u7EDF\r\n * @param eventSystem \u4E8B\u4EF6\u7CFB\u7EDF\r\n */\r\nexport function initializeECS(\r\n scene: Scene, \r\n querySystem: QuerySystem, \r\n eventSystem: TypeSafeEventSystem\r\n): void {\r\n ECS = createECSAPI(scene, querySystem, eventSystem);\r\n}", "import { Emitter } from './Utils/Emitter';\r\nimport { CoreEvents } from './ECS/CoreEvents';\r\nimport { GlobalManager } from './Utils/GlobalManager';\r\nimport { TimerManager } from './Utils/Timers/TimerManager';\r\nimport { ITimer } from './Utils/Timers/ITimer';\r\nimport { Time } from './Utils/Time';\r\nimport { PerformanceMonitor } from './Utils/PerformanceMonitor';\r\nimport { PoolManager } from './Utils/Pool';\r\nimport { ECSFluentAPI, createECSAPI } from './ECS/Core/FluentAPI';\r\nimport { Scene } from './ECS/Scene';\r\n\r\n/**\r\n * \u6E38\u620F\u5F15\u64CE\u6838\u5FC3\u7C7B\r\n * \r\n * \u8D1F\u8D23\u7BA1\u7406\u6E38\u620F\u7684\u751F\u547D\u5468\u671F\u3001\u573A\u666F\u5207\u6362\u3001\u5168\u5C40\u7BA1\u7406\u5668\u548C\u5B9A\u65F6\u5668\u7CFB\u7EDF\u3002\r\n * \u63D0\u4F9B\u7EDF\u4E00\u7684\u6E38\u620F\u5FAA\u73AF\u548C\u4E8B\u4EF6\u5206\u53D1\u673A\u5236\u3002\r\n * \r\n * @example\r\n * ```typescript\r\n * // \u521B\u5EFA\u6838\u5FC3\u5B9E\u4F8B\r\n * const core = Core.create(true);\r\n * \r\n * // \u8BBE\u7F6E\u573A\u666F\r\n * Core.scene = new MyScene();\r\n * \r\n * // \u8C03\u5EA6\u5B9A\u65F6\u5668\r\n * Core.schedule(1.0, false, null, (timer) => {\r\n * console.log(\"1\u79D2\u540E\u6267\u884C\");\r\n * });\r\n * ```\r\n */\r\nexport class Core {\r\n /**\r\n * \u6838\u5FC3\u4E8B\u4EF6\u53D1\u5C04\u5668\r\n * \r\n * \u7528\u4E8E\u53D1\u5E03\u548C\u8BA2\u9605\u6838\u5FC3\u7EA7\u522B\u7684\u4E8B\u4EF6\uFF0C\u5982\u5E27\u66F4\u65B0\u3001\u573A\u666F\u5207\u6362\u7B49\u3002\r\n */\r\n public static emitter: Emitter<CoreEvents>;\r\n \r\n /**\r\n * \u6E38\u620F\u6682\u505C\u72B6\u6001\r\n * \r\n * \u5F53\u8BBE\u7F6E\u4E3Atrue\u65F6\uFF0C\u6E38\u620F\u5FAA\u73AF\u5C06\u6682\u505C\u6267\u884C\u3002\r\n */\r\n public static paused = false;\r\n \r\n /**\r\n * \u5168\u5C40\u6838\u5FC3\u5B9E\u4F8B\r\n */\r\n private static _instance: Core;\r\n \r\n /**\r\n * \u5B9E\u4F53\u7CFB\u7EDF\u542F\u7528\u72B6\u6001\r\n * \r\n * \u63A7\u5236\u662F\u5426\u542F\u7528ECS\u5B9E\u4F53\u7CFB\u7EDF\u529F\u80FD\u3002\r\n */\r\n public static entitySystemsEnabled: boolean;\r\n \r\n /**\r\n * \u8C03\u8BD5\u6A21\u5F0F\u6807\u5FD7\r\n * \r\n * \u5728\u8C03\u8BD5\u6A21\u5F0F\u4E0B\u4F1A\u542F\u7528\u989D\u5916\u7684\u6027\u80FD\u76D1\u63A7\u548C\u9519\u8BEF\u68C0\u67E5\u3002\r\n */\r\n public readonly debug: boolean;\r\n \r\n /**\r\n * \u5F85\u5207\u6362\u7684\u573A\u666F\r\n * \r\n * \u5B58\u50A8\u4E0B\u4E00\u5E27\u8981\u5207\u6362\u5230\u7684\u573A\u666F\u5B9E\u4F8B\u3002\r\n */\r\n public _nextScene: Scene | null = null;\r\n \r\n /**\r\n * \u5168\u5C40\u7BA1\u7406\u5668\u96C6\u5408\r\n * \r\n * \u5B58\u50A8\u6240\u6709\u6CE8\u518C\u7684\u5168\u5C40\u7BA1\u7406\u5668\u5B9E\u4F8B\u3002\r\n */\r\n public _globalManagers: GlobalManager[] = [];\r\n \r\n /**\r\n * \u5B9A\u65F6\u5668\u7BA1\u7406\u5668\r\n * \r\n * \u8D1F\u8D23\u7BA1\u7406\u6240\u6709\u7684\u6E38\u620F\u5B9A\u65F6\u5668\u3002\r\n */\r\n public _timerManager: TimerManager;\r\n\r\n /**\r\n * \u6027\u80FD\u76D1\u63A7\u5668\r\n * \r\n * \u76D1\u63A7\u6E38\u620F\u6027\u80FD\u5E76\u63D0\u4F9B\u4F18\u5316\u5EFA\u8BAE\u3002\r\n */\r\n public _performanceMonitor: PerformanceMonitor;\r\n\r\n /**\r\n * \u5BF9\u8C61\u6C60\u7BA1\u7406\u5668\r\n * \r\n * \u7BA1\u7406\u6240\u6709\u5BF9\u8C61\u6C60\u7684\u751F\u547D\u5468\u671F\u3002\r\n */\r\n public _poolManager: PoolManager;\r\n\r\n /**\r\n * ECS\u6D41\u5F0FAPI\r\n * \r\n * \u63D0\u4F9B\u4FBF\u6377\u7684ECS\u64CD\u4F5C\u63A5\u53E3\u3002\r\n */\r\n public _ecsAPI?: ECSFluentAPI;\r\n \r\n /**\r\n * \u5F53\u524D\u6D3B\u52A8\u573A\u666F\r\n */\r\n public _scene?: Scene;\r\n\r\n /**\r\n * \u521B\u5EFA\u6838\u5FC3\u5B9E\u4F8B\r\n * \r\n * @param debug - \u662F\u5426\u542F\u7528\u8C03\u8BD5\u6A21\u5F0F\uFF0C\u9ED8\u8BA4\u4E3Atrue\r\n * @param enableEntitySystems - \u662F\u5426\u542F\u7528\u5B9E\u4F53\u7CFB\u7EDF\uFF0C\u9ED8\u8BA4\u4E3Atrue\r\n */\r\n private constructor(debug: boolean = true, enableEntitySystems: boolean = true) {\r\n Core._instance = this;\r\n Core.emitter = new Emitter<CoreEvents>();\r\n Core.emitter.addObserver(CoreEvents.frameUpdated, this.update, this);\r\n\r\n // \u521D\u59CB\u5316\u7BA1\u7406\u5668\r\n this._timerManager = new TimerManager();\r\n Core.registerGlobalManager(this._timerManager);\r\n\r\n // \u521D\u59CB\u5316\u6027\u80FD\u76D1\u63A7\u5668\r\n this._performanceMonitor = PerformanceMonitor.instance;\r\n\r\n // \u521D\u59CB\u5316\u5BF9\u8C61\u6C60\u7BA1\u7406\u5668\r\n this._poolManager = PoolManager.getInstance();\r\n \r\n Core.entitySystemsEnabled = enableEntitySystems;\r\n this.debug = debug;\r\n this.initialize();\r\n }\r\n\r\n /**\r\n * \u83B7\u53D6\u6838\u5FC3\u5B9E\u4F8B\r\n * \r\n * @returns \u5168\u5C40\u6838\u5FC3\u5B9E\u4F8B\r\n */\r\n public static get Instance() {\r\n return this._instance;\r\n }\r\n\r\n /**\r\n * \u83B7\u53D6\u5F53\u524D\u6D3B\u52A8\u7684\u573A\u666F\r\n * \r\n * @returns \u5F53\u524D\u573A\u666F\u5B9E\u4F8B\uFF0C\u5982\u679C\u6CA1\u6709\u5219\u8FD4\u56DEnull\r\n */\r\n public static get scene(): Scene | null {\r\n if (!this._instance)\r\n return null;\r\n return this._instance._scene || null;\r\n }\r\n\r\n /**\r\n * \u8BBE\u7F6E\u5F53\u524D\u6D3B\u52A8\u7684\u573A\u666F\r\n * \r\n * \u5982\u679C\u5F53\u524D\u6CA1\u6709\u573A\u666F\uFF0C\u4F1A\u7ACB\u5373\u5207\u6362\uFF1B\u5426\u5219\u4F1A\u5728\u4E0B\u4E00\u5E27\u5207\u6362\u3002\r\n * \r\n * @param value - \u8981\u8BBE\u7F6E\u7684\u573A\u666F\u5B9E\u4F8B\r\n * @throws {Error} \u5F53\u573A\u666F\u4E3A\u7A7A\u65F6\u629B\u51FA\u9519\u8BEF\r\n */\r\n public static set scene(value: Scene | null) {\r\n if (!value) return;\r\n \r\n if (!value) {\r\n throw new Error(\"\u573A\u666F\u4E0D\u80FD\u4E3A\u7A7A\");\r\n }\r\n\r\n if (this._instance._scene == null) {\r\n this._instance._scene = value;\r\n this._instance.onSceneChanged();\r\n this._instance._scene.begin();\r\n } else {\r\n this._instance._nextScene = value;\r\n }\r\n }\r\n\r\n /**\r\n * \u521B\u5EFACore\u5B9E\u4F8B\r\n * \r\n * \u5982\u679C\u5B9E\u4F8B\u5DF2\u5B58\u5728\uFF0C\u5219\u8FD4\u56DE\u73B0\u6709\u5B9E\u4F8B\u3002\r\n * \r\n * @param debug - \u662F\u5426\u4E3A\u8C03\u8BD5\u6A21\u5F0F\uFF0C\u9ED8\u8BA4\u4E3Atrue\r\n * @returns Core\u5B9E\u4F8B\r\n */\r\n public static create(debug: boolean = true): Core {\r\n if (this._instance == null) {\r\n this._instance = new Core(debug);\r\n }\r\n return this._instance;\r\n }\r\n\r\n /**\r\n * \u6CE8\u518C\u5168\u5C40\u7BA1\u7406\u5668\r\n * \r\n * \u5C06\u7BA1\u7406\u5668\u6DFB\u52A0\u5230\u5168\u5C40\u7BA1\u7406\u5668\u5217\u8868\u4E2D\uFF0C\u5E76\u542F\u7528\u5B83\u3002\r\n * \r\n * @param manager - \u8981\u6CE8\u518C\u7684\u5168\u5C40\u7BA1\u7406\u5668\r\n */\r\n public static registerGlobalManager(manager: GlobalManager) {\r\n this._instance._globalManagers.push(manager);\r\n manager.enabled = true;\r\n }\r\n\r\n /**\r\n * \u6CE8\u9500\u5168\u5C40\u7BA1\u7406\u5668\r\n * \r\n * \u4ECE\u5168\u5C40\u7BA1\u7406\u5668\u5217\u8868\u4E2D\u79FB\u9664\u7BA1\u7406\u5668\uFF0C\u5E76\u7981\u7528\u5B83\u3002\r\n * \r\n * @param manager - \u8981\u6CE8\u9500\u7684\u5168\u5C40\u7BA1\u7406\u5668\r\n */\r\n public static unregisterGlobalManager(manager: GlobalManager) {\r\n this._instance._globalManagers.splice(this._instance._globalManagers.indexOf(manager), 1);\r\n manager.enabled = false;\r\n }\r\n\r\n /**\r\n * \u83B7\u53D6\u6307\u5B9A\u7C7B\u578B\u7684\u5168\u5C40\u7BA1\u7406\u5668\r\n * \r\n * @param type - \u7BA1\u7406\u5668\u7C7B\u578B\u6784\u9020\u51FD\u6570\r\n * @returns \u7BA1\u7406\u5668\u5B9E\u4F8B\uFF0C\u5982\u679C\u672A\u627E\u5230\u5219\u8FD4\u56DEnull\r\n */\r\n public static getGlobalManager<T extends GlobalManager>(type: new (...args: any[]) => T): T | null {\r\n for (const manager of this._instance._globalManagers) {\r\n if (manager instanceof type)\r\n return manager as T;\r\n }\r\n return null;\r\n }\r\n\r\n /**\r\n * \u8C03\u5EA6\u5B9A\u65F6\u5668\r\n * \r\n * \u521B\u5EFA\u4E00\u4E2A\u5B9A\u65F6\u5668\uFF0C\u5728\u6307\u5B9A\u65F6\u95F4\u540E\u6267\u884C\u56DE\u8C03\u51FD\u6570\u3002\r\n * \r\n * @param timeInSeconds - \u5EF6\u8FDF\u65F6\u95F4\uFF08\u79D2\uFF09\r\n * @param repeats - \u662F\u5426\u91CD\u590D\u6267\u884C\uFF0C\u9ED8\u8BA4\u4E3Afalse\r\n * @param context - \u56DE\u8C03\u51FD\u6570\u7684\u4E0A\u4E0B\u6587\uFF0C\u9ED8\u8BA4\u4E3Anull\r\n * @param onTime - \u5B9A\u65F6\u5668\u89E6\u53D1\u65F6\u7684\u56DE\u8C03\u51FD\u6570\r\n * @returns \u521B\u5EFA\u7684\u5B9A\u65F6\u5668\u5B9E\u4F8B\r\n */\r\n public static schedule(timeInSeconds: number, repeats: boolean = false, context: any = null, onTime: (timer: ITimer) => void) {\r\n return this._instance._timerManager.schedule(timeInSeconds, repeats, context, onTime);\r\n }\r\n\r\n /**\r\n * \u83B7\u53D6ECS\u6D41\u5F0FAPI\r\n * \r\n * @returns ECS API\u5B9E\u4F8B\uFF0C\u5982\u679C\u672A\u521D\u59CB\u5316\u5219\u8FD4\u56DEnull\r\n */\r\n public static get ecsAPI(): ECSFluentAPI | null {\r\n return this._instance?._ecsAPI || null;\r\n }\r\n\r\n /**\r\n * \u573A\u666F\u5207\u6362\u56DE\u8C03\r\n * \r\n * \u5728\u573A\u666F\u5207\u6362\u65F6\u8C03\u7528\uFF0C\u7528\u4E8E\u91CD\u7F6E\u65F6\u95F4\u7CFB\u7EDF\u7B49\u3002\r\n */\r\n public onSceneChanged() {\r\n Time.sceneChanged();\r\n \r\n // \u521D\u59CB\u5316ECS API\uFF08\u5982\u679C\u573A\u666F\u652F\u6301\uFF09\r\n if (this._scene && typeof (this._scene as any).querySystem !== 'undefined') {\r\n const scene = this._scene as any;\r\n this._ecsAPI = createECSAPI(scene, scene.querySystem, scene.eventSystem);\r\n }\r\n }\r\n\r\n /**\r\n * \u521D\u59CB\u5316\u6838\u5FC3\u7CFB\u7EDF\r\n * \r\n * \u6267\u884C\u6838\u5FC3\u7CFB\u7EDF\u7684\u521D\u59CB\u5316\u903B\u8F91\u3002\r\n */\r\n protected initialize() {\r\n // \u6838\u5FC3\u7CFB\u7EDF\u521D\u59CB\u5316\r\n }\r\n\r\n /**\r\n * \u6E38\u620F\u4E3B\u5FAA\u73AF\u66F4\u65B0\r\n * \r\n * \u6BCF\u5E27\u8C03\u7528\uFF0C\u8D1F\u8D23\u66F4\u65B0\u65F6\u95F4\u7CFB\u7EDF\u3001\u5168\u5C40\u7BA1\u7406\u5668\u548C\u5F53\u524D\u573A\u666F\u3002\r\n * \r\n * @param currentTime - \u5F53\u524D\u65F6\u95F4\u6233\uFF0C\u9ED8\u8BA4\u4E3A-1\uFF08\u4F7F\u7528\u7CFB\u7EDF\u65F6\u95F4\uFF09\r\n */\r\n protected update(currentTime: number = -1): void {\r\n if (Core.paused) return;\r\n\r\n // \u5F00\u59CB\u6027\u80FD\u76D1\u63A7\r\n const frameStartTime = this._performanceMonitor.startMonitoring('Core.update');\r\n\r\n Time.update(currentTime);\r\n\r\n // \u66F4\u65B0FPS\u76D1\u63A7\uFF08\u5982\u679C\u6027\u80FD\u76D1\u63A7\u5668\u652F\u6301\uFF09\r\n if (typeof (this._performanceMonitor as any).updateFPS === 'function') {\r\n (this._performanceMonitor as any).updateFPS(Time.deltaTime);\r\n }\r\n\r\n // \u66F4\u65B0\u5168\u5C40\u7BA1\u7406\u5668\r\n const managersStartTime = this._performanceMonitor.startMonitoring('GlobalManagers.update');\r\n for (const globalManager of this._globalManagers) {\r\n if (globalManager.enabled)\r\n globalManager.update();\r\n }\r\n this._performanceMonitor.endMonitoring('GlobalManagers.update', managersStartTime, this._globalManagers.length);\r\n\r\n // \u66F4\u65B0\u5BF9\u8C61\u6C60\u7BA1\u7406\u5668\r\n this._poolManager.update();\r\n\r\n // \u5904\u7406\u573A\u666F\u5207\u6362\r\n if (this._nextScene != null) {\r\n if (this._scene != null)\r\n this._scene.end();\r\n\r\n this._scene = this._nextScene;\r\n this._nextScene = null;\r\n this.onSceneChanged();\r\n this._scene.begin();\r\n }\r\n\r\n // \u66F4\u65B0\u5F53\u524D\u573A\u666F\r\n if (this._scene != null && this._scene.update) {\r\n const sceneStartTime = this._performanceMonitor.startMonitoring('Scene.update');\r\n this._scene.update();\r\n const entityCount = (this._scene as any).entities?.count || 0;\r\n this._performanceMonitor.endMonitoring('Scene.update', sceneStartTime, entityCount);\r\n }\r\n\r\n // \u7ED3\u675F\u6027\u80FD\u76D1\u63A7\r\n this._performanceMonitor.endMonitoring('Core.update', frameStartTime);\r\n }\r\n}\r\n", "/**\r\n * \u6E38\u620F\u7EC4\u4EF6\u57FA\u7C7B\r\n * \r\n * ECS\u67B6\u6784\u4E2D\u7684\u7EC4\u4EF6\uFF08Component\uFF09\uFF0C\u7528\u4E8E\u5B9E\u73B0\u5177\u4F53\u7684\u6E38\u620F\u529F\u80FD\u3002\r\n * \u7EC4\u4EF6\u5305\u542B\u6570\u636E\u548C\u884C\u4E3A\uFF0C\u53EF\u4EE5\u88AB\u6DFB\u52A0\u5230\u5B9E\u4F53\u4E0A\u4EE5\u6269\u5C55\u5B9E\u4F53\u7684\u529F\u80FD\u3002\r\n * \r\n * @example\r\n * ```typescript\r\n * class HealthComponent extends Component {\r\n * public health: number = 100;\r\n * \r\n * public takeDamage(damage: number): void {\r\n * this.health -= damage;\r\n * if (this.health <= 0) {\r\n * this.entity.destroy();\r\n * }\r\n * }\r\n * }\r\n * ```\r\n */\r\nexport abstract class Component {\r\n /**\r\n * \u7EC4\u4EF6ID\u751F\u6210\u5668\r\n * \r\n * \u7528\u4E8E\u4E3A\u6BCF\u4E2A\u7EC4\u4EF6\u5206\u914D\u552F\u4E00\u7684ID\u3002\r\n */\r\n public static _idGenerator: number = 0;\r\n \r\n /**\r\n * \u7EC4\u4EF6\u552F\u4E00\u6807\u8BC6\u7B26\r\n * \r\n * \u5728\u6574\u4E2A\u6E38\u620F\u751F\u547D\u5468\u671F\u4E2D\u552F\u4E00\u7684\u6570\u5B57ID\u3002\r\n */\r\n public readonly id: number;\r\n \r\n /**\r\n * \u7EC4\u4EF6\u6240\u5C5E\u7684\u5B9E\u4F53\r\n * \r\n * \u6307\u5411\u62E5\u6709\u6B64\u7EC4\u4EF6\u7684\u5B9E\u4F53\u5B9E\u4F8B\u3002\r\n */\r\n public entity!: Entity;\r\n \r\n /**\r\n * \u7EC4\u4EF6\u542F\u7528\u72B6\u6001\r\n * \r\n * \u63A7\u5236\u7EC4\u4EF6\u662F\u5426\u53C2\u4E0E\u66F4\u65B0\u5FAA\u73AF\u3002\r\n */\r\n private _enabled: boolean = true;\r\n \r\n /**\r\n * \u66F4\u65B0\u987A\u5E8F\r\n * \r\n * \u51B3\u5B9A\u7EC4\u4EF6\u5728\u66F4\u65B0\u5FAA\u73AF\u4E2D\u7684\u6267\u884C\u987A\u5E8F\u3002\r\n */\r\n private _updateOrder: number = 0;\r\n\r\n /**\r\n * \u521B\u5EFA\u7EC4\u4EF6\u5B9E\u4F8B\r\n * \r\n * \u81EA\u52A8\u5206\u914D\u552F\u4E00ID\u7ED9\u7EC4\u4EF6\u3002\r\n */\r\n constructor() {\r\n this.id = Component._idGenerator++;\r\n }\r\n\r\n /**\r\n * \u83B7\u53D6\u7EC4\u4EF6\u542F\u7528\u72B6\u6001\r\n * \r\n * \u7EC4\u4EF6\u7684\u5B9E\u9645\u542F\u7528\u72B6\u6001\u53D6\u51B3\u4E8E\u81EA\u8EAB\u72B6\u6001\u548C\u6240\u5C5E\u5B9E\u4F53\u7684\u72B6\u6001\u3002\r\n * \r\n * @returns \u5982\u679C\u7EC4\u4EF6\u548C\u6240\u5C5E\u5B9E\u4F53\u90FD\u542F\u7528\u5219\u8FD4\u56DEtrue\r\n */\r\n public get enabled(): boolean {\r\n return this.entity ? this.entity.enabled && this._enabled : this._enabled;\r\n }\r\n\r\n /**\r\n * \u8BBE\u7F6E\u7EC4\u4EF6\u542F\u7528\u72B6\u6001\r\n * \r\n * \u5F53\u72B6\u6001\u6539\u53D8\u65F6\u4F1A\u89E6\u53D1\u76F8\u5E94\u7684\u751F\u547D\u5468\u671F\u56DE\u8C03\u3002\r\n * \r\n * @param value - \u65B0\u7684\u542F\u7528\u72B6\u6001\r\n */\r\n public set enabled(value: boolean) {\r\n if (this._enabled !== value) {\r\n this._enabled = value;\r\n if (this._enabled) {\r\n this.onEnabled();\r\n } else {\r\n this.onDisabled();\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * \u83B7\u53D6\u66F4\u65B0\u987A\u5E8F\r\n * \r\n * @returns \u7EC4\u4EF6\u7684\u66F4\u65B0\u987A\u5E8F\u503C\r\n */\r\n public get updateOrder(): number {\r\n return this._updateOrder;\r\n }\r\n\r\n /**\r\n * \u8BBE\u7F6E\u66F4\u65B0\u987A\u5E8F\r\n * \r\n * @param value - \u65B0\u7684\u66F4\u65B0\u987A\u5E8F\u503C\r\n */\r\n public set updateOrder(value: number) {\r\n this._updateOrder = value;\r\n }\r\n\r\n /**\r\n * \u7EC4\u4EF6\u6DFB\u52A0\u5230\u5B9E\u4F53\u65F6\u7684\u56DE\u8C03\r\n * \r\n * \u5F53\u7EC4\u4EF6\u88AB\u6DFB\u52A0\u5230\u5B9E\u4F53\u65F6\u8C03\u7528\uFF0C\u53EF\u4EE5\u5728\u6B64\u65B9\u6CD5\u4E2D\u8FDB\u884C\u521D\u59CB\u5316\u64CD\u4F5C\u3002\r\n */\r\n public onAddedToEntity(): void {\r\n }\r\n\r\n /**\r\n * \u7EC4\u4EF6\u4ECE\u5B9E\u4F53\u79FB\u9664\u65F6\u7684\u56DE\u8C03\r\n * \r\n * \u5F53\u7EC4\u4EF6\u4ECE\u5B9E\u4F53\u4E2D\u79FB\u9664\u65F6\u8C03\u7528\uFF0C\u53EF\u4EE5\u5728\u6B64\u65B9\u6CD5\u4E2D\u8FDB\u884C\u6E05\u7406\u64CD\u4F5C\u3002\r\n */\r\n public onRemovedFromEntity(): void {\r\n }\r\n\r\n /**\r\n * \u7EC4\u4EF6\u542F\u7528\u65F6\u7684\u56DE\u8C03\r\n * \r\n * \u5F53\u7EC4\u4EF6\u88AB\u542F\u7528\u65F6\u8C03\u7528\u3002\r\n */\r\n public onEnabled(): void {\r\n }\r\n\r\n /**\r\n * \u7EC4\u4EF6\u7981\u7528\u65F6\u7684\u56DE\u8C03\r\n * \r\n * \u5F53\u7EC4\u4EF6\u88AB\u7981\u7528\u65F6\u8C03\u7528\u3002\r\n */\r\n public onDisabled(): void {\r\n }\r\n\r\n /**\r\n * \u66F4\u65B0\u7EC4\u4EF6\r\n * \r\n * \u6BCF\u5E27\u8C03\u7528\uFF0C\u7528\u4E8E\u66F4\u65B0\u7EC4\u4EF6\u7684\u903B\u8F91\u3002\r\n * \u5B50\u7C7B\u5E94\u8BE5\u91CD\u5199\u6B64\u65B9\u6CD5\u6765\u5B9E\u73B0\u5177\u4F53\u7684\u66F4\u65B0\u903B\u8F91\u3002\r\n */\r\n public update(): void {\r\n }\r\n}\r\n\r\n// \u907F\u514D\u5FAA\u73AF\u5F15\u7528\uFF0C\u5728\u6587\u4EF6\u672B\u5C3E\u5BFC\u5165Entity\r\nimport type { Entity } from './Entity'; ", "/**\r\n * \u9AD8\u6027\u80FD\u4F4D\u64CD\u4F5C\u7C7B\r\n * \u7528\u4E8E\u5FEB\u901F\u64CD\u4F5C\u4F4D\u6570\u7EC4\uFF0C\u652F\u6301\u7EC4\u4EF6\u5339\u914D\u7B49\u573A\u666F\r\n */\r\nexport class Bits {\r\n private _words: number[] = [];\r\n private static readonly WORD_SIZE = 32;\r\n\r\n constructor() {\r\n this._words = [];\r\n }\r\n\r\n /**\r\n * \u8BBE\u7F6E\u6307\u5B9A\u4F4D\u7F6E\u7684\u4F4D\u4E3A1\r\n * @param index \u4F4D\u7F6E\u7D22\u5F15\r\n */\r\n public set(index: number): void {\r\n const wordIndex = Math.floor(index / Bits.WORD_SIZE);\r\n const bitIndex = index % Bits.WORD_SIZE;\r\n \r\n // \u786E\u4FDD\u6570\u7EC4\u8DB3\u591F\u5927\r\n while (this._words.length <= wordIndex) {\r\n this._words.push(0);\r\n }\r\n \r\n this._words[wordIndex] |= (1 << bitIndex);\r\n }\r\n\r\n /**\r\n * \u6E05\u9664\u6307\u5B9A\u4F4D\u7F6E\u7684\u4F4D\uFF08\u8BBE\u4E3A0\uFF09\r\n * @param index \u4F4D\u7F6E\u7D22\u5F15\r\n */\r\n public clear(index: number): void {\r\n const wordIndex = Math.floor(index / Bits.WORD_SIZE);\r\n const bitIndex = index % Bits.WORD_SIZE;\r\n \r\n if (wordIndex < this._words.length) {\r\n this._words[wordIndex] &= ~(1 << bitIndex);\r\n }\r\n }\r\n\r\n /**\r\n * \u83B7\u53D6\u6307\u5B9A\u4F4D\u7F6E\u7684\u4F4D\u503C\r\n * @param index \u4F4D\u7F6E\u7D22\u5F15\r\n * @returns \u4F4D\u503C\uFF08true\u6216false\uFF09\r\n */\r\n public get(index: number): boolean {\r\n const wordIndex = Math.floor(index / Bits.WORD_SIZE);\r\n const bitIndex = index % Bits.WORD_SIZE;\r\n \r\n if (wordIndex >= this._words.length) {\r\n return false;\r\n }\r\n \r\n return (this._words[wordIndex] & (1 << bitIndex)) !== 0;\r\n }\r\n\r\n /**\r\n * \u68C0\u67E5\u662F\u5426\u5305\u542B\u6240\u6709\u6307\u5B9A\u7684\u4F4D\r\n * @param other \u53E6\u4E00\u4E2ABits\u5BF9\u8C61\r\n * @returns \u5982\u679C\u5305\u542B\u6240\u6709\u4F4D\u5219\u8FD4\u56DEtrue\r\n */\r\n public containsAll(other: Bits): boolean {\r\n const maxLength = Math.max(this._words.length, other._words.length);\r\n \r\n for (let i = 0; i < maxLength; i++) {\r\n const thisWord = i < this._words.length ? this._words[i] : 0;\r\n const otherWord = i < other._words.length ? other._words[i] : 0;\r\n \r\n if ((thisWord & otherWord) !== otherWord) {\r\n return false;\r\n }\r\n }\r\n \r\n return true;\r\n }\r\n\r\n /**\r\n * \u68C0\u67E5\u662F\u5426\u5305\u542B\u4EFB\u610F\u4E00\u4E2A\u6307\u5B9A\u7684\u4F4D\r\n * @param other \u53E6\u4E00\u4E2ABits\u5BF9\u8C61\r\n * @returns \u5982\u679C\u5305\u542B\u4EFB\u610F\u4F4D\u5219\u8FD4\u56DEtrue\r\n */\r\n public intersects(other: Bits): boolean {\r\n const minLength = Math.min(this._words.length, other._words.length);\r\n \r\n for (let i = 0; i < minLength; i++) {\r\n if ((this._words[i] & other._words[i]) !== 0) {\r\n return true;\r\n }\r\n }\r\n \r\n return false;\r\n }\r\n\r\n /**\r\n * \u68C0\u67E5\u662F\u5426\u4E0D\u5305\u542B\u4EFB\u4F55\u6307\u5B9A\u7684\u4F4D\r\n * @param other \u53E6\u4E00\u4E2ABits\u5BF9\u8C61\r\n * @returns \u5982\u679C\u4E0D\u5305\u542B\u4EFB\u4F55\u4F4D\u5219\u8FD4\u56DEtrue\r\n */\r\n public excludes(other: Bits): boolean {\r\n return !this.intersects(other);\r\n }\r\n\r\n /**\r\n * \u6E05\u7A7A\u6240\u6709\u4F4D\r\n */\r\n public clearAll(): void {\r\n this._words.length = 0;\r\n }\r\n\r\n /**\r\n * \u68C0\u67E5\u662F\u5426\u4E3A\u7A7A\uFF08\u6CA1\u6709\u8BBE\u7F6E\u4EFB\u4F55\u4F4D\uFF09\r\n * @returns \u5982\u679C\u4E3A\u7A7A\u5219\u8FD4\u56DEtrue\r\n */\r\n public isEmpty(): boolean {\r\n for (const word of this._words) {\r\n if (word !== 0) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n /**\r\n * \u83B7\u53D6\u8BBE\u7F6E\u7684\u4F4D\u6570\u91CF\r\n * @returns \u8BBE\u7F6E\u7684\u4F4D\u6570\u91CF\r\n */\r\n public cardinality(): number {\r\n let count = 0;\r\n for (const word of this._words) {\r\n count += this.popCount(word);\r\n }\r\n return count;\r\n }\r\n\r\n /**\r\n * \u8BA1\u7B97\u4E00\u4E2A32\u4F4D\u6574\u6570\u4E2D\u8BBE\u7F6E\u7684\u4F4D\u6570\u91CF\r\n * @param n 32\u4F4D\u6574\u6570\r\n * @returns \u8BBE\u7F6E\u7684\u4F4D\u6570\u91CF\r\n */\r\n private popCount(n: number): number {\r\n n = n - ((n >>> 1) & 0x55555555);\r\n n = (n & 0x33333333) + ((n >>> 2) & 0x33333333);\r\n return (((n + (n >>> 4)) & 0xF0F0F0F) * 0x1010101) >>> 24;\r\n }\r\n\r\n /**\r\n * \u590D\u5236\u53E6\u4E00\u4E2ABits\u5BF9\u8C61\r\n * @param other \u8981\u590D\u5236\u7684Bits\u5BF9\u8C61\r\n */\r\n public copyFrom(other: Bits): void {\r\n this._words = [...other._words];\r\n }\r\n\r\n /**\r\n * \u521B\u5EFA\u5F53\u524DBits\u7684\u526F\u672C\r\n * @returns \u65B0\u7684Bits\u5BF9\u8C61\r\n */\r\n public clone(): Bits {\r\n const newBits = new Bits();\r\n newBits.copyFrom(this);\r\n return newBits;\r\n }\r\n}", "import { Component } from '../Component';\r\nimport { Bits } from './Bits';\r\n\r\n/**\r\n * \u7EC4\u4EF6\u7C7B\u578B\u7BA1\u7406\u5668\r\n * \u8D1F\u8D23\u7BA1\u7406\u7EC4\u4EF6\u7C7B\u578B\u7684\u6CE8\u518C\u548CID\u5206\u914D\r\n */\r\nexport class ComponentTypeManager {\r\n private static _instance: ComponentTypeManager;\r\n private _componentTypes = new Map<Function, number>();\r\n private _typeNames = new Map<number, string>();\r\n private _nextTypeId = 0;\r\n\r\n /**\r\n * \u83B7\u53D6\u5355\u4F8B\u5B9E\u4F8B\r\n */\r\n public static get instance(): ComponentTypeManager {\r\n if (!ComponentTypeManager._instance) {\r\n ComponentTypeManager._instance = new ComponentTypeManager();\r\n }\r\n return ComponentTypeManager._instance;\r\n }\r\n\r\n private constructor() {}\r\n\r\n /**\r\n * \u83B7\u53D6\u7EC4\u4EF6\u7C7B\u578B\u7684ID\r\n * @param componentType \u7EC4\u4EF6\u7C7B\u578B\u6784\u9020\u51FD\u6570\r\n * @returns \u7EC4\u4EF6\u7C7B\u578BID\r\n */\r\n public getTypeId<T extends Component>(componentType: new (...args: any[]) => T): number {\r\n let typeId = this._componentTypes.get(componentType);\r\n \r\n if (typeId === undefined) {\r\n typeId = this._nextTypeId++;\r\n this._componentTypes.set(componentType, typeId);\r\n this._typeNames.set(typeId, componentType.name);\r\n }\r\n \r\n return typeId;\r\n }\r\n\r\n /**\r\n * \u83B7\u53D6\u7EC4\u4EF6\u7C7B\u578B\u540D\u79F0\r\n * @param typeId \u7EC4\u4EF6\u7C7B\u578BID\r\n * @returns \u7EC4\u4EF6\u7C7B\u578B\u540D\u79F0\r\n */\r\n public getTypeName(typeId: number): string {\r\n return this._typeNames.get(typeId) || 'Unknown';\r\n }\r\n\r\n /**\r\n * \u521B\u5EFA\u5305\u542B\u6307\u5B9A\u7EC4\u4EF6\u7C7B\u578B\u7684Bits\u5BF9\u8C61\r\n * @param componentTypes \u7EC4\u4EF6\u7C7B\u578B\u6784\u9020\u51FD\u6570\u6570\u7EC4\r\n * @returns Bits\u5BF9\u8C61\r\n */\r\n public createBits(...componentTypes: (new (...args: any[]) => Component)[]): Bits {\r\n const bits = new Bits();\r\n \r\n for (const componentType of componentTypes) {\r\n const typeId = this.getTypeId(componentType);\r\n bits.set(typeId);\r\n }\r\n \r\n return bits;\r\n }\r\n\r\n /**\r\n * \u83B7\u53D6\u5B9E\u4F53\u7684\u7EC4\u4EF6\u4F4D\u63A9\u7801\r\n * @param components \u7EC4\u4EF6\u6570\u7EC4\r\n * @returns Bits\u5BF9\u8C61\r\n */\r\n public getEntityBits(components: Component[]): Bits {\r\n const bits = new Bits();\r\n \r\n for (const component of components) {\r\n const typeId = this.getTypeId(component.constructor as new (...args: any[]) => Component);\r\n bits.set(typeId);\r\n }\r\n \r\n return bits;\r\n }\r\n\r\n /**\r\n * \u91CD\u7F6E\u7BA1\u7406\u5668\uFF08\u4E3B\u8981\u7528\u4E8E\u6D4B\u8BD5\uFF09\r\n */\r\n public reset(): void {\r\n this._componentTypes.clear();\r\n this._typeNames.clear();\r\n this._nextTypeId = 0;\r\n }\r\n\r\n /**\r\n * \u83B7\u53D6\u5DF2\u6CE8\u518C\u7684\u7EC4\u4EF6\u7C7B\u578B\u6570\u91CF\r\n */\r\n public get registeredTypeCount(): number {\r\n return this._componentTypes.size;\r\n }\r\n} ", "import { Entity } from '../Entity';\r\nimport { Component } from '../Component';\r\nimport { Bits } from './Bits';\r\nimport { ComponentTypeManager } from './ComponentTypeManager';\r\n\r\n/**\r\n * \u9AD8\u6027\u80FD\u5B9E\u4F53\u5339\u914D\u5668\r\n * \u7528\u4E8E\u5FEB\u901F\u5339\u914D\u7B26\u5408\u6761\u4EF6\u7684\u5B9E\u4F53\r\n */\r\nexport class Matcher {\r\n protected allSet: (new (...args: any[]) => Component)[] = [];\r\n protected exclusionSet: (new (...args: any[]) => Component)[] = [];\r\n protected oneSet: (new (...args: any[]) => Component)[] = [];\r\n\r\n // \u7F13\u5B58\u7684\u4F4D\u63A9\u7801\uFF0C\u907F\u514D\u91CD\u590D\u8BA1\u7B97\r\n private _allBits?: Bits;\r\n private _exclusionBits?: Bits;\r\n private _oneBits?: Bits;\r\n private _isDirty = true;\r\n\r\n public static empty(): Matcher {\r\n return new Matcher();\r\n }\r\n\r\n public getAllSet(): (new (...args: any[]) => Component)[] {\r\n return this.allSet;\r\n }\r\n\r\n public getExclusionSet(): (new (...args: any[]) => Component)[] {\r\n return this.exclusionSet;\r\n }\r\n\r\n public getOneSet(): (new (...args: any[]) => Component)[] {\r\n return this.oneSet;\r\n }\r\n\r\n /**\r\n * \u68C0\u67E5\u5B9E\u4F53\u662F\u5426\u5339\u914D\u6761\u4EF6\r\n * @param entity \u8981\u68C0\u67E5\u7684\u5B9E\u4F53\r\n * @returns \u662F\u5426\u5339\u914D\r\n */\r\n public isInterestedEntity(entity: Entity): boolean {\r\n const entityBits = this.getEntityBits(entity);\r\n return this.isInterested(entityBits);\r\n }\r\n\r\n /**\r\n * \u68C0\u67E5\u7EC4\u4EF6\u4F4D\u63A9\u7801\u662F\u5426\u5339\u914D\u6761\u4EF6\r\n * @param componentBits \u7EC4\u4EF6\u4F4D\u63A9\u7801\r\n * @returns \u662F\u5426\u5339\u914D\r\n */\r\n public isInterested(componentBits: Bits): boolean {\r\n this.updateBitsIfDirty();\r\n\r\n // \u68C0\u67E5\u5FC5\u987B\u5305\u542B\u7684\u7EC4\u4EF6\r\n if (this._allBits && !componentBits.containsAll(this._allBits)) {\r\n return false;\r\n }\r\n\r\n // \u68C0\u67E5\u6392\u9664\u7684\u7EC4\u4EF6\r\n if (this._exclusionBits && componentBits.intersects(this._exclusionBits)) {\r\n return false;\r\n }\r\n\r\n // \u68C0\u67E5\u81F3\u5C11\u5305\u542B\u5176\u4E2D\u4E4B\u4E00\u7684\u7EC4\u4EF6\r\n if (this._oneBits && !componentBits.intersects(this._oneBits)) {\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * \u6DFB\u52A0\u6240\u6709\u5305\u542B\u7684\u7EC4\u4EF6\u7C7B\u578B\r\n * @param types \u6240\u6709\u5305\u542B\u7684\u7EC4\u4EF6\u7C7B\u578B\u5217\u8868\r\n */\r\n public all(...types: (new (...args: any[]) => Component)[]): Matcher {\r\n this.allSet.push(...types);\r\n this._isDirty = true;\r\n return this;\r\n }\r\n\r\n /**\r\n * \u6DFB\u52A0\u6392\u9664\u5305\u542B\u7684\u7EC4\u4EF6\u7C7B\u578B\r\n * @param types \u6392\u9664\u5305\u542B\u7684\u7EC4\u4EF6\u7C7B\u578B\u5217\u8868\r\n */\r\n public exclude(...types: (new (...args: any[]) => Component)[]): Matcher {\r\n this.exclusionSet.push(...types);\r\n this._isDirty = true;\r\n return this;\r\n }\r\n\r\n /**\r\n * \u6DFB\u52A0\u81F3\u5C11\u5305\u542B\u5176\u4E2D\u4E4B\u4E00\u7684\u7EC4\u4EF6\u7C7B\u578B\r\n * @param types \u81F3\u5C11\u5305\u542B\u5176\u4E2D\u4E4B\u4E00\u7684\u7EC4\u4EF6\u7C7B\u578B\u5217\u8868\r\n */\r\n public one(...types: (new (...args: any[]) => Component)[]): Matcher {\r\n this.oneSet.push(...types);\r\n this._isDirty = true;\r\n return this;\r\n }\r\n\r\n /**\r\n * \u83B7\u53D6\u5B9E\u4F53\u7684\u7EC4\u4EF6\u4F4D\u63A9\u7801\r\n * @param entity \u5B9E\u4F53\r\n * @returns \u7EC4\u4EF6\u4F4D\u63A9\u7801\r\n */\r\n private getEntityBits(entity: Entity): Bits {\r\n const components = entity.components;\r\n return ComponentTypeManager.instance.getEntityBits(components);\r\n }\r\n\r\n /**\r\n * \u5982\u679C\u4F4D\u63A9\u7801\u5DF2\u8FC7\u671F\uFF0C\u5219\u66F4\u65B0\u5B83\u4EEC\r\n */\r\n private updateBitsIfDirty(): void {\r\n if (!this._isDirty) {\r\n return;\r\n }\r\n\r\n const typeManager = ComponentTypeManager.instance;\r\n\r\n // \u66F4\u65B0\u5FC5\u987B\u5305\u542B\u7684\u7EC4\u4EF6\u4F4D\u63A9\u7801\r\n if (this.allSet.length > 0) {\r\n this._allBits = typeManager.createBits(...this.allSet);\r\n } else {\r\n this._allBits = undefined;\r\n }\r\n\r\n // \u66F4\u65B0\u6392\u9664\u7684\u7EC4\u4EF6\u4F4D\u63A9\u7801\r\n if (this.exclusionSet.length > 0) {\r\n this._exclusionBits = typeManager.createBits(...this.exclusionSet);\r\n } else {\r\n this._exclusionBits = undefined;\r\n }\r\n\r\n // \u66F4\u65B0\u81F3\u5C11\u5305\u542B\u5176\u4E2D\u4E4B\u4E00\u7684\u7EC4\u4EF6\u4F4D\u63A9\u7801\r\n if (this.oneSet.length > 0) {\r\n this._oneBits = typeManager.createBits(...this.oneSet);\r\n } else {\r\n this._oneBits = undefined;\r\n }\r\n\r\n this._isDirty = false;\r\n }\r\n\r\n /**\r\n * \u521B\u5EFA\u5339\u914D\u5668\u7684\u5B57\u7B26\u4E32\u8868\u793A\uFF08\u7528\u4E8E\u8C03\u8BD5\uFF09\r\n * @returns \u5B57\u7B26\u4E32\u8868\u793A\r\n */\r\n public toString(): string {\r\n const parts: string[] = [];\r\n \r\n if (this.allSet.length > 0) {\r\n parts.push(`all: [${this.allSet.map(t => t.name).join(', ')}]`);\r\n }\r\n \r\n if (this.exclusionSet.length > 0) {\r\n parts.push(`exclude: [${this.exclusionSet.map(t => t.name).join(', ')}]`);\r\n }\r\n \r\n if (this.oneSet.length > 0) {\r\n parts.push(`one: [${this.oneSet.map(t => t.name).join(', ')}]`);\r\n }\r\n \r\n return `Matcher(${parts.join(', ')})`;\r\n }\r\n}\r\n", "import { Entity } from '../Entity';\r\nimport { Core } from '../../Core';\r\nimport { Matcher } from '../Utils/Matcher';\r\nimport { PerformanceMonitor } from '../../Utils/PerformanceMonitor';\r\nimport type { Scene } from '../Scene';\r\n\r\n/**\r\n * \u5B9E\u4F53\u7CFB\u7EDF\u7684\u57FA\u7C7B\r\n * \r\n * \u7528\u4E8E\u5904\u7406\u4E00\u7EC4\u7B26\u5408\u7279\u5B9A\u6761\u4EF6\u7684\u5B9E\u4F53\u3002\u7CFB\u7EDF\u662FECS\u67B6\u6784\u4E2D\u7684\u903B\u8F91\u5904\u7406\u5355\u5143\uFF0C\r\n * \u8D1F\u8D23\u5BF9\u62E5\u6709\u7279\u5B9A\u7EC4\u4EF6\u7EC4\u5408\u7684\u5B9E\u4F53\u6267\u884C\u4E1A\u52A1\u903B\u8F91\u3002\r\n * \r\n * @example\r\n * ```typescript\r\n * class MovementSystem extends EntitySystem {\r\n * constructor() {\r\n * super(Matcher.empty().all(Transform, Velocity));\r\n * }\r\n * \r\n * protected process(entities: Entity[]): void {\r\n * for (const entity of entities) {\r\n * const transform = entity.getComponent(Transform);\r\n * const velocity = entity.getComponent(Velocity);\r\n * transform.position.add(velocity.value);\r\n * }\r\n * }\r\n * }\r\n * ```\r\n */\r\nexport abstract class EntitySystem {\r\n private _entities: Entity[] = [];\r\n private _updateOrder: number = 0;\r\n private _enabled: boolean = true;\r\n private _performanceMonitor = PerformanceMonitor.instance;\r\n private _systemName: string;\r\n\r\n /**\r\n * \u83B7\u53D6\u7CFB\u7EDF\u5904\u7406\u7684\u5B9E\u4F53\u5217\u8868\r\n */\r\n public get entities(): readonly Entity[] {\r\n return this._entities;\r\n }\r\n\r\n /**\r\n * \u83B7\u53D6\u7CFB\u7EDF\u7684\u66F4\u65B0\u65F6\u5E8F\r\n */\r\n public get updateOrder(): number {\r\n return this._updateOrder;\r\n }\r\n\r\n public set updateOrder(value: number) {\r\n this.setUpdateOrder(value);\r\n }\r\n\r\n /**\r\n * \u83B7\u53D6\u7CFB\u7EDF\u7684\u542F\u7528\u72B6\u6001\r\n */\r\n public get enabled(): boolean {\r\n return this._enabled;\r\n }\r\n\r\n /**\r\n * \u8BBE\u7F6E\u7CFB\u7EDF\u7684\u542F\u7528\u72B6\u6001\r\n */\r\n public set enabled(value: boolean) {\r\n this._enabled = value;\r\n }\r\n\r\n /**\r\n * \u83B7\u53D6\u7CFB\u7EDF\u540D\u79F0\r\n */\r\n public get systemName(): string {\r\n return this._systemName;\r\n }\r\n\r\n constructor(matcher?: Matcher) {\r\n this._matcher = matcher ? matcher : Matcher.empty();\r\n this._systemName = this.constructor.name;\r\n this.initialize();\r\n }\r\n\r\n private _scene!: Scene;\r\n\r\n /**\r\n * \u8FD9\u4E2A\u7CFB\u7EDF\u6240\u5C5E\u7684\u573A\u666F\r\n */\r\n public get scene(): Scene {\r\n return this._scene;\r\n }\r\n\r\n public set scene(value: Scene) {\r\n this._scene = value;\r\n this._entities = [];\r\n }\r\n\r\n private _matcher: Matcher;\r\n\r\n /**\r\n * \u83B7\u53D6\u5B9E\u4F53\u5339\u914D\u5668\r\n */\r\n public get matcher(): Matcher {\r\n return this._matcher;\r\n }\r\n\r\n /**\r\n * \u8BBE\u7F6E\u66F4\u65B0\u65F6\u5E8F\r\n * @param order \u66F4\u65B0\u65F6\u5E8F\r\n */\r\n public setUpdateOrder(order: number): void {\r\n this._updateOrder = order;\r\n this.scene.entityProcessors.setDirty();\r\n }\r\n\r\n /**\r\n * \u7CFB\u7EDF\u521D\u59CB\u5316\r\n * \r\n * \u5728\u7CFB\u7EDF\u521B\u5EFA\u65F6\u8C03\u7528\uFF0C\u5B50\u7C7B\u53EF\u4EE5\u91CD\u5199\u6B64\u65B9\u6CD5\u8FDB\u884C\u521D\u59CB\u5316\u64CD\u4F5C\u3002\r\n */\r\n public initialize(): void {\r\n // \u5B50\u7C7B\u53EF\u4EE5\u91CD\u5199\u6B64\u65B9\u6CD5\r\n }\r\n\r\n /**\r\n * \u5F53\u5B9E\u4F53\u7684\u7EC4\u4EF6\u53D1\u751F\u53D8\u5316\u65F6\u8C03\u7528\r\n * \r\n * \u68C0\u67E5\u5B9E\u4F53\u662F\u5426\u4ECD\u7136\u7B26\u5408\u7CFB\u7EDF\u7684\u5339\u914D\u6761\u4EF6\uFF0C\u5E76\u76F8\u5E94\u5730\u6DFB\u52A0\u6216\u79FB\u9664\u5B9E\u4F53\u3002\r\n * \r\n * @param entity \u53D1\u751F\u53D8\u5316\u7684\u5B9E\u4F53\r\n */\r\n public onChanged(entity: Entity): void {\r\n const contains = this._entities.includes(entity);\r\n const interest = this._matcher.isInterestedEntity(entity);\r\n\r\n if (interest && !contains) {\r\n this.add(entity);\r\n } else if (!interest && contains) {\r\n this.remove(entity);\r\n }\r\n }\r\n\r\n /**\r\n * \u6DFB\u52A0\u5B9E\u4F53\u5230\u7CFB\u7EDF\r\n * \r\n * @param entity \u8981\u6DFB\u52A0\u7684\u5B9E\u4F53\r\n */\r\n public add(entity: Entity): void {\r\n if (!this._entities.includes(entity)) {\r\n this._entities.push(entity);\r\n this.onAdded(entity);\r\n }\r\n }\r\n\r\n /**\r\n * \u5F53\u5B9E\u4F53\u88AB\u6DFB\u52A0\u5230\u7CFB\u7EDF\u65F6\u8C03\u7528\r\n * \r\n * \u5B50\u7C7B\u53EF\u4EE5\u91CD\u5199\u6B64\u65B9\u6CD5\u6765\u5904\u7406\u5B9E\u4F53\u6DFB\u52A0\u4E8B\u4EF6\u3002\r\n * \r\n * @param entity \u88AB\u6DFB\u52A0\u7684\u5B9E\u4F53\r\n */\r\n protected onAdded(entity: Entity): void {\r\n // \u5B50\u7C7B\u53EF\u4EE5\u91CD\u5199\u6B64\u65B9\u6CD5\r\n }\r\n\r\n /**\r\n * \u4ECE\u7CFB\u7EDF\u4E2D\u79FB\u9664\u5B9E\u4F53\r\n * \r\n * @param entity \u8981\u79FB\u9664\u7684\u5B9E\u4F53\r\n */\r\n public remove(entity: Entity): void {\r\n const index = this._entities.indexOf(entity);\r\n if (index !== -1) {\r\n this._entities.splice(index, 1);\r\n this.onRemoved(entity);\r\n }\r\n }\r\n\r\n /**\r\n * \u5F53\u5B9E\u4F53\u4ECE\u7CFB\u7EDF\u4E2D\u79FB\u9664\u65F6\u8C03\u7528\r\n * \r\n * \u5B50\u7C7B\u53EF\u4EE5\u91CD\u5199\u6B64\u65B9\u6CD5\u6765\u5904\u7406\u5B9E\u4F53\u79FB\u9664\u4E8B\u4EF6\u3002\r\n * \r\n * @param entity \u88AB\u79FB\u9664\u7684\u5B9E\u4F53\r\n */\r\n protected onRemoved(entity: Entity): void {\r\n // \u5B50\u7C7B\u53EF\u4EE5\u91CD\u5199\u6B64\u65B9\u6CD5\r\n }\r\n\r\n /**\r\n * \u66F4\u65B0\u7CFB\u7EDF\r\n * \r\n * \u5728\u6BCF\u5E27\u8C03\u7528\uFF0C\u5904\u7406\u7CFB\u7EDF\u7684\u4E3B\u8981\u903B\u8F91\u3002\r\n */\r\n public update(): void {\r\n if (!this._enabled || !this.checkProcessing()) {\r\n return;\r\n }\r\n\r\n const startTime = this._performanceMonitor.startMonitoring(this._systemName);\r\n \r\n try {\r\n this.begin();\r\n this.process(this._entities);\r\n } finally {\r\n this._performanceMonitor.endMonitoring(this._systemName, startTime, this._entities.length);\r\n }\r\n }\r\n\r\n /**\r\n * \u540E\u671F\u66F4\u65B0\u7CFB\u7EDF\r\n * \r\n * \u5728\u6240\u6709\u7CFB\u7EDF\u7684update\u65B9\u6CD5\u6267\u884C\u5B8C\u6BD5\u540E\u8C03\u7528\u3002\r\n */\r\n public lateUpdate(): void {\r\n if (!this._enabled || !this.checkProcessing()) {\r\n return;\r\n }\r\n\r\n const startTime = this._performanceMonitor.startMonitoring(`${this._systemName}_Late`);\r\n \r\n try {\r\n this.lateProcess(this._entities);\r\n this.end();\r\n } finally {\r\n this._performanceMonitor.endMonitoring(`${this._systemName}_Late`, startTime, this._entities.length);\r\n }\r\n }\r\n\r\n /**\r\n * \u5728\u7CFB\u7EDF\u5904\u7406\u5F00\u59CB\u524D\u8C03\u7528\r\n * \r\n * \u5B50\u7C7B\u53EF\u4EE5\u91CD\u5199\u6B64\u65B9\u6CD5\u8FDB\u884C\u9884\u5904\u7406\u64CD\u4F5C\u3002\r\n */\r\n protected begin(): void {\r\n // \u5B50\u7C7B\u53EF\u4EE5\u91CD\u5199\u6B64\u65B9\u6CD5\r\n }\r\n\r\n /**\r\n * \u5904\u7406\u5B9E\u4F53\u5217\u8868\r\n * \r\n * \u7CFB\u7EDF\u7684\u6838\u5FC3\u903B\u8F91\uFF0C\u5B50\u7C7B\u5FC5\u987B\u5B9E\u73B0\u6B64\u65B9\u6CD5\u6765\u5B9A\u4E49\u5177\u4F53\u7684\u5904\u7406\u903B\u8F91\u3002\r\n * \r\n * @param entities \u8981\u5904\u7406\u7684\u5B9E\u4F53\u5217\u8868\r\n */\r\n protected process(entities: Entity[]): void {\r\n // \u5B50\u7C7B\u5FC5\u987B\u5B9E\u73B0\u6B64\u65B9\u6CD5\r\n }\r\n\r\n /**\r\n * \u540E\u671F\u5904\u7406\u5B9E\u4F53\u5217\u8868\r\n * \r\n * \u5728\u4E3B\u8981\u5904\u7406\u903B\u8F91\u4E4B\u540E\u6267\u884C\uFF0C\u5B50\u7C7B\u53EF\u4EE5\u91CD\u5199\u6B64\u65B9\u6CD5\u3002\r\n * \r\n * @param entities \u8981\u5904\u7406\u7684\u5B9E\u4F53\u5217\u8868\r\n */\r\n protected lateProcess(entities: Entity[]): void {\r\n // \u5B50\u7C7B\u53EF\u4EE5\u91CD\u5199\u6B64\u65B9\u6CD5\r\n }\r\n\r\n /**\r\n * \u7CFB\u7EDF\u5904\u7406\u5B8C\u6BD5\u540E\u8C03\u7528\r\n * \r\n * \u5B50\u7C7B\u53EF\u4EE5\u91CD\u5199\u6B64\u65B9\u6CD5\u8FDB\u884C\u540E\u5904\u7406\u64CD\u4F5C\u3002\r\n */\r\n protected end(): void {\r\n // \u5B50\u7C7B\u53EF\u4EE5\u91CD\u5199\u6B64\u65B9\u6CD5\r\n }\r\n\r\n /**\r\n * \u68C0\u67E5\u7CFB\u7EDF\u662F\u5426\u9700\u8981\u5904\u7406\r\n * \r\n * \u5728\u542F\u7528\u7CFB\u7EDF\u65F6\u6709\u7528\uFF0C\u4F46\u4EC5\u5076\u5C14\u9700\u8981\u5904\u7406\u3002\r\n * \u8FD9\u53EA\u5F71\u54CD\u5904\u7406\uFF0C\u4E0D\u5F71\u54CD\u4E8B\u4EF6\u6216\u8BA2\u9605\u5217\u8868\u3002\r\n * \r\n * @returns \u5982\u679C\u7CFB\u7EDF\u5E94\u8BE5\u5904\u7406\uFF0C\u5219\u4E3Atrue\uFF0C\u5982\u679C\u4E0D\u5904\u7406\u5219\u4E3Afalse\r\n */\r\n protected checkProcessing(): boolean {\r\n return true;\r\n }\r\n\r\n /**\r\n * \u83B7\u53D6\u7CFB\u7EDF\u7684\u6027\u80FD\u6570\u636E\r\n * \r\n * @returns \u6027\u80FD\u6570\u636E\u6216undefined\r\n */\r\n public getPerformanceData() {\r\n return this._performanceMonitor.getSystemData(this._systemName);\r\n }\r\n\r\n /**\r\n * \u83B7\u53D6\u7CFB\u7EDF\u7684\u6027\u80FD\u7EDF\u8BA1\r\n * \r\n * @returns \u6027\u80FD\u7EDF\u8BA1\u6216undefined\r\n */\r\n public getPerformanceStats() {\r\n return this._performanceMonitor.getSystemStats(this._systemName);\r\n }\r\n\r\n /**\r\n * \u91CD\u7F6E\u7CFB\u7EDF\u7684\u6027\u80FD\u6570\u636E\r\n */\r\n public resetPerformanceData(): void {\r\n this._performanceMonitor.resetSystem(this._systemName);\r\n }\r\n\r\n /**\r\n * \u83B7\u53D6\u7CFB\u7EDF\u4FE1\u606F\u7684\u5B57\u7B26\u4E32\u8868\u793A\r\n * \r\n * @returns \u7CFB\u7EDF\u4FE1\u606F\u5B57\u7B26\u4E32\r\n */\r\n public toString(): string {\r\n const entityCount = this._entities.length;\r\n const perfData = this.getPerformanceData();\r\n const perfInfo = perfData ? ` (${perfData.executionTime.toFixed(2)}ms)` : '';\r\n \r\n return `${this._systemName}[${entityCount} entities]${perfInfo}`;\r\n }\r\n}\r\n\r\n", "import { EntitySystem } from './EntitySystem';\r\nimport { Entity } from '../Entity';\r\n\r\n/**\r\n * \u5904\u7406\u7CFB\u7EDF\u62BD\u8C61\u7C7B\r\n * \u5B9A\u4E49\u4E00\u4E2A\u5904\u7406\u5B9E\u4F53\u7684\u62BD\u8C61\u7C7B\uFF0C\u7EE7\u627F\u81EAEntitySystem\u7C7B\r\n * \u5B50\u7C7B\u9700\u8981\u5B9E\u73B0processSystem\u65B9\u6CD5\uFF0C\u7528\u4E8E\u5B9E\u73B0\u5177\u4F53\u7684\u5904\u7406\u903B\u8F91\r\n */\r\nexport abstract class ProcessingSystem extends EntitySystem {\r\n /**\r\n * \u5F53\u5B9E\u4F53\u53D1\u751F\u53D8\u5316\u65F6\uFF0C\u4E0D\u8FDB\u884C\u4EFB\u4F55\u64CD\u4F5C\r\n * @param entity \u53D1\u751F\u53D8\u5316\u7684\u5B9E\u4F53\r\n */\r\n public override onChanged(entity: Entity): void { }\r\n\r\n /**\r\n * \u5904\u7406\u5B9E\u4F53\uFF0C\u6BCF\u5E27\u8C03\u7528processSystem\u65B9\u6CD5\u8FDB\u884C\u5904\u7406\r\n * @param entities \u5B9E\u4F53\u6570\u7EC4\uFF0C\u672A\u88AB\u4F7F\u7528\r\n */\r\n protected override process(entities: Entity[]): void {\r\n // \u8C03\u7528\u5B50\u7C7B\u5B9E\u73B0\u7684processSystem\u65B9\u6CD5\u8FDB\u884C\u5B9E\u4F53\u5904\u7406\r\n this.processSystem();\r\n }\r\n\r\n /**\r\n * \u5904\u7406\u5B9E\u4F53\u7684\u5177\u4F53\u65B9\u6CD5\uFF0C\u7531\u5B50\u7C7B\u5B9E\u73B0\r\n */\r\n public abstract processSystem(): void;\r\n}\r\n", "import { EntitySystem } from './EntitySystem';\r\nimport { Entity } from '../Entity';\r\n\r\n/**\r\n * \u88AB\u52A8\u5B9E\u4F53\u7CFB\u7EDF\r\n * \u5B9A\u4E49\u4E00\u4E2A\u88AB\u52A8\u7684\u5B9E\u4F53\u7CFB\u7EDF\uFF0C\u7EE7\u627F\u81EAEntitySystem\u7C7B\r\n * \u88AB\u52A8\u7684\u5B9E\u4F53\u7CFB\u7EDF\u4E0D\u4F1A\u5BF9\u5B9E\u4F53\u8FDB\u884C\u4EFB\u4F55\u4FEE\u6539\uFF0C\u53EA\u4F1A\u88AB\u52A8\u5730\u63A5\u6536\u5B9E\u4F53\u7684\u53D8\u5316\u4E8B\u4EF6\r\n */\r\nexport abstract class PassiveSystem extends EntitySystem {\r\n /**\r\n * \u5F53\u5B9E\u4F53\u53D1\u751F\u53D8\u5316\u65F6\uFF0C\u4E0D\u8FDB\u884C\u4EFB\u4F55\u64CD\u4F5C\r\n * @param entity \u53D1\u751F\u53D8\u5316\u7684\u5B9E\u4F53\r\n */\r\n public override onChanged(entity: Entity): void { }\r\n\r\n /**\r\n * \u4E0D\u8FDB\u884C\u4EFB\u4F55\u5904\u7406\r\n * @param entities \u5B9E\u4F53\u6570\u7EC4\uFF0C\u672A\u88AB\u4F7F\u7528\r\n */\r\n protected override process(entities: Entity[]): void {\r\n // \u88AB\u52A8\u7CFB\u7EDF\u4E0D\u8FDB\u884C\u4EFB\u4F55\u5904\u7406\r\n }\r\n}\r\n", "import { EntitySystem } from './EntitySystem';\r\nimport { Matcher } from '../Utils/Matcher';\r\nimport { Time } from '../../Utils/Time';\r\n\r\n/**\r\n * \u95F4\u9694\u7CFB\u7EDF\u62BD\u8C61\u7C7B\r\n * \u5B9A\u4E49\u4E00\u4E2A\u6309\u65F6\u95F4\u95F4\u9694\u5904\u7406\u7684\u62BD\u8C61\u7C7B\uFF0C\u7EE7\u627F\u81EAEntitySystem\u7C7B\r\n * \u5B50\u7C7B\u9700\u8981\u5B9E\u73B0process\u65B9\u6CD5\uFF0C\u7528\u4E8E\u5B9E\u73B0\u5177\u4F53\u7684\u5904\u7406\u903B\u8F91\r\n */\r\nexport abstract class IntervalSystem extends EntitySystem {\r\n /** \u7D2F\u79EF\u589E\u91CF\u4EE5\u8DDF\u8E2A\u95F4\u9694 */\r\n private acc: number = 0;\r\n /** \u66F4\u65B0\u4E4B\u95F4\u9700\u8981\u7B49\u5F85\u591A\u957F\u65F6\u95F4 */\r\n private readonly interval: number;\r\n /** \u65F6\u95F4\u95F4\u9694\u7684\u4F59\u6570\uFF0C\u7528\u4E8E\u8BA1\u7B97\u4E0B\u4E00\u6B21\u9700\u8981\u7B49\u5F85\u7684\u65F6\u95F4 */\r\n private intervalRemainder: number = 0;\r\n\r\n /**\r\n * \u6784\u9020\u51FD\u6570\uFF0C\u521D\u59CB\u5316\u65F6\u95F4\u95F4\u9694\r\n * @param matcher \u5B9E\u4F53\u5339\u914D\u5668\r\n * @param interval \u65F6\u95F4\u95F4\u9694\r\n */\r\n constructor(matcher: Matcher, interval: number) {\r\n super(matcher);\r\n this.interval = interval;\r\n }\r\n\r\n /**\r\n * \u5224\u65AD\u662F\u5426\u9700\u8981\u8FDB\u884C\u5904\u7406\r\n * \u5982\u679C\u9700\u8981\u8FDB\u884C\u5904\u7406\uFF0C\u5219\u66F4\u65B0\u7D2F\u79EF\u589E\u91CF\u548C\u65F6\u95F4\u95F4\u9694\u4F59\u6570\uFF0C\u8FD4\u56DEtrue\r\n * \u5426\u5219\u8FD4\u56DEfalse\r\n */\r\n protected override checkProcessing(): boolean {\r\n // \u66F4\u65B0\u7D2F\u79EF\u589E\u91CF\r\n this.acc += Time.deltaTime;\r\n\r\n // \u5982\u679C\u7D2F\u79EF\u589E\u91CF\u8D85\u8FC7\u65F6\u95F4\u95F4\u9694\uFF0C\u5219\u8FDB\u884C\u5904\u7406\r\n if (this.acc >= this.interval) {\r\n // \u66F4\u65B0\u65F6\u95F4\u95F4\u9694\u4F59\u6570\r\n this.intervalRemainder = this.acc - this.interval;\r\n // \u91CD\u7F6E\u7D2F\u79EF\u589E\u91CF\r\n this.acc = 0;\r\n // \u8FD4\u56DEtrue\uFF0C\u8868\u793A\u9700\u8981\u8FDB\u884C\u5904\u7406\r\n return true;\r\n }\r\n\r\n // \u8FD4\u56DEfalse\uFF0C\u8868\u793A\u4E0D\u9700\u8981\u8FDB\u884C\u5904\u7406\r\n return false;\r\n }\r\n\r\n /**\r\n * \u83B7\u53D6\u672C\u7CFB\u7EDF\u4E0A\u6B21\u5904\u7406\u540E\u7684\u5B9E\u9645delta\u503C\r\n * \u5B9E\u9645delta\u503C\u7B49\u4E8E\u65F6\u95F4\u95F4\u9694\u52A0\u4E0A\u65F6\u95F4\u95F4\u9694\u4F59\u6570\r\n */\r\n protected getIntervalDelta(): number {\r\n return this.interval + this.intervalRemainder;\r\n }\r\n} ", "/**\r\n * \u7C7B\u578B\u5DE5\u5177\u7C7B\r\n * \u63D0\u4F9B\u7C7B\u578B\u76F8\u5173\u7684\u5B9E\u7528\u65B9\u6CD5\r\n */\r\nexport class TypeUtils {\r\n /**\r\n * \u83B7\u53D6\u5BF9\u8C61\u7684\u7C7B\u578B\r\n * @param obj \u5BF9\u8C61\r\n * @returns \u5BF9\u8C61\u7684\u6784\u9020\u51FD\u6570\r\n */\r\n public static getType(obj: any) {\r\n return obj.constructor;\r\n }\r\n}", "/**\r\n * \u6570\u5B57\u6269\u5C55\u5DE5\u5177\u7C7B\r\n * \u63D0\u4F9B\u6570\u5B57\u8F6C\u6362\u7684\u5B9E\u7528\u65B9\u6CD5\r\n */\r\nexport class NumberExtension {\r\n /**\r\n * \u5C06\u503C\u8F6C\u6362\u4E3A\u6570\u5B57\r\n * @param value \u8981\u8F6C\u6362\u7684\u503C\r\n * @returns \u8F6C\u6362\u540E\u7684\u6570\u5B57\uFF0C\u5982\u679C\u503C\u4E3Aundefined\u5219\u8FD4\u56DE0\r\n */\r\n public static toNumber(value: any): number {\r\n if (value == undefined) return 0;\r\n return Number(value);\r\n }\r\n}", "/**\r\n * \u6846\u67B6\u6838\u5FC3\u7C7B\u578B\u5B9A\u4E49\r\n */\r\n\r\n/** \u66F4\u65B0\u987A\u5E8F\u6BD4\u8F83\u5668\u63A5\u53E3 */\r\nexport interface IUpdateOrderComparable {\r\n updateOrder: number;\r\n}\r\n\r\n/** \u65E5\u5FD7\u7C7B\u578B\u679A\u4E3E */\r\nexport enum LogType {\r\n Error = 0,\r\n Assert = 1,\r\n Warning = 2,\r\n Log = 3,\r\n Exception = 4\r\n}\r\n\r\n/** \u7EC4\u4EF6\u53D8\u6362\u7C7B\u578B\u679A\u4E3E */\r\nexport enum ComponentTransform {\r\n Position = 1,\r\n Scale = 2,\r\n Rotation = 4\r\n} "],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["_FuncPack", "func", "context", "__name", "FuncPack", "_Emitter", "eventType", "handler", "list", "messageData", "index", "data", "observer", "Emitter", "CoreEvents", "_GlobalManager", "value", "isEnabled", "__name", "GlobalManager", "_Time", "currentTime", "interval", "lastTime", "__name", "Time", "_Timer", "Time", "timeInsSeconds", "repeats", "context", "onTime", "__name", "Timer", "_TimerManager", "GlobalManager", "i", "timeInSeconds", "repeats", "context", "onTime", "timer", "Timer", "__name", "TimerManager", "PerformanceWarningType", "_PerformanceMonitor", "systemName", "startTime", "entityCount", "endTime", "executionTime", "averageTimePerEntity", "data", "stats", "mean", "a", "b", "variance", "acc", "time", "sortedTimes", "len", "lines", "sortedSystems", "totalCurrentTime", "sum", "thresholdMs", "warnings", "maxSamples", "__name", "PerformanceMonitor", "_Pool", "createFn", "maxSize", "estimatedObjectSize", "type", "pool", "obj", "count", "targetSize", "value", "__spreadValues", "hits", "stats", "typeName", "total", "lines", "stat", "__name", "Pool", "_TieredObjectPool", "resetFn", "tierSizes", "size", "totalCount", "remaining", "warmUpCount", "totalSize", "totalMaxSize", "totalMemoryUsage", "tierStats", "hitRate", "TieredObjectPool", "_PoolManager", "name", "now", "totalMemory", "PoolManager", "_ComponentRegistry", "componentType", "bitIndex", "__name", "ComponentRegistry", "_ComponentStorage", "entityId", "component", "index", "callback", "i", "components", "entityIds", "newComponents", "newIndexToEntity", "newEntityToIndex", "newIndex", "totalSlots", "usedSlots", "freeSlots", "fragmentation", "ComponentStorage", "_ComponentStorageManager", "storage", "mask", "stats", "typeName", "ComponentStorageManager", "_EntityComparer", "self", "other", "compare", "__name", "EntityComparer", "_ComponentCache", "config", "type", "entry", "component", "deleted", "lruType", "index", "totalAccess", "totalHits", "ComponentCache", "_Entity", "name", "id", "value", "componentType", "args", "ComponentRegistry", "processor", "mask", "cachedComponent", "i", "stats", "componentsToRemove", "components", "addedComponents", "error", "componentTypes", "removedComponents", "accessStats", "total", "__spreadProps", "__spreadValues", "now", "cleanupThreshold", "result", "child", "childrenToRemove", "recursive", "found", "tag", "root", "entity", "current", "depth", "callback", "childrenToDestroy", "_a", "cacheStats", "accessStatsArray", "c", "Entity", "_EntityList", "scene", "entity", "index", "i", "name", "entities", "id", "tag", "result", "componentType", "action", "predicate", "isAdd", "activeCount", "__name", "EntityList", "_EntityProcessorList", "processor", "index", "type", "a", "b", "__name", "EntityProcessorList", "_IdentifierPool", "id", "__name", "IdentifierPool", "_WasmEcsCore", "silent", "wasmPath", "__require", "path", "fs", "currentDir", "absoluteWasmPath", "jsFile", "wasmFile", "pathToFileURL", "wasmJsFile", "wasmBgFile", "wasmJsUrl", "expectedWasmUrl", "wasmBytes", "error", "entityId", "mask", "entityIds", "masks", "entityIdsArray", "masksArray", "i", "maxResults", "_a", "ptr", "count", "entities", "entityMask", "hasAll", "includeMask", "excludeMask", "componentIds", "id", "componentId", "stats", "_b", "__name", "WasmEcsCore", "ecsCore", "initializeEcs", "Query", "includeIds", "excludeIds", "_ComponentPool", "createFn", "resetFn", "maxSize", "component", "count", "i", "__name", "ComponentPool", "_ComponentPoolManager", "componentName", "pool", "stats", "name", "ComponentPoolManager", "_BitMaskOptimizer", "componentName", "cacheKey", "componentId", "mask", "componentNames", "componentMask", "requiredMask", "anyMask", "commonCombinations", "combination", "count", "tempMask", "__name", "BitMaskOptimizer", "IndexUpdateType", "_IndexUpdateBatcher", "operation", "entities", "entity", "updates", "update", "operations", "addOperations", "removeOperations", "updateOperations", "size", "delay", "__name", "IndexUpdateBatcher", "QueryConditionType", "_QuerySystem", "ComponentPoolManager", "BitMaskOptimizer", "IndexUpdateBatcher", "entities", "entity", "updates", "update", "wasmLoaded", "ecsCore", "error", "deferCacheClear", "existingIds", "e", "addedCount", "index", "mask", "maskSet", "components", "i", "componentType", "typeSet", "tag", "tagSet", "name", "nameSet", "component", "componentTypes", "startTime", "cacheKey", "t", "cached", "smallestSet", "smallestSize", "set", "result", "entitySet", "typeEntities", "entry", "now", "key", "entries", "a", "b", "toRemove", "entityIds", "u", "masks", "providerName", "componentNames", "type", "__spreadProps", "__spreadValues", "__name", "QuerySystem", "_QueryBuilder", "querySystem", "condition", "bitMask", "ComponentRegistry", "QueryBuilder", "_TypeSafeEventSystem", "eventType", "handler", "config", "__spreadProps", "__spreadValues", "listenerId", "listeners", "index", "l", "event", "batchConfig", "startTime", "toRemove", "sortedListeners", "listener", "error", "batch", "timer", "enabled", "max", "syncListeners", "asyncListeners", "asyncPromises", "a", "b", "listenerIds", "id", "batchEvent", "executionTime", "stats", "__name", "TypeSafeEventSystem", "GlobalEventSystem", "_Scene", "enableWasmAcceleration", "EntityList", "EntityProcessorList", "IdentifierPool", "ComponentStorageManager", "QuerySystem", "TypeSafeEventSystem", "name", "entity", "Entity", "deferCacheClear", "count", "namePrefix", "entities", "i", "id", "tag", "result", "processor", "system", "type", "c", "_a", "__name", "Scene", "_EntityBuilder", "scene", "storageManager", "Entity", "name", "tag", "component", "components", "condition", "factory", "componentType", "configurator", "enabled", "active", "childBuilder", "child", "childBuilders", "childFactory", "newBuilder", "__name", "EntityBuilder", "_SceneBuilder", "Scene", "entity", "builderFn", "builder", "entities", "system", "systems", "SceneBuilder", "_ComponentBuilder", "componentClass", "args", "property", "value", "ComponentBuilder", "_ECSFluentAPI", "querySystem", "eventSystem", "QueryBuilder", "componentTypes", "result", "eventType", "event", "handler", "listenerId", "EntityBatchOperator", "ECSFluentAPI", "_EntityBatchOperator", "operation", "predicate", "createECSAPI", "_Core", "debug", "enableEntitySystems", "Emitter", "CoreEvents", "TimerManager", "PerformanceMonitor", "PoolManager", "value", "manager", "type", "timeInSeconds", "repeats", "context", "onTime", "_a", "Time", "scene", "createECSAPI", "currentTime", "frameStartTime", "managersStartTime", "globalManager", "sceneStartTime", "entityCount", "__name", "Core", "_Component", "value", "__name", "Component", "_Bits", "index", "wordIndex", "bitIndex", "other", "maxLength", "i", "thisWord", "otherWord", "minLength", "word", "count", "n", "newBits", "__name", "Bits", "_ComponentTypeManager", "componentType", "typeId", "componentTypes", "bits", "Bits", "components", "component", "__name", "ComponentTypeManager", "_Matcher", "entity", "entityBits", "componentBits", "types", "components", "ComponentTypeManager", "typeManager", "parts", "t", "__name", "Matcher", "_EntitySystem", "value", "matcher", "PerformanceMonitor", "Matcher", "order", "entity", "contains", "interest", "index", "startTime", "entities", "entityCount", "perfData", "perfInfo", "__name", "EntitySystem", "_ProcessingSystem", "EntitySystem", "entity", "entities", "__name", "ProcessingSystem", "_PassiveSystem", "EntitySystem", "entity", "entities", "__name", "PassiveSystem", "_IntervalSystem", "EntitySystem", "matcher", "interval", "Time", "__name", "IntervalSystem", "_TypeUtils", "obj", "__name", "TypeUtils", "_NumberExtension", "value", "__name", "NumberExtension", "LogType", "ComponentTransform"]
|
|
7
|
+
}
|