@esengine/ecs-framework 2.1.5 → 2.1.7
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 +176 -235
- package/index.d.ts +2 -2
- package/index.js +5 -5
- package/index.js.map +4 -4
- package/package.json +2 -1
- package/wasm/ecs_wasm_core.d.ts +141 -0
- package/wasm/ecs_wasm_core.js +415 -0
- package/wasm/ecs_wasm_core_bg.wasm +0 -0
- package/wasm/ecs_wasm_core_bg.wasm.d.ts +29 -0
- package/wasm/package.json +15 -0
package/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
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/
|
|
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"]
|
|
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/Wasm/loader.ts", "../src/Utils/Wasm/fallback.ts", "../src/Utils/Wasm/core.ts", "../src/Utils/Wasm/instance.ts", "../src/ECS/Core/ComponentPool.ts", "../src/ECS/Core/BitMaskOptimizer.ts", "../src/ECS/Core/IndexUpdateBatcher.ts", "../src/ECS/Core/ComponentIndex.ts", "../src/ECS/Core/ArchetypeSystem.ts", "../src/ECS/Core/DirtyTrackingSystem.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/ECS/Core/EventBus.ts", "../src/ECS/Core/EntityManager.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/**\r\n * ECS\u4E8B\u4EF6\u7C7B\u578B\u679A\u4E3E\r\n * \u5B9A\u4E49\u5B9E\u4F53\u7EC4\u4EF6\u7CFB\u7EDF\u4E2D\u7684\u6240\u6709\u4E8B\u4EF6\u7C7B\u578B\r\n */\r\nexport enum ECSEventType {\r\n // \u5B9E\u4F53\u76F8\u5173\u4E8B\u4EF6\r\n ENTITY_CREATED = 'entity:created',\r\n ENTITY_DESTROYED = 'entity:destroyed',\r\n ENTITY_ENABLED = 'entity:enabled',\r\n ENTITY_DISABLED = 'entity:disabled',\r\n ENTITY_TAG_ADDED = 'entity:tag:added',\r\n ENTITY_TAG_REMOVED = 'entity:tag:removed',\r\n ENTITY_NAME_CHANGED = 'entity:name:changed',\r\n \r\n // \u7EC4\u4EF6\u76F8\u5173\u4E8B\u4EF6\r\n COMPONENT_ADDED = 'component:added',\r\n COMPONENT_REMOVED = 'component:removed',\r\n COMPONENT_MODIFIED = 'component:modified',\r\n COMPONENT_ENABLED = 'component:enabled',\r\n COMPONENT_DISABLED = 'component:disabled',\r\n \r\n // \u7CFB\u7EDF\u76F8\u5173\u4E8B\u4EF6\r\n SYSTEM_ADDED = 'system:added',\r\n SYSTEM_REMOVED = 'system:removed',\r\n SYSTEM_ENABLED = 'system:enabled',\r\n SYSTEM_DISABLED = 'system:disabled',\r\n SYSTEM_PROCESSING_START = 'system:processing:start',\r\n SYSTEM_PROCESSING_END = 'system:processing:end',\r\n SYSTEM_ERROR = 'system:error',\r\n \r\n // \u573A\u666F\u76F8\u5173\u4E8B\u4EF6\r\n SCENE_CREATED = 'scene:created',\r\n SCENE_DESTROYED = 'scene:destroyed',\r\n SCENE_ACTIVATED = 'scene:activated',\r\n SCENE_DEACTIVATED = 'scene:deactivated',\r\n SCENE_PAUSED = 'scene:paused',\r\n SCENE_RESUMED = 'scene:resumed',\r\n \r\n // \u67E5\u8BE2\u76F8\u5173\u4E8B\u4EF6\r\n QUERY_EXECUTED = 'query:executed',\r\n QUERY_CACHE_HIT = 'query:cache:hit',\r\n QUERY_CACHE_MISS = 'query:cache:miss',\r\n QUERY_OPTIMIZED = 'query:optimized',\r\n \r\n // \u6027\u80FD\u76F8\u5173\u4E8B\u4EF6\r\n PERFORMANCE_WARNING = 'performance:warning',\r\n PERFORMANCE_CRITICAL = 'performance:critical',\r\n MEMORY_USAGE_HIGH = 'memory:usage:high',\r\n FRAME_RATE_DROP = 'frame:rate:drop',\r\n \r\n // \u7D22\u5F15\u76F8\u5173\u4E8B\u4EF6\r\n INDEX_CREATED = 'index:created',\r\n INDEX_UPDATED = 'index:updated',\r\n INDEX_OPTIMIZED = 'index:optimized',\r\n \r\n // Archetype\u76F8\u5173\u4E8B\u4EF6\r\n ARCHETYPE_CREATED = 'archetype:created',\r\n ARCHETYPE_ENTITY_ADDED = 'archetype:entity:added',\r\n ARCHETYPE_ENTITY_REMOVED = 'archetype:entity:removed',\r\n \r\n // \u810F\u6807\u8BB0\u76F8\u5173\u4E8B\u4EF6\r\n DIRTY_MARK_ADDED = 'dirty:mark:added',\r\n DIRTY_BATCH_PROCESSED = 'dirty:batch:processed',\r\n \r\n // \u9519\u8BEF\u548C\u8B66\u544A\u4E8B\u4EF6\r\n ERROR_OCCURRED = 'error:occurred',\r\n WARNING_ISSUED = 'warning:issued',\r\n \r\n // \u751F\u547D\u5468\u671F\u4E8B\u4EF6\r\n FRAMEWORK_INITIALIZED = 'framework:initialized',\r\n FRAMEWORK_SHUTDOWN = 'framework:shutdown',\r\n \r\n // \u8C03\u8BD5\u76F8\u5173\u4E8B\u4EF6\r\n DEBUG_INFO = 'debug:info',\r\n DEBUG_STATS_UPDATED = 'debug:stats:updated'\r\n}\r\n\r\n/**\r\n * \u4E8B\u4EF6\u4F18\u5148\u7EA7\u679A\u4E3E\r\n * \u5B9A\u4E49\u4E8B\u4EF6\u5904\u7406\u7684\u4F18\u5148\u7EA7\u7EA7\u522B\r\n */\r\nexport enum EventPriority {\r\n LOWEST = 0,\r\n LOW = 25,\r\n NORMAL = 50,\r\n HIGH = 75,\r\n HIGHEST = 100,\r\n CRITICAL = 200\r\n}\r\n\r\n/**\r\n * \u9884\u5B9A\u4E49\u7684\u4E8B\u4EF6\u7C7B\u578B\u5E38\u91CF\r\n * \u63D0\u4F9B\u7C7B\u578B\u5B89\u5168\u7684\u4E8B\u4EF6\u7C7B\u578B\u5B57\u7B26\u4E32\r\n */\r\nexport const EVENT_TYPES = {\r\n // \u6838\u5FC3\u4E8B\u4EF6\r\n CORE: {\r\n SCENE_CHANGED: 'core:scene:changed',\r\n FRAME_UPDATED: 'core:frame:updated',\r\n RENDER_CHANGED: 'core:render:changed'\r\n },\r\n \r\n // \u5B9E\u4F53\u4E8B\u4EF6\r\n ENTITY: {\r\n CREATED: ECSEventType.ENTITY_CREATED,\r\n DESTROYED: ECSEventType.ENTITY_DESTROYED,\r\n ENABLED: ECSEventType.ENTITY_ENABLED,\r\n DISABLED: ECSEventType.ENTITY_DISABLED,\r\n TAG_ADDED: ECSEventType.ENTITY_TAG_ADDED,\r\n TAG_REMOVED: ECSEventType.ENTITY_TAG_REMOVED,\r\n NAME_CHANGED: ECSEventType.ENTITY_NAME_CHANGED\r\n },\r\n \r\n // \u7EC4\u4EF6\u4E8B\u4EF6\r\n COMPONENT: {\r\n ADDED: ECSEventType.COMPONENT_ADDED,\r\n REMOVED: ECSEventType.COMPONENT_REMOVED,\r\n MODIFIED: ECSEventType.COMPONENT_MODIFIED,\r\n ENABLED: ECSEventType.COMPONENT_ENABLED,\r\n DISABLED: ECSEventType.COMPONENT_DISABLED\r\n },\r\n \r\n // \u7CFB\u7EDF\u4E8B\u4EF6\r\n SYSTEM: {\r\n ADDED: ECSEventType.SYSTEM_ADDED,\r\n REMOVED: ECSEventType.SYSTEM_REMOVED,\r\n ENABLED: ECSEventType.SYSTEM_ENABLED,\r\n DISABLED: ECSEventType.SYSTEM_DISABLED,\r\n PROCESSING_START: ECSEventType.SYSTEM_PROCESSING_START,\r\n PROCESSING_END: ECSEventType.SYSTEM_PROCESSING_END,\r\n ERROR: ECSEventType.SYSTEM_ERROR\r\n },\r\n \r\n // \u6027\u80FD\u4E8B\u4EF6\r\n PERFORMANCE: {\r\n WARNING: ECSEventType.PERFORMANCE_WARNING,\r\n CRITICAL: ECSEventType.PERFORMANCE_CRITICAL,\r\n MEMORY_HIGH: ECSEventType.MEMORY_USAGE_HIGH,\r\n FRAME_DROP: ECSEventType.FRAME_RATE_DROP\r\n }\r\n} as const;\r\n\r\n/**\r\n * \u4E8B\u4EF6\u7C7B\u578B\u9A8C\u8BC1\u5668\r\n * \u9A8C\u8BC1\u4E8B\u4EF6\u7C7B\u578B\u662F\u5426\u6709\u6548\r\n */\r\nexport class EventTypeValidator {\r\n private static validTypes = new Set([\r\n ...Object.values(CoreEvents).map(e => e.toString()),\r\n ...Object.values(ECSEventType),\r\n ...Object.values(EVENT_TYPES.CORE),\r\n ...Object.values(EVENT_TYPES.ENTITY),\r\n ...Object.values(EVENT_TYPES.COMPONENT),\r\n ...Object.values(EVENT_TYPES.SYSTEM),\r\n ...Object.values(EVENT_TYPES.PERFORMANCE)\r\n ]);\r\n \r\n /**\r\n * \u9A8C\u8BC1\u4E8B\u4EF6\u7C7B\u578B\u662F\u5426\u6709\u6548\r\n * @param eventType \u4E8B\u4EF6\u7C7B\u578B\r\n * @returns \u662F\u5426\u6709\u6548\r\n */\r\n public static isValid(eventType: string): boolean {\r\n return this.validTypes.has(eventType);\r\n }\r\n \r\n /**\r\n * \u83B7\u53D6\u6240\u6709\u6709\u6548\u7684\u4E8B\u4EF6\u7C7B\u578B\r\n * @returns \u4E8B\u4EF6\u7C7B\u578B\u6570\u7EC4\r\n */\r\n public static getAllValidTypes(): string[] {\r\n return Array.from(this.validTypes);\r\n }\r\n \r\n /**\r\n * \u6DFB\u52A0\u81EA\u5B9A\u4E49\u4E8B\u4EF6\u7C7B\u578B\r\n * @param eventType \u4E8B\u4EF6\u7C7B\u578B\r\n */\r\n public static addCustomType(eventType: string): void {\r\n this.validTypes.add(eventType);\r\n }\r\n \r\n /**\r\n * \u79FB\u9664\u81EA\u5B9A\u4E49\u4E8B\u4EF6\u7C7B\u578B\r\n * @param eventType \u4E8B\u4EF6\u7C7B\u578B\r\n */\r\n public static removeCustomType(eventType: string): void {\r\n this.validTypes.delete(eventType);\r\n }\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\nimport { EventBus } from './Core/EventBus';\r\nimport { ECSEventType } from './CoreEvents';\r\nimport { IComponentEventData } from '../Types';\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 * \u5168\u5C40\u4E8B\u4EF6\u603B\u7EBF\u5B9E\u4F8B\r\n * \u7528\u4E8E\u53D1\u5C04\u7EC4\u4EF6\u76F8\u5173\u4E8B\u4EF6\r\n */\r\n public static eventBus: EventBus | null = null;\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 // \u53D1\u5C04\u7EC4\u4EF6\u6DFB\u52A0\u4E8B\u4EF6\r\n if (Entity.eventBus) {\r\n Entity.eventBus.emitComponentAdded({\r\n timestamp: Date.now(),\r\n source: 'Entity',\r\n entityId: this.id,\r\n entityName: this.name,\r\n entityTag: this.tag?.toString(),\r\n componentType: componentType.name,\r\n component: component\r\n });\r\n }\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 // \u53D1\u5C04\u7EC4\u4EF6\u79FB\u9664\u4E8B\u4EF6\r\n if (Entity.eventBus) {\r\n Entity.eventBus.emitComponentRemoved({\r\n timestamp: Date.now(),\r\n source: 'Entity',\r\n entityId: this.id,\r\n entityName: this.name,\r\n entityTag: this.tag?.toString(),\r\n componentType: componentType.name,\r\n component: component\r\n });\r\n }\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 * WASM\u6A21\u5757\u52A0\u8F7D\u5668\r\n */\r\n\r\nimport { WasmModule, WasmEcsCoreInstance } from './types';\r\n\r\nexport class WasmLoader {\r\n private wasmModule: WasmModule | null = null;\r\n private wasmCore: WasmEcsCoreInstance | null = null;\r\n private silent = false;\r\n\r\n public setSilent(silent: boolean): void {\r\n this.silent = silent;\r\n }\r\n public async loadWasmModule(): Promise<boolean> {\r\n try {\r\n const wasmPath = '../../bin/wasm/ecs_wasm_core';\r\n this.wasmModule = await import(wasmPath);\r\n \r\n if (this.wasmModule) {\r\n await this.initializeWasmModule();\r\n this.wasmCore = new this.wasmModule.EcsCore();\r\n }\r\n \r\n return true;\r\n } catch (error) {\r\n if (!this.silent) {\r\n console.warn('WASM\u52A0\u8F7D\u5931\u8D25\uFF0C\u4F7F\u7528JavaScript\u5B9E\u73B0');\r\n }\r\n return false;\r\n }\r\n }\r\n\r\n private async initializeWasmModule(): Promise<void> {\r\n if (!this.wasmModule) return;\r\n\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 (fs.existsSync(wasmPath)) {\r\n const wasmBytes = fs.readFileSync(wasmPath);\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\r\n public getWasmCore(): WasmEcsCoreInstance | null {\r\n return this.wasmCore;\r\n }\r\n\r\n public getWasmModule(): WasmModule | null {\r\n return this.wasmModule;\r\n }\r\n\r\n public cleanup(): void {\r\n if (this.wasmCore && this.wasmCore.free) {\r\n this.wasmCore.free();\r\n }\r\n this.wasmCore = null;\r\n this.wasmModule = null;\r\n }\r\n} ", "/**\r\n * JavaScript\u56DE\u9000\u5B9E\u73B0\r\n */\r\n\r\nimport { EntityId, ComponentMask, QueryResult, PerformanceStats } from './types';\r\n\r\nexport class JavaScriptFallback {\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 createEntity(): EntityId {\r\n const entityId = this.jsNextEntityId++;\r\n this.jsEntityMasks.set(entityId, 0n);\r\n return entityId;\r\n }\r\n\r\n destroyEntity(entityId: EntityId): boolean {\r\n return this.jsEntityMasks.delete(entityId);\r\n }\r\n\r\n updateEntityMask(entityId: EntityId, mask: ComponentMask): void {\r\n this.jsEntityMasks.set(entityId, mask);\r\n this.jsUpdateCount++;\r\n }\r\n\r\n batchUpdateMasks(entityIds: EntityId[], masks: ComponentMask[]): void {\r\n for (let i = 0; i < entityIds.length && i < masks.length; i++) {\r\n this.jsEntityMasks.set(entityIds[i], masks[i]);\r\n }\r\n this.jsUpdateCount += Math.min(entityIds.length, masks.length);\r\n }\r\n\r\n queryEntities(mask: ComponentMask, maxResults: number = 10000): QueryResult {\r\n const results: number[] = [];\r\n \r\n for (const [entityId, entityMask] of this.jsEntityMasks) {\r\n if ((entityMask & mask) === mask) {\r\n results.push(entityId);\r\n if (results.length >= maxResults) break;\r\n }\r\n }\r\n \r\n this.jsQueryCount++;\r\n return {\r\n entities: new Uint32Array(results),\r\n count: results.length\r\n };\r\n }\r\n\r\n queryCached(mask: ComponentMask): QueryResult {\r\n return this.queryEntities(mask);\r\n }\r\n queryMultipleComponents(masks: ComponentMask[], maxResults: number = 10000): QueryResult {\r\n const results: number[] = [];\r\n \r\n for (const [entityId, entityMask] of this.jsEntityMasks) {\r\n let matches = false;\r\n for (const mask of masks) {\r\n if ((entityMask & mask) === mask) {\r\n matches = true;\r\n break;\r\n }\r\n }\r\n if (matches) {\r\n results.push(entityId);\r\n if (results.length >= maxResults) break;\r\n }\r\n }\r\n \r\n this.jsQueryCount++;\r\n return {\r\n entities: new Uint32Array(results),\r\n count: results.length\r\n };\r\n }\r\n\r\n queryWithExclusion(includeMask: ComponentMask, excludeMask: ComponentMask, maxResults: number = 10000): QueryResult {\r\n const results: number[] = [];\r\n \r\n for (const [entityId, entityMask] of this.jsEntityMasks) {\r\n if ((entityMask & includeMask) === includeMask && (entityMask & excludeMask) === 0n) {\r\n results.push(entityId);\r\n if (results.length >= maxResults) break;\r\n }\r\n }\r\n \r\n this.jsQueryCount++;\r\n return {\r\n entities: new Uint32Array(results),\r\n count: results.length\r\n };\r\n }\r\n\r\n getEntityMask(entityId: EntityId): ComponentMask | null {\r\n return this.jsEntityMasks.get(entityId) || null;\r\n }\r\n\r\n entityExists(entityId: EntityId): boolean {\r\n return this.jsEntityMasks.has(entityId);\r\n }\r\n createComponentMask(componentIds: number[]): ComponentMask {\r\n let mask = 0n;\r\n for (const id of componentIds) {\r\n mask |= (1n << BigInt(id));\r\n }\r\n return mask;\r\n }\r\n\r\n maskContainsComponent(mask: ComponentMask, componentId: number): boolean {\r\n return (mask & (1n << BigInt(componentId))) !== 0n;\r\n }\r\n getPerformanceStats(): PerformanceStats {\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 clear(): void {\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 getEntityCount(): number {\r\n return this.jsEntityMasks.size;\r\n }\r\n} ", "/**\r\n * WASM ECS\u6838\u5FC3\u6A21\u5757\r\n */\r\n\r\nimport { EntityId, ComponentMask, QueryResult, PerformanceStats, WasmEcsCoreInstance, WasmModule } from './types';\r\nimport { WasmLoader } from './loader';\r\nimport { JavaScriptFallback } from './fallback';\r\n\r\nexport class WasmEcsCore {\r\n private wasmLoader: WasmLoader;\r\n private jsFallback: JavaScriptFallback;\r\n private initialized = false;\r\n private usingWasm = false;\r\n\r\n constructor() {\r\n this.wasmLoader = new WasmLoader();\r\n this.jsFallback = new JavaScriptFallback();\r\n }\r\n\r\n public setSilent(silent: boolean): void {\r\n this.wasmLoader.setSilent(silent);\r\n }\r\n\r\n async initialize(): Promise<boolean> {\r\n if (this.initialized) return true;\r\n\r\n console.log('\uD83D\uDD04 \u521D\u59CB\u5316ECS\u6838\u5FC3...');\r\n this.usingWasm = await this.wasmLoader.loadWasmModule();\r\n this.initialized = true;\r\n\r\n return true;\r\n }\r\n\r\n createEntity(): EntityId {\r\n this.ensureInitialized();\r\n \r\n if (this.usingWasm) {\r\n const wasmCore = this.wasmLoader.getWasmCore();\r\n return wasmCore ? wasmCore.create_entity() : this.jsFallback.createEntity();\r\n }\r\n \r\n return this.jsFallback.createEntity();\r\n }\r\n\r\n destroyEntity(entityId: EntityId): boolean {\r\n this.ensureInitialized();\r\n \r\n if (this.usingWasm) {\r\n const wasmCore = this.wasmLoader.getWasmCore();\r\n return wasmCore ? wasmCore.destroy_entity(entityId) : this.jsFallback.destroyEntity(entityId);\r\n }\r\n \r\n return this.jsFallback.destroyEntity(entityId);\r\n }\r\n\r\n updateEntityMask(entityId: EntityId, mask: ComponentMask): void {\r\n this.ensureInitialized();\r\n \r\n if (this.usingWasm) {\r\n const wasmCore = this.wasmLoader.getWasmCore();\r\n if (wasmCore) {\r\n wasmCore.update_entity_mask(entityId, mask);\r\n } else {\r\n this.jsFallback.updateEntityMask(entityId, mask);\r\n }\r\n } else {\r\n this.jsFallback.updateEntityMask(entityId, mask);\r\n }\r\n }\r\n\r\n batchUpdateMasks(entityIds: EntityId[], masks: ComponentMask[]): void {\r\n this.ensureInitialized();\r\n \r\n if (this.usingWasm) {\r\n const wasmCore = this.wasmLoader.getWasmCore();\r\n if (wasmCore) {\r\n const entityIdArray = new Uint32Array(entityIds);\r\n const maskArray = new BigUint64Array(masks);\r\n wasmCore.batch_update_masks(entityIdArray, maskArray);\r\n } else {\r\n this.jsFallback.batchUpdateMasks(entityIds, masks);\r\n }\r\n } else {\r\n this.jsFallback.batchUpdateMasks(entityIds, masks);\r\n }\r\n }\r\n\r\n queryEntities(mask: ComponentMask, maxResults: number = 10000): QueryResult {\r\n this.ensureInitialized();\r\n \r\n if (this.usingWasm) {\r\n const wasmCore = this.wasmLoader.getWasmCore();\r\n if (wasmCore) {\r\n const resultPtr = wasmCore.query_entities(mask, maxResults);\r\n const count = wasmCore.get_query_result_count();\r\n \r\n const wasmModule = this.wasmLoader.getWasmModule();\r\n if (wasmModule && wasmModule.memory) {\r\n const memory = new Uint32Array(wasmModule.memory.buffer);\r\n const entities = new Uint32Array(count);\r\n for (let i = 0; i < count; i++) {\r\n entities[i] = memory[resultPtr / 4 + i];\r\n }\r\n return { entities, count };\r\n }\r\n }\r\n }\r\n \r\n return this.jsFallback.queryEntities(mask, maxResults);\r\n }\r\n\r\n queryCached(mask: ComponentMask): QueryResult {\r\n this.ensureInitialized();\r\n \r\n if (this.usingWasm) {\r\n const wasmCore = this.wasmLoader.getWasmCore();\r\n if (wasmCore) {\r\n const resultPtr = wasmCore.query_cached(mask);\r\n const count = wasmCore.get_cached_query_count(mask);\r\n \r\n const wasmModule = this.wasmLoader.getWasmModule();\r\n if (wasmModule && wasmModule.memory) {\r\n const memory = new Uint32Array(wasmModule.memory.buffer);\r\n const entities = new Uint32Array(count);\r\n for (let i = 0; i < count; i++) {\r\n entities[i] = memory[resultPtr / 4 + i];\r\n }\r\n return { entities, count };\r\n }\r\n }\r\n }\r\n \r\n return this.jsFallback.queryCached(mask);\r\n }\r\n\r\n queryMultipleComponents(masks: ComponentMask[], maxResults: number = 10000): QueryResult {\r\n this.ensureInitialized();\r\n \r\n if (this.usingWasm) {\r\n const wasmCore = this.wasmLoader.getWasmCore();\r\n if (wasmCore) {\r\n const maskArray = new BigUint64Array(masks);\r\n const resultPtr = wasmCore.query_multiple_components(maskArray, maxResults);\r\n const count = wasmCore.get_query_result_count();\r\n \r\n const wasmModule = this.wasmLoader.getWasmModule();\r\n if (wasmModule && wasmModule.memory) {\r\n const memory = new Uint32Array(wasmModule.memory.buffer);\r\n const entities = new Uint32Array(count);\r\n for (let i = 0; i < count; i++) {\r\n entities[i] = memory[resultPtr / 4 + i];\r\n }\r\n return { entities, count };\r\n }\r\n }\r\n }\r\n \r\n return this.jsFallback.queryMultipleComponents(masks, maxResults);\r\n }\r\n\r\n queryWithExclusion(includeMask: ComponentMask, excludeMask: ComponentMask, maxResults: number = 10000): QueryResult {\r\n this.ensureInitialized();\r\n \r\n if (this.usingWasm) {\r\n const wasmCore = this.wasmLoader.getWasmCore();\r\n if (wasmCore) {\r\n const resultPtr = wasmCore.query_with_exclusion(includeMask, excludeMask, maxResults);\r\n const count = wasmCore.get_query_result_count();\r\n \r\n const wasmModule = this.wasmLoader.getWasmModule();\r\n if (wasmModule && wasmModule.memory) {\r\n const memory = new Uint32Array(wasmModule.memory.buffer);\r\n const entities = new Uint32Array(count);\r\n for (let i = 0; i < count; i++) {\r\n entities[i] = memory[resultPtr / 4 + i];\r\n }\r\n return { entities, count };\r\n }\r\n }\r\n }\r\n \r\n return this.jsFallback.queryWithExclusion(includeMask, excludeMask, maxResults);\r\n }\r\n\r\n getEntityMask(entityId: EntityId): ComponentMask | null {\r\n this.ensureInitialized();\r\n \r\n if (this.usingWasm) {\r\n const wasmCore = this.wasmLoader.getWasmCore();\r\n if (wasmCore) {\r\n return wasmCore.get_entity_mask(entityId);\r\n }\r\n }\r\n \r\n return this.jsFallback.getEntityMask(entityId);\r\n }\r\n\r\n entityExists(entityId: EntityId): boolean {\r\n this.ensureInitialized();\r\n \r\n if (this.usingWasm) {\r\n const wasmCore = this.wasmLoader.getWasmCore();\r\n if (wasmCore) {\r\n return wasmCore.entity_exists(entityId);\r\n }\r\n }\r\n \r\n return this.jsFallback.entityExists(entityId);\r\n }\r\n\r\n createComponentMask(componentIds: number[]): ComponentMask {\r\n this.ensureInitialized();\r\n \r\n if (this.usingWasm) {\r\n const wasmModule = this.wasmLoader.getWasmModule();\r\n if (wasmModule) {\r\n const componentIdArray = new Uint32Array(componentIds);\r\n return wasmModule.create_component_mask(componentIdArray);\r\n }\r\n }\r\n \r\n return this.jsFallback.createComponentMask(componentIds);\r\n }\r\n\r\n maskContainsComponent(mask: ComponentMask, componentId: number): boolean {\r\n this.ensureInitialized();\r\n \r\n if (this.usingWasm) {\r\n const wasmModule = this.wasmLoader.getWasmModule();\r\n if (wasmModule) {\r\n return wasmModule.mask_contains_component(mask, componentId);\r\n }\r\n }\r\n \r\n return this.jsFallback.maskContainsComponent(mask, componentId);\r\n }\r\n\r\n getPerformanceStats(): PerformanceStats {\r\n this.ensureInitialized();\r\n \r\n if (this.usingWasm) {\r\n const wasmCore = this.wasmLoader.getWasmCore();\r\n if (wasmCore) {\r\n const stats = wasmCore.get_performance_stats();\r\n return {\r\n entityCount: stats[0] || 0,\r\n indexCount: stats[1] || 0,\r\n queryCount: stats[2] || 0,\r\n updateCount: stats[3] || 0,\r\n wasmEnabled: true\r\n };\r\n }\r\n }\r\n \r\n return this.jsFallback.getPerformanceStats();\r\n }\r\n\r\n clear(): void {\r\n this.ensureInitialized();\r\n \r\n if (this.usingWasm) {\r\n const wasmCore = this.wasmLoader.getWasmCore();\r\n if (wasmCore) {\r\n wasmCore.clear();\r\n }\r\n }\r\n \r\n this.jsFallback.clear();\r\n }\r\n\r\n isUsingWasm(): boolean {\r\n return this.usingWasm;\r\n }\r\n\r\n isInitialized(): boolean {\r\n return this.initialized;\r\n }\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() \u65B9\u6CD5');\r\n }\r\n }\r\n\r\n cleanup(): void {\r\n this.wasmLoader.cleanup();\r\n this.jsFallback.clear();\r\n this.initialized = false;\r\n this.usingWasm = false;\r\n }\r\n} ", "/**\r\n * WASM ECS\u6838\u5FC3\u5168\u5C40\u5B9E\u4F8B\r\n */\r\n\r\nimport { WasmEcsCore } from './core';\r\n\r\nexport const ecsCore = new WasmEcsCore();\r\n\r\nexport async function initializeEcs(silent: boolean = false): Promise<boolean> {\r\n ecsCore.setSilent(silent);\r\n return await ecsCore.initialize();\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 { ComponentType } from './ComponentStorage';\r\n\r\n/**\r\n * \u7EC4\u4EF6\u7D22\u5F15\u7C7B\u578B\r\n */\r\nexport enum IndexType {\r\n /** \u54C8\u5E0C\u7D22\u5F15 - \u6700\u5FEB\u67E5\u627E */\r\n HASH = 'hash',\r\n /** \u4F4D\u56FE\u7D22\u5F15 - \u5185\u5B58\u9AD8\u6548 */\r\n BITMAP = 'bitmap',\r\n /** \u6392\u5E8F\u7D22\u5F15 - \u652F\u6301\u8303\u56F4\u67E5\u8BE2 */\r\n SORTED = 'sorted'\r\n}\r\n\r\n/**\r\n * \u7D22\u5F15\u7EDF\u8BA1\u4FE1\u606F\r\n */\r\nexport interface IndexStats {\r\n /** \u7D22\u5F15\u7C7B\u578B */\r\n type: IndexType;\r\n /** \u7D22\u5F15\u5927\u5C0F */\r\n size: number;\r\n /** \u5185\u5B58\u4F7F\u7528\u91CF\uFF08\u5B57\u8282\uFF09 */\r\n memoryUsage: number;\r\n /** \u67E5\u8BE2\u6B21\u6570 */\r\n queryCount: number;\r\n /** \u5E73\u5747\u67E5\u8BE2\u65F6\u95F4\uFF08\u6BEB\u79D2\uFF09 */\r\n avgQueryTime: number;\r\n /** \u6700\u540E\u66F4\u65B0\u65F6\u95F4 */\r\n lastUpdated: number;\r\n}\r\n\r\n/**\r\n * \u7EC4\u4EF6\u7D22\u5F15\u63A5\u53E3\r\n */\r\nexport interface IComponentIndex {\r\n /** \u7D22\u5F15\u7C7B\u578B */\r\n readonly type: IndexType;\r\n /** \u6DFB\u52A0\u5B9E\u4F53\u5230\u7D22\u5F15 */\r\n addEntity(entity: Entity): void;\r\n /** \u4ECE\u7D22\u5F15\u4E2D\u79FB\u9664\u5B9E\u4F53 */\r\n removeEntity(entity: Entity): void;\r\n /** \u67E5\u8BE2\u5305\u542B\u6307\u5B9A\u7EC4\u4EF6\u7684\u5B9E\u4F53 */\r\n query(componentType: ComponentType): Set<Entity>;\r\n /** \u6279\u91CF\u67E5\u8BE2\u591A\u4E2A\u7EC4\u4EF6 */\r\n queryMultiple(componentTypes: ComponentType[], operation: 'AND' | 'OR'): Set<Entity>;\r\n /** \u6E05\u7A7A\u7D22\u5F15 */\r\n clear(): void;\r\n /** \u83B7\u53D6\u7D22\u5F15\u7EDF\u8BA1\u4FE1\u606F */\r\n getStats(): IndexStats;\r\n}\r\n\r\n/**\r\n * \u54C8\u5E0C\u7D22\u5F15\u5B9E\u73B0\r\n * \r\n * \u4F7F\u7528Map\u6570\u636E\u7ED3\u6784\uFF0C\u63D0\u4F9BO(1)\u7684\u67E5\u627E\u6027\u80FD\u3002\r\n * \u9002\u5408\u5927\u591A\u6570\u67E5\u8BE2\u573A\u666F\u3002\r\n */\r\nexport class HashComponentIndex implements IComponentIndex {\r\n public readonly type = IndexType.HASH;\r\n \r\n private _componentToEntities = new Map<ComponentType, Set<Entity>>();\r\n private _entityToComponents = new Map<Entity, Set<ComponentType>>();\r\n private _queryCount = 0;\r\n private _totalQueryTime = 0;\r\n private _lastUpdated = Date.now();\r\n \r\n public addEntity(entity: Entity): void {\r\n const components = entity.components;\r\n const componentTypes = new Set<ComponentType>();\r\n \r\n for (const component of components) {\r\n const componentType = component.constructor as ComponentType;\r\n componentTypes.add(componentType);\r\n \r\n let entities = this._componentToEntities.get(componentType);\r\n if (!entities) {\r\n entities = new Set();\r\n this._componentToEntities.set(componentType, entities);\r\n }\r\n entities.add(entity);\r\n }\r\n \r\n this._entityToComponents.set(entity, componentTypes);\r\n this._lastUpdated = Date.now();\r\n }\r\n \r\n public removeEntity(entity: Entity): void {\r\n const componentTypes = this._entityToComponents.get(entity);\r\n if (!componentTypes) return;\r\n \r\n for (const componentType of componentTypes) {\r\n const entities = this._componentToEntities.get(componentType);\r\n if (entities) {\r\n entities.delete(entity);\r\n if (entities.size === 0) {\r\n this._componentToEntities.delete(componentType);\r\n }\r\n }\r\n }\r\n \r\n this._entityToComponents.delete(entity);\r\n this._lastUpdated = Date.now();\r\n }\r\n \r\n public query(componentType: ComponentType): Set<Entity> {\r\n const startTime = performance.now();\r\n const result = new Set(this._componentToEntities.get(componentType) || []);\r\n \r\n this._queryCount++;\r\n this._totalQueryTime += performance.now() - startTime;\r\n \r\n return result;\r\n }\r\n \r\n public queryMultiple(componentTypes: ComponentType[], operation: 'AND' | 'OR'): Set<Entity> {\r\n const startTime = performance.now();\r\n \r\n if (componentTypes.length === 0) {\r\n return new Set();\r\n }\r\n \r\n if (componentTypes.length === 1) {\r\n return this.query(componentTypes[0]);\r\n }\r\n \r\n let result: Set<Entity>;\r\n \r\n if (operation === 'AND') {\r\n let smallestSet: Set<Entity> | undefined;\r\n let smallestSize = Infinity;\r\n \r\n for (const componentType of componentTypes) {\r\n const entities = this._componentToEntities.get(componentType);\r\n if (!entities || entities.size === 0) {\r\n this._queryCount++;\r\n this._totalQueryTime += performance.now() - startTime;\r\n return new Set();\r\n }\r\n if (entities.size < smallestSize) {\r\n smallestSize = entities.size;\r\n smallestSet = entities;\r\n }\r\n }\r\n \r\n result = new Set();\r\n if (smallestSet) {\r\n for (const entity of smallestSet) {\r\n let hasAll = true;\r\n for (const componentType of componentTypes) {\r\n const entities = this._componentToEntities.get(componentType);\r\n if (!entities || !entities.has(entity)) {\r\n hasAll = false;\r\n break;\r\n }\r\n }\r\n if (hasAll) {\r\n result.add(entity);\r\n }\r\n }\r\n }\r\n } else {\r\n result = new Set();\r\n for (const componentType of componentTypes) {\r\n const entities = this._componentToEntities.get(componentType);\r\n if (entities) {\r\n for (const entity of entities) {\r\n result.add(entity);\r\n }\r\n }\r\n }\r\n }\r\n \r\n this._queryCount++;\r\n this._totalQueryTime += performance.now() - startTime;\r\n \r\n return result;\r\n }\r\n \r\n public clear(): void {\r\n this._componentToEntities.clear();\r\n this._entityToComponents.clear();\r\n this._lastUpdated = Date.now();\r\n }\r\n \r\n public getStats(): IndexStats {\r\n let memoryUsage = 0;\r\n \r\n memoryUsage += this._componentToEntities.size * 64;\r\n memoryUsage += this._entityToComponents.size * 64;\r\n \r\n for (const entities of this._componentToEntities.values()) {\r\n memoryUsage += entities.size * 8;\r\n }\r\n \r\n for (const components of this._entityToComponents.values()) {\r\n memoryUsage += components.size * 8;\r\n }\r\n \r\n return {\r\n type: this.type,\r\n size: this._componentToEntities.size,\r\n memoryUsage,\r\n queryCount: this._queryCount,\r\n avgQueryTime: this._queryCount > 0 ? this._totalQueryTime / this._queryCount : 0,\r\n lastUpdated: this._lastUpdated\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * \u4F4D\u56FE\u7D22\u5F15\u5B9E\u73B0\r\n * \r\n * \u4F7F\u7528\u4F4D\u64CD\u4F5C\u8FDB\u884C\u5FEB\u901F\u96C6\u5408\u8FD0\u7B97\uFF0C\u5185\u5B58\u6548\u7387\u9AD8\u3002\r\n * \u9002\u5408\u6709\u9650\u7EC4\u4EF6\u7C7B\u578B\u548C\u5927\u91CF\u5B9E\u4F53\u7684\u573A\u666F\u3002\r\n */\r\nexport class BitmapComponentIndex implements IComponentIndex {\r\n public readonly type = IndexType.BITMAP;\r\n \r\n private _componentTypeToBit = new Map<ComponentType, number>();\r\n private _entityToBitmap = new Map<Entity, number>();\r\n private _bitToEntities = new Map<number, Set<Entity>>();\r\n private _nextBit = 0;\r\n private _queryCount = 0;\r\n private _totalQueryTime = 0;\r\n private _lastUpdated = Date.now();\r\n \r\n public addEntity(entity: Entity): void {\r\n let bitmap = 0;\r\n \r\n for (const component of entity.components) {\r\n const componentType = component.constructor as ComponentType;\r\n let bit = this._componentTypeToBit.get(componentType);\r\n \r\n if (bit === undefined) {\r\n bit = this._nextBit++;\r\n this._componentTypeToBit.set(componentType, bit);\r\n }\r\n \r\n bitmap |= (1 << bit);\r\n \r\n let entities = this._bitToEntities.get(1 << bit);\r\n if (!entities) {\r\n entities = new Set();\r\n this._bitToEntities.set(1 << bit, entities);\r\n }\r\n entities.add(entity);\r\n }\r\n \r\n this._entityToBitmap.set(entity, bitmap);\r\n this._lastUpdated = Date.now();\r\n }\r\n \r\n public removeEntity(entity: Entity): void {\r\n const bitmap = this._entityToBitmap.get(entity);\r\n if (bitmap === undefined) return;\r\n \r\n // \u4ECE\u6240\u6709\u76F8\u5173\u7684\u4F4D\u96C6\u5408\u4E2D\u79FB\u9664\u5B9E\u4F53\r\n for (const [bitMask, entities] of this._bitToEntities) {\r\n if ((bitmap & bitMask) !== 0) {\r\n entities.delete(entity);\r\n if (entities.size === 0) {\r\n this._bitToEntities.delete(bitMask);\r\n }\r\n }\r\n }\r\n \r\n this._entityToBitmap.delete(entity);\r\n this._lastUpdated = Date.now();\r\n }\r\n \r\n public query(componentType: ComponentType): Set<Entity> {\r\n const startTime = performance.now();\r\n \r\n const bit = this._componentTypeToBit.get(componentType);\r\n if (bit === undefined) {\r\n this._queryCount++;\r\n this._totalQueryTime += performance.now() - startTime;\r\n return new Set();\r\n }\r\n \r\n const result = new Set(this._bitToEntities.get(1 << bit) || []);\r\n \r\n this._queryCount++;\r\n this._totalQueryTime += performance.now() - startTime;\r\n \r\n return result;\r\n }\r\n \r\n public queryMultiple(componentTypes: ComponentType[], operation: 'AND' | 'OR'): Set<Entity> {\r\n const startTime = performance.now();\r\n \r\n if (componentTypes.length === 0) {\r\n return new Set();\r\n }\r\n \r\n let targetBitmap = 0;\r\n const validBits: number[] = [];\r\n \r\n for (const componentType of componentTypes) {\r\n const bit = this._componentTypeToBit.get(componentType);\r\n if (bit !== undefined) {\r\n targetBitmap |= (1 << bit);\r\n validBits.push(1 << bit);\r\n }\r\n }\r\n \r\n const result = new Set<Entity>();\r\n \r\n if (operation === 'AND') {\r\n for (const [entity, entityBitmap] of this._entityToBitmap) {\r\n if ((entityBitmap & targetBitmap) === targetBitmap) {\r\n result.add(entity);\r\n }\r\n }\r\n } else {\r\n for (const bitMask of validBits) {\r\n const entities = this._bitToEntities.get(bitMask);\r\n if (entities) {\r\n for (const entity of entities) {\r\n result.add(entity);\r\n }\r\n }\r\n }\r\n }\r\n \r\n this._queryCount++;\r\n this._totalQueryTime += performance.now() - startTime;\r\n \r\n return result;\r\n }\r\n \r\n public clear(): void {\r\n this._componentTypeToBit.clear();\r\n this._entityToBitmap.clear();\r\n this._bitToEntities.clear();\r\n this._nextBit = 0;\r\n this._lastUpdated = Date.now();\r\n }\r\n \r\n public getStats(): IndexStats {\r\n let memoryUsage = 0;\r\n \r\n memoryUsage += this._componentTypeToBit.size * 12;\r\n memoryUsage += this._entityToBitmap.size * 12;\r\n memoryUsage += this._bitToEntities.size * 64;\r\n \r\n for (const entities of this._bitToEntities.values()) {\r\n memoryUsage += entities.size * 8;\r\n }\r\n \r\n return {\r\n type: this.type,\r\n size: this._componentTypeToBit.size,\r\n memoryUsage,\r\n queryCount: this._queryCount,\r\n avgQueryTime: this._queryCount > 0 ? this._totalQueryTime / this._queryCount : 0,\r\n lastUpdated: this._lastUpdated\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * \u667A\u80FD\u7EC4\u4EF6\u7D22\u5F15\u7BA1\u7406\u5668\r\n * \r\n * \u6839\u636E\u4F7F\u7528\u6A21\u5F0F\u81EA\u52A8\u9009\u62E9\u6700\u4F18\u7684\u7D22\u5F15\u7B56\u7565\u3002\r\n * \u652F\u6301\u52A8\u6001\u5207\u6362\u7D22\u5F15\u7C7B\u578B\u4EE5\u83B7\u5F97\u6700\u4F73\u6027\u80FD\u3002\r\n */\r\nexport class ComponentIndexManager {\r\n private _activeIndex: IComponentIndex;\r\n private _indexHistory: Map<IndexType, IndexStats> = new Map();\r\n private _autoOptimize = true;\r\n private _optimizationThreshold = 1000;\r\n \r\n constructor(initialType: IndexType = IndexType.HASH) {\r\n this._activeIndex = this.createIndex(initialType);\r\n }\r\n \r\n /**\r\n * \u6DFB\u52A0\u5B9E\u4F53\u5230\u7D22\u5F15\r\n */\r\n public addEntity(entity: Entity): void {\r\n this._activeIndex.addEntity(entity);\r\n this.checkOptimization();\r\n }\r\n \r\n /**\r\n * \u4ECE\u7D22\u5F15\u4E2D\u79FB\u9664\u5B9E\u4F53\r\n */\r\n public removeEntity(entity: Entity): void {\r\n this._activeIndex.removeEntity(entity);\r\n }\r\n \r\n /**\r\n * \u67E5\u8BE2\u5305\u542B\u6307\u5B9A\u7EC4\u4EF6\u7684\u5B9E\u4F53\r\n */\r\n public query(componentType: ComponentType): Set<Entity> {\r\n return this._activeIndex.query(componentType);\r\n }\r\n \r\n /**\r\n * \u6279\u91CF\u67E5\u8BE2\u591A\u4E2A\u7EC4\u4EF6\r\n */\r\n public queryMultiple(componentTypes: ComponentType[], operation: 'AND' | 'OR'): Set<Entity> {\r\n return this._activeIndex.queryMultiple(componentTypes, operation);\r\n }\r\n \r\n /**\r\n * \u624B\u52A8\u5207\u6362\u7D22\u5F15\u7C7B\u578B\r\n */\r\n public switchIndexType(type: IndexType): void {\r\n if (type === this._activeIndex.type) return;\r\n \r\n this._indexHistory.set(this._activeIndex.type, this._activeIndex.getStats());\r\n \r\n const oldIndex = this._activeIndex;\r\n this._activeIndex = this.createIndex(type);\r\n \r\n oldIndex.clear();\r\n }\r\n \r\n /**\r\n * \u542F\u7528/\u7981\u7528\u81EA\u52A8\u4F18\u5316\r\n */\r\n public setAutoOptimize(enabled: boolean): void {\r\n this._autoOptimize = enabled;\r\n }\r\n \r\n /**\r\n * \u83B7\u53D6\u5F53\u524D\u7D22\u5F15\u7EDF\u8BA1\u4FE1\u606F\r\n */\r\n public getStats(): IndexStats {\r\n return this._activeIndex.getStats();\r\n }\r\n \r\n /**\r\n * \u83B7\u53D6\u6240\u6709\u7D22\u5F15\u7C7B\u578B\u7684\u5386\u53F2\u7EDF\u8BA1\u4FE1\u606F\r\n */\r\n public getAllStats(): Map<IndexType, IndexStats> {\r\n const current = this._activeIndex.getStats();\r\n return new Map([\r\n ...this._indexHistory,\r\n [current.type, current]\r\n ]);\r\n }\r\n \r\n /**\r\n * \u6E05\u7A7A\u7D22\u5F15\r\n */\r\n public clear(): void {\r\n this._activeIndex.clear();\r\n }\r\n \r\n /**\r\n * \u521B\u5EFA\u6307\u5B9A\u7C7B\u578B\u7684\u7D22\u5F15\r\n */\r\n private createIndex(type: IndexType): IComponentIndex {\r\n switch (type) {\r\n case IndexType.HASH:\r\n return new HashComponentIndex();\r\n case IndexType.BITMAP:\r\n return new BitmapComponentIndex();\r\n case IndexType.SORTED:\r\n return new HashComponentIndex();\r\n default:\r\n return new HashComponentIndex();\r\n }\r\n }\r\n \r\n /**\r\n * \u68C0\u67E5\u662F\u5426\u9700\u8981\u4F18\u5316\u7D22\u5F15\r\n */\r\n private checkOptimization(): void {\r\n if (!this._autoOptimize) return;\r\n \r\n const stats = this._activeIndex.getStats();\r\n if (stats.queryCount < this._optimizationThreshold) return;\r\n \r\n\r\n if (stats.avgQueryTime > 1.0 && stats.type !== IndexType.HASH) {\r\n this.switchIndexType(IndexType.HASH);\r\n } else if (stats.memoryUsage > 10 * 1024 * 1024 && stats.type !== IndexType.BITMAP) {\r\n this.switchIndexType(IndexType.BITMAP);\r\n }\r\n }\r\n} ", "import { Entity } from '../Entity';\r\nimport { ComponentType } from './ComponentStorage';\r\n\r\n/**\r\n * \u539F\u578B\u6807\u8BC6\u7B26\r\n */\r\nexport type ArchetypeId = string;\r\n\r\n/**\r\n * \u539F\u578B\u6570\u636E\u7ED3\u6784\r\n */\r\nexport interface Archetype {\r\n /** \u539F\u578B\u552F\u4E00\u6807\u8BC6\u7B26 */\r\n id: ArchetypeId;\r\n /** \u5305\u542B\u7684\u7EC4\u4EF6\u7C7B\u578B */\r\n componentTypes: ComponentType[];\r\n /** \u5C5E\u4E8E\u8BE5\u539F\u578B\u7684\u5B9E\u4F53\u5217\u8868 */\r\n entities: Entity[];\r\n /** \u539F\u578B\u521B\u5EFA\u65F6\u95F4 */\r\n createdAt: number;\r\n /** \u6700\u540E\u66F4\u65B0\u65F6\u95F4 */\r\n updatedAt: number;\r\n}\r\n\r\n/**\r\n * \u539F\u578B\u67E5\u8BE2\u7ED3\u679C\r\n */\r\nexport interface ArchetypeQueryResult {\r\n /** \u5339\u914D\u7684\u539F\u578B\u5217\u8868 */\r\n archetypes: Archetype[];\r\n /** \u6240\u6709\u5339\u914D\u5B9E\u4F53\u7684\u603B\u6570 */\r\n totalEntities: number;\r\n /** \u67E5\u8BE2\u6267\u884C\u65F6\u95F4\uFF08\u6BEB\u79D2\uFF09 */\r\n executionTime: number;\r\n /** \u662F\u5426\u4F7F\u7528\u4E86\u7F13\u5B58 */\r\n fromCache: boolean;\r\n}\r\n\r\n/**\r\n * Archetype\u7CFB\u7EDF\r\n * \r\n * \u6839\u636E\u5B9E\u4F53\u7684\u7EC4\u4EF6\u7EC4\u5408\u5C06\u5B9E\u4F53\u5206\u7EC4\u5230\u4E0D\u540C\u7684\u539F\u578B\u4E2D\uFF0C\u63D0\u4F9B\u9AD8\u6548\u7684\u67E5\u8BE2\u6027\u80FD\u3002\r\n */\r\nexport class ArchetypeSystem {\r\n /** \u6240\u6709\u539F\u578B\u7684\u6620\u5C04\u8868 */\r\n private _archetypes = new Map<ArchetypeId, Archetype>();\r\n \r\n /** \u5B9E\u4F53\u5230\u539F\u578B\u7684\u6620\u5C04 */\r\n private _entityToArchetype = new Map<Entity, Archetype>();\r\n \r\n /** \u7EC4\u4EF6\u7C7B\u578B\u5230\u539F\u578B\u7684\u6620\u5C04 */\r\n private _componentToArchetypes = new Map<ComponentType, Set<Archetype>>();\r\n \r\n /** \u67E5\u8BE2\u7F13\u5B58 */\r\n private _queryCache = new Map<string, {\r\n result: ArchetypeQueryResult;\r\n timestamp: number;\r\n }>();\r\n \r\n private _cacheTimeout = 5000;\r\n private _maxCacheSize = 100;\r\n \r\n /**\r\n * \u6DFB\u52A0\u5B9E\u4F53\u5230\u539F\u578B\u7CFB\u7EDF\r\n */\r\n public addEntity(entity: Entity): void {\r\n const componentTypes = this.getEntityComponentTypes(entity);\r\n const archetypeId = this.generateArchetypeId(componentTypes);\r\n \r\n let archetype = this._archetypes.get(archetypeId);\r\n if (!archetype) {\r\n archetype = this.createArchetype(componentTypes);\r\n }\r\n \r\n archetype.entities.push(entity);\r\n archetype.updatedAt = Date.now();\r\n this._entityToArchetype.set(entity, archetype);\r\n \r\n this.updateComponentIndexes(archetype, componentTypes, true);\r\n this.invalidateQueryCache();\r\n }\r\n \r\n /**\r\n * \u4ECE\u539F\u578B\u7CFB\u7EDF\u4E2D\u79FB\u9664\u5B9E\u4F53\r\n */\r\n public removeEntity(entity: Entity): void {\r\n const archetype = this._entityToArchetype.get(entity);\r\n if (!archetype) return;\r\n \r\n const index = archetype.entities.indexOf(entity);\r\n if (index !== -1) {\r\n archetype.entities.splice(index, 1);\r\n archetype.updatedAt = Date.now();\r\n }\r\n \r\n this._entityToArchetype.delete(entity);\r\n this.invalidateQueryCache();\r\n }\r\n \r\n /**\r\n * \u67E5\u8BE2\u5305\u542B\u6307\u5B9A\u7EC4\u4EF6\u7EC4\u5408\u7684\u539F\u578B\r\n */\r\n public queryArchetypes(componentTypes: ComponentType[], operation: 'AND' | 'OR' = 'AND'): ArchetypeQueryResult {\r\n const startTime = performance.now();\r\n \r\n const cacheKey = `${operation}:${componentTypes.map(t => t.name).sort().join(',')}`;\r\n \r\n // \u68C0\u67E5\u7F13\u5B58\r\n const cached = this._queryCache.get(cacheKey);\r\n if (cached && (Date.now() - cached.timestamp < this._cacheTimeout)) {\r\n return {\r\n ...cached.result,\r\n executionTime: performance.now() - startTime,\r\n fromCache: true\r\n };\r\n }\r\n \r\n const matchingArchetypes: Archetype[] = [];\r\n let totalEntities = 0;\r\n \r\n if (operation === 'AND') {\r\n for (const archetype of this._archetypes.values()) {\r\n if (this.archetypeContainsAllComponents(archetype, componentTypes)) {\r\n matchingArchetypes.push(archetype);\r\n totalEntities += archetype.entities.length;\r\n }\r\n }\r\n } else {\r\n const foundArchetypes = new Set<Archetype>();\r\n \r\n for (const componentType of componentTypes) {\r\n const archetypes = this._componentToArchetypes.get(componentType);\r\n if (archetypes) {\r\n for (const archetype of archetypes) {\r\n foundArchetypes.add(archetype);\r\n }\r\n }\r\n }\r\n \r\n for (const archetype of foundArchetypes) {\r\n matchingArchetypes.push(archetype);\r\n totalEntities += archetype.entities.length;\r\n }\r\n }\r\n \r\n const result: ArchetypeQueryResult = {\r\n archetypes: matchingArchetypes,\r\n totalEntities,\r\n executionTime: performance.now() - startTime,\r\n fromCache: false\r\n };\r\n \r\n // \u7F13\u5B58\u7ED3\u679C\r\n this._queryCache.set(cacheKey, {\r\n result,\r\n timestamp: Date.now()\r\n });\r\n \r\n return result;\r\n }\r\n \r\n /**\r\n * \u83B7\u53D6\u5B9E\u4F53\u6240\u5C5E\u7684\u539F\u578B\r\n */\r\n public getEntityArchetype(entity: Entity): Archetype | undefined {\r\n return this._entityToArchetype.get(entity);\r\n }\r\n \r\n /**\r\n * \u83B7\u53D6\u6240\u6709\u539F\u578B\r\n */\r\n public getAllArchetypes(): Archetype[] {\r\n return Array.from(this._archetypes.values());\r\n }\r\n \r\n /**\r\n * \u6E05\u7A7A\u6240\u6709\u6570\u636E\r\n */\r\n public clear(): void {\r\n this._archetypes.clear();\r\n this._entityToArchetype.clear();\r\n this._componentToArchetypes.clear();\r\n this._queryCache.clear();\r\n }\r\n \r\n /**\r\n * \u83B7\u53D6\u5B9E\u4F53\u7684\u7EC4\u4EF6\u7C7B\u578B\u5217\u8868\r\n */\r\n private getEntityComponentTypes(entity: Entity): ComponentType[] {\r\n return entity.components.map(component => component.constructor as ComponentType);\r\n }\r\n \r\n /**\r\n * \u751F\u6210\u539F\u578BID\r\n */\r\n private generateArchetypeId(componentTypes: ComponentType[]): ArchetypeId {\r\n return componentTypes\r\n .map(type => type.name)\r\n .sort()\r\n .join('|');\r\n }\r\n \r\n /**\r\n * \u521B\u5EFA\u65B0\u539F\u578B\r\n */\r\n private createArchetype(componentTypes: ComponentType[]): Archetype {\r\n const id = this.generateArchetypeId(componentTypes);\r\n \r\n const archetype: Archetype = {\r\n id,\r\n componentTypes: [...componentTypes],\r\n entities: [],\r\n createdAt: Date.now(),\r\n updatedAt: Date.now()\r\n };\r\n \r\n this._archetypes.set(id, archetype);\r\n return archetype;\r\n }\r\n \r\n /**\r\n * \u68C0\u67E5\u539F\u578B\u662F\u5426\u5305\u542B\u6240\u6709\u6307\u5B9A\u7EC4\u4EF6\r\n */\r\n private archetypeContainsAllComponents(archetype: Archetype, componentTypes: ComponentType[]): boolean {\r\n for (const componentType of componentTypes) {\r\n if (!archetype.componentTypes.includes(componentType)) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n \r\n /**\r\n * \u66F4\u65B0\u7EC4\u4EF6\u7D22\u5F15\r\n */\r\n private updateComponentIndexes(archetype: Archetype, componentTypes: ComponentType[], add: boolean): void {\r\n for (const componentType of componentTypes) {\r\n let archetypes = this._componentToArchetypes.get(componentType);\r\n if (!archetypes) {\r\n archetypes = new Set();\r\n this._componentToArchetypes.set(componentType, archetypes);\r\n }\r\n \r\n if (add) {\r\n archetypes.add(archetype);\r\n } else {\r\n archetypes.delete(archetype);\r\n if (archetypes.size === 0) {\r\n this._componentToArchetypes.delete(componentType);\r\n }\r\n }\r\n }\r\n }\r\n \r\n /**\r\n * \u4F7F\u67E5\u8BE2\u7F13\u5B58\u5931\u6548\r\n */\r\n private invalidateQueryCache(): void {\r\n this._queryCache.clear();\r\n }\r\n}\r\n", "import { Entity } from '../Entity';\r\nimport { Component } from '../Component';\r\nimport { ComponentType } from './ComponentStorage';\r\n\r\n/**\r\n * \u810F\u6807\u8BB0\u7C7B\u578B\r\n */\r\nexport enum DirtyFlag {\r\n /** \u7EC4\u4EF6\u6570\u636E\u5DF2\u4FEE\u6539 */\r\n COMPONENT_MODIFIED = 1 << 0,\r\n /** \u7EC4\u4EF6\u5DF2\u6DFB\u52A0 */\r\n COMPONENT_ADDED = 1 << 1,\r\n /** \u7EC4\u4EF6\u5DF2\u79FB\u9664 */\r\n COMPONENT_REMOVED = 1 << 2,\r\n /** \u5B9E\u4F53\u4F4D\u7F6E\u5DF2\u6539\u53D8 */\r\n TRANSFORM_CHANGED = 1 << 3,\r\n /** \u5B9E\u4F53\u72B6\u6001\u5DF2\u6539\u53D8 */\r\n STATE_CHANGED = 1 << 4,\r\n /** \u81EA\u5B9A\u4E49\u6807\u8BB01 */\r\n CUSTOM_1 = 1 << 8,\r\n /** \u81EA\u5B9A\u4E49\u6807\u8BB02 */\r\n CUSTOM_2 = 1 << 9,\r\n /** \u81EA\u5B9A\u4E49\u6807\u8BB03 */\r\n CUSTOM_3 = 1 << 10,\r\n /** \u6240\u6709\u6807\u8BB0 */\r\n ALL = 0xFFFFFFFF\r\n}\r\n\r\n/**\r\n * \u810F\u6807\u8BB0\u6570\u636E\r\n */\r\nexport interface DirtyData {\r\n /** \u5B9E\u4F53\u5F15\u7528 */\r\n entity: Entity;\r\n /** \u810F\u6807\u8BB0\u4F4D */\r\n flags: number;\r\n /** \u4FEE\u6539\u7684\u7EC4\u4EF6\u7C7B\u578B\u5217\u8868 */\r\n modifiedComponents: Set<ComponentType>;\r\n /** \u6807\u8BB0\u65F6\u95F4\u6233 */\r\n timestamp: number;\r\n /** \u5E27\u7F16\u53F7 */\r\n frameNumber: number;\r\n}\r\n\r\n/**\r\n * \u810F\u6807\u8BB0\u76D1\u542C\u5668\r\n */\r\nexport interface DirtyListener {\r\n /** \u611F\u5174\u8DA3\u7684\u6807\u8BB0\u7C7B\u578B */\r\n flags: number;\r\n /** \u56DE\u8C03\u51FD\u6570 */\r\n callback: (dirtyData: DirtyData) => void;\r\n /** \u76D1\u542C\u5668\u4F18\u5148\u7EA7\uFF08\u6570\u5B57\u8D8A\u5C0F\u4F18\u5148\u7EA7\u8D8A\u9AD8\uFF09 */\r\n priority?: number;\r\n}\r\n\r\n/**\r\n * \u810F\u6807\u8BB0\u7EDF\u8BA1\u4FE1\u606F\r\n */\r\nexport interface DirtyStats {\r\n /** \u5F53\u524D\u810F\u5B9E\u4F53\u6570\u91CF */\r\n dirtyEntityCount: number;\r\n /** \u603B\u6807\u8BB0\u6B21\u6570 */\r\n totalMarkings: number;\r\n /** \u603B\u6E05\u7406\u6B21\u6570 */\r\n totalCleanups: number;\r\n /** \u76D1\u542C\u5668\u6570\u91CF */\r\n listenerCount: number;\r\n /** \u5E73\u5747\u6BCF\u5E27\u810F\u5B9E\u4F53\u6570\u91CF */\r\n avgDirtyPerFrame: number;\r\n /** \u5185\u5B58\u4F7F\u7528\u91CF\u4F30\u7B97 */\r\n estimatedMemoryUsage: number;\r\n}\r\n\r\n/**\r\n * \u810F\u6807\u8BB0\u8FFD\u8E2A\u7CFB\u7EDF\r\n * \r\n * \u63D0\u4F9B\u9AD8\u6548\u7684\u7EC4\u4EF6\u548C\u5B9E\u4F53\u53D8\u66F4\u8FFD\u8E2A\uFF0C\u907F\u514D\u4E0D\u5FC5\u8981\u7684\u8BA1\u7B97\u548C\u66F4\u65B0\u3002\r\n * \u652F\u6301\u7EC6\u7C92\u5EA6\u7684\u810F\u6807\u8BB0\u548C\u6279\u91CF\u5904\u7406\u673A\u5236\u3002\r\n * \r\n * @example\r\n * ```typescript\r\n * const dirtySystem = new DirtyTrackingSystem();\r\n * \r\n * // \u6807\u8BB0\u5B9E\u4F53\u7684\u4F4D\u7F6E\u7EC4\u4EF6\u5DF2\u4FEE\u6539\r\n * dirtySystem.markDirty(entity, DirtyFlag.TRANSFORM_CHANGED, [PositionComponent]);\r\n * \r\n * // \u76D1\u542C\u4F4D\u7F6E\u53D8\u5316\r\n * dirtySystem.addListener({\r\n * flags: DirtyFlag.TRANSFORM_CHANGED,\r\n * callback: (data) => {\r\n * console.log('Entity position changed:', data.entity.name);\r\n * }\r\n * });\r\n * \r\n * // \u5904\u7406\u6240\u6709\u810F\u6807\u8BB0\r\n * dirtySystem.processDirtyEntities();\r\n * ```\r\n */\r\nexport class DirtyTrackingSystem {\r\n /** \u810F\u5B9E\u4F53\u6620\u5C04\u8868 */\r\n private _dirtyEntities = new Map<Entity, DirtyData>();\r\n \r\n /** \u810F\u6807\u8BB0\u76D1\u542C\u5668 */\r\n private _listeners: DirtyListener[] = [];\r\n \r\n /** \u6027\u80FD\u7EDF\u8BA1 */\r\n private _stats = {\r\n totalMarkings: 0,\r\n totalCleanups: 0,\r\n frameCount: 0,\r\n totalDirtyPerFrame: 0\r\n };\r\n \r\n /** \u5F53\u524D\u5E27\u7F16\u53F7 */\r\n private _currentFrame = 0;\r\n \r\n private _batchSize = 100;\r\n private _maxProcessingTime = 16;\r\n \r\n /** \u5EF6\u8FDF\u5904\u7406\u961F\u5217 */\r\n private _processingQueue: DirtyData[] = [];\r\n private _isProcessing = false;\r\n \r\n /**\r\n * \u6807\u8BB0\u5B9E\u4F53\u4E3A\u810F\u72B6\u6001\r\n * \r\n * @param entity \u8981\u6807\u8BB0\u7684\u5B9E\u4F53\r\n * @param flags \u810F\u6807\u8BB0\u4F4D\r\n * @param modifiedComponents \u4FEE\u6539\u7684\u7EC4\u4EF6\u7C7B\u578B\u5217\u8868\r\n */\r\n public markDirty(entity: Entity, flags: DirtyFlag, modifiedComponents: ComponentType[] = []): void {\r\n this._stats.totalMarkings++;\r\n \r\n let dirtyData = this._dirtyEntities.get(entity);\r\n if (!dirtyData) {\r\n dirtyData = {\r\n entity,\r\n flags: 0,\r\n modifiedComponents: new Set(),\r\n timestamp: performance.now(),\r\n frameNumber: this._currentFrame\r\n };\r\n this._dirtyEntities.set(entity, dirtyData);\r\n }\r\n \r\n dirtyData.flags |= flags;\r\n dirtyData.timestamp = performance.now();\r\n dirtyData.frameNumber = this._currentFrame;\r\n \r\n for (const componentType of modifiedComponents) {\r\n dirtyData.modifiedComponents.add(componentType);\r\n }\r\n \r\n this.notifyListeners(dirtyData, flags);\r\n }\r\n \r\n /**\r\n * \u68C0\u67E5\u5B9E\u4F53\u662F\u5426\u6709\u6307\u5B9A\u7684\u810F\u6807\u8BB0\r\n * \r\n * @param entity \u8981\u68C0\u67E5\u7684\u5B9E\u4F53\r\n * @param flags \u8981\u68C0\u67E5\u7684\u6807\u8BB0\u4F4D\r\n * @returns \u662F\u5426\u6709\u6307\u5B9A\u7684\u810F\u6807\u8BB0\r\n */\r\n public isDirty(entity: Entity, flags: DirtyFlag = DirtyFlag.ALL): boolean {\r\n const dirtyData = this._dirtyEntities.get(entity);\r\n return dirtyData ? (dirtyData.flags & flags) !== 0 : false;\r\n }\r\n \r\n /**\r\n * \u6E05\u9664\u5B9E\u4F53\u7684\u810F\u6807\u8BB0\r\n * \r\n * @param entity \u8981\u6E05\u9664\u7684\u5B9E\u4F53\r\n * @param flags \u8981\u6E05\u9664\u7684\u6807\u8BB0\u4F4D\uFF0C\u9ED8\u8BA4\u6E05\u9664\u6240\u6709\r\n */\r\n public clearDirty(entity: Entity, flags: DirtyFlag = DirtyFlag.ALL): void {\r\n const dirtyData = this._dirtyEntities.get(entity);\r\n if (!dirtyData) return;\r\n \r\n if (flags === DirtyFlag.ALL) {\r\n this._dirtyEntities.delete(entity);\r\n } else {\r\n dirtyData.flags &= ~flags;\r\n if (dirtyData.flags === 0) {\r\n this._dirtyEntities.delete(entity);\r\n }\r\n }\r\n \r\n this._stats.totalCleanups++;\r\n }\r\n \r\n /**\r\n * \u83B7\u53D6\u6240\u6709\u810F\u5B9E\u4F53\r\n * \r\n * @param flags \u8FC7\u6EE4\u6807\u8BB0\u4F4D\uFF0C\u53EA\u8FD4\u56DE\u5305\u542B\u6307\u5B9A\u6807\u8BB0\u7684\u5B9E\u4F53\r\n * @returns \u810F\u5B9E\u4F53\u6570\u636E\u6570\u7EC4\r\n */\r\n public getDirtyEntities(flags: DirtyFlag = DirtyFlag.ALL): DirtyData[] {\r\n const result: DirtyData[] = [];\r\n \r\n for (const dirtyData of this._dirtyEntities.values()) {\r\n if ((dirtyData.flags & flags) !== 0) {\r\n result.push(dirtyData);\r\n }\r\n }\r\n \r\n return result;\r\n }\r\n \r\n /**\r\n * \u6279\u91CF\u5904\u7406\u810F\u5B9E\u4F53\r\n * \r\n * \u4F7F\u7528\u65F6\u95F4\u5206\u7247\u7684\u65B9\u5F0F\u5904\u7406\u810F\u5B9E\u4F53\uFF0C\u907F\u514D\u5355\u5E27\u5361\u987F\r\n */\r\n public processDirtyEntities(): void {\r\n if (this._isProcessing) return;\r\n \r\n this._isProcessing = true;\r\n const startTime = performance.now();\r\n \r\n if (this._processingQueue.length === 0) {\r\n this._processingQueue.push(...this._dirtyEntities.values());\r\n }\r\n \r\n let processed = 0;\r\n while (this._processingQueue.length > 0 && processed < this._batchSize) {\r\n const elapsed = performance.now() - startTime;\r\n if (elapsed > this._maxProcessingTime) {\r\n break;\r\n }\r\n \r\n const dirtyData = this._processingQueue.shift()!;\r\n this.processEntity(dirtyData);\r\n processed++;\r\n }\r\n \r\n if (this._processingQueue.length === 0) {\r\n this._isProcessing = false;\r\n this.onFrameEnd();\r\n }\r\n }\r\n \r\n /**\r\n * \u6DFB\u52A0\u810F\u6807\u8BB0\u76D1\u542C\u5668\r\n * \r\n * @param listener \u76D1\u542C\u5668\u914D\u7F6E\r\n */\r\n public addListener(listener: DirtyListener): void {\r\n this._listeners.push(listener);\r\n \r\n this._listeners.sort((a, b) => (a.priority || 100) - (b.priority || 100));\r\n }\r\n \r\n /**\r\n * \u79FB\u9664\u810F\u6807\u8BB0\u76D1\u542C\u5668\r\n * \r\n * @param callback \u8981\u79FB\u9664\u7684\u56DE\u8C03\u51FD\u6570\r\n */\r\n public removeListener(callback: (dirtyData: DirtyData) => void): void {\r\n const index = this._listeners.findIndex(l => l.callback === callback);\r\n if (index !== -1) {\r\n this._listeners.splice(index, 1);\r\n }\r\n }\r\n \r\n /**\r\n * \u5F00\u59CB\u65B0\u7684\u5E27\r\n */\r\n public beginFrame(): void {\r\n this._currentFrame++;\r\n }\r\n \r\n /**\r\n * \u7ED3\u675F\u5F53\u524D\u5E27\r\n */\r\n public endFrame(): void {\r\n if (!this._isProcessing) {\r\n this.processDirtyEntities();\r\n }\r\n }\r\n \r\n /**\r\n * \u83B7\u53D6\u7EDF\u8BA1\u4FE1\u606F\r\n */\r\n public getStats(): DirtyStats {\r\n return {\r\n dirtyEntityCount: this._dirtyEntities.size,\r\n totalMarkings: this._stats.totalMarkings,\r\n totalCleanups: this._stats.totalCleanups,\r\n listenerCount: this._listeners.length,\r\n avgDirtyPerFrame: this._stats.frameCount > 0 ? \r\n this._stats.totalDirtyPerFrame / this._stats.frameCount : 0,\r\n estimatedMemoryUsage: this.estimateMemoryUsage()\r\n };\r\n }\r\n \r\n /**\r\n * \u6E05\u7A7A\u6240\u6709\u810F\u6807\u8BB0\u548C\u7EDF\u8BA1\u4FE1\u606F\r\n */\r\n public clear(): void {\r\n this._dirtyEntities.clear();\r\n this._processingQueue.length = 0;\r\n this._isProcessing = false;\r\n this._stats = {\r\n totalMarkings: 0,\r\n totalCleanups: 0,\r\n frameCount: 0,\r\n totalDirtyPerFrame: 0\r\n };\r\n }\r\n \r\n /**\r\n * \u914D\u7F6E\u6279\u91CF\u5904\u7406\u53C2\u6570\r\n * \r\n * @param batchSize \u6BCF\u6B21\u5904\u7406\u7684\u6700\u5927\u5B9E\u4F53\u6570\u91CF\r\n * @param maxProcessingTime \u6BCF\u5E27\u6700\u5927\u5904\u7406\u65F6\u95F4\uFF08\u6BEB\u79D2\uFF09\r\n */\r\n public configureBatchProcessing(batchSize: number, maxProcessingTime: number): void {\r\n this._batchSize = batchSize;\r\n this._maxProcessingTime = maxProcessingTime;\r\n }\r\n \r\n /**\r\n * \u5904\u7406\u5355\u4E2A\u810F\u5B9E\u4F53\r\n */\r\n private processEntity(dirtyData: DirtyData): void {\r\n for (const listener of this._listeners) {\r\n if ((dirtyData.flags & listener.flags) !== 0) {\r\n try {\r\n listener.callback(dirtyData);\r\n } catch (error) {\r\n console.error('Dirty listener error:', error);\r\n }\r\n }\r\n }\r\n \r\n this.clearDirty(dirtyData.entity);\r\n }\r\n \r\n /**\r\n * \u901A\u77E5\u76D1\u542C\u5668\r\n */\r\n private notifyListeners(dirtyData: DirtyData, newFlags: DirtyFlag): void {\r\n for (const listener of this._listeners) {\r\n if ((newFlags & listener.flags) !== 0) {\r\n try {\r\n listener.callback(dirtyData);\r\n } catch (error) {\r\n console.error('Dirty listener notification error:', error);\r\n }\r\n }\r\n }\r\n }\r\n \r\n /**\r\n * \u5E27\u7ED3\u675F\u65F6\u7684\u7EDF\u8BA1\u66F4\u65B0\r\n */\r\n private onFrameEnd(): void {\r\n this._stats.frameCount++;\r\n this._stats.totalDirtyPerFrame += this._dirtyEntities.size;\r\n }\r\n \r\n /**\r\n * \u4F30\u7B97\u5185\u5B58\u4F7F\u7528\u91CF\r\n */\r\n private estimateMemoryUsage(): number {\r\n let usage = 0;\r\n \r\n usage += this._dirtyEntities.size * 100;\r\n usage += this._listeners.length * 50;\r\n usage += this._processingQueue.length * 8;\r\n \r\n return usage;\r\n }\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\nimport { ComponentIndexManager, IndexType } from './ComponentIndex';\r\nimport { ArchetypeSystem, Archetype, ArchetypeQueryResult } from './ArchetypeSystem';\r\nimport { DirtyTrackingSystem, DirtyFlag } from './DirtyTrackingSystem';\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 // \u65B0\u589E\u6027\u80FD\u4F18\u5316\u7CFB\u7EDF\r\n private componentIndexManager: ComponentIndexManager;\r\n private archetypeSystem: ArchetypeSystem;\r\n private dirtyTrackingSystem: DirtyTrackingSystem;\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 archetypeHits: 0,\r\n dirtyChecks: 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 // \u521D\u59CB\u5316\u65B0\u7684\u6027\u80FD\u4F18\u5316\u7CFB\u7EDF\r\n this.componentIndexManager = new ComponentIndexManager(IndexType.HASH);\r\n this.archetypeSystem = new ArchetypeSystem();\r\n this.dirtyTrackingSystem = new DirtyTrackingSystem();\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 this.componentIndexManager.addEntity(entity);\r\n this.archetypeSystem.addEntity(entity);\r\n this.dirtyTrackingSystem.markDirty(entity, DirtyFlag.COMPONENT_ADDED);\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\r\n this.componentIndexManager.removeEntity(entity);\r\n this.archetypeSystem.removeEntity(entity);\r\n this.dirtyTrackingSystem.markDirty(entity, DirtyFlag.COMPONENT_REMOVED);\r\n\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 const archetypeResult = this.archetypeSystem.queryArchetypes(componentTypes, 'AND');\r\n if (archetypeResult.archetypes.length > 0) {\r\n this.queryStats.archetypeHits++;\r\n entities = [];\r\n for (const archetype of archetypeResult.archetypes) {\r\n entities.push(...archetype.entities);\r\n }\r\n } else if (componentTypes.length === 1) {\r\n this.queryStats.indexHits++;\r\n const indexResult = this.componentIndexManager.query(componentTypes[0]);\r\n entities = Array.from(indexResult);\r\n } else {\r\n const indexResult = this.componentIndexManager.queryMultiple(componentTypes, 'AND');\r\n entities = Array.from(indexResult);\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 const archetypeResult = this.archetypeSystem.queryArchetypes(componentTypes, 'OR');\r\n let entities: Entity[];\r\n\r\n if (archetypeResult.archetypes.length > 0) {\r\n this.queryStats.archetypeHits++;\r\n entities = [];\r\n for (const archetype of archetypeResult.archetypes) {\r\n entities.push(...archetype.entities);\r\n }\r\n } else {\r\n const indexResult = this.componentIndexManager.queryMultiple(componentTypes, 'OR');\r\n entities = Array.from(indexResult);\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 * \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 archetypeHits: number;\r\n dirtyChecks: number;\r\n cacheHitRate: string;\r\n };\r\n optimizationStats: {\r\n componentIndex: any;\r\n archetypeSystem: any;\r\n dirtyTracking: any;\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 optimizationStats: {\r\n componentIndex: this.componentIndexManager.getStats(),\r\n archetypeSystem: this.archetypeSystem.getAllArchetypes().map(a => ({\r\n id: a.id,\r\n componentTypes: a.componentTypes.map(t => t.name),\r\n entityCount: a.entities.length\r\n })),\r\n dirtyTracking: this.dirtyTrackingSystem.getStats()\r\n }\r\n };\r\n }\r\n\r\n /**\r\n * \u5207\u6362\u7EC4\u4EF6\u7D22\u5F15\u7C7B\u578B\r\n * \r\n * @param indexType \u65B0\u7684\u7D22\u5F15\u7C7B\u578B\r\n */\r\n public switchComponentIndexType(indexType: IndexType): void {\r\n this.componentIndexManager.switchIndexType(indexType);\r\n }\r\n\r\n /**\r\n * \u914D\u7F6E\u810F\u6807\u8BB0\u7CFB\u7EDF\r\n * \r\n * @param batchSize \u6279\u5904\u7406\u5927\u5C0F\r\n * @param maxProcessingTime \u6700\u5927\u5904\u7406\u65F6\u95F4\r\n */\r\n public configureDirtyTracking(batchSize: number, maxProcessingTime: number): void {\r\n this.dirtyTrackingSystem.configureBatchProcessing(batchSize, maxProcessingTime);\r\n }\r\n\r\n /**\r\n * \u624B\u52A8\u89E6\u53D1\u6027\u80FD\u4F18\u5316\r\n */\r\n public optimizePerformance(): void {\r\n this.dirtyTrackingSystem.processDirtyEntities();\r\n this.cleanupCache();\r\n\r\n const stats = this.componentIndexManager.getStats();\r\n if (stats.avgQueryTime > 2.0 && stats.type !== IndexType.HASH) {\r\n this.switchComponentIndexType(IndexType.HASH);\r\n } else if (stats.memoryUsage > 50 * 1024 * 1024 && stats.type !== IndexType.BITMAP) {\r\n this.switchComponentIndexType(IndexType.BITMAP);\r\n }\r\n }\r\n\r\n /**\r\n * \u5F00\u59CB\u65B0\u7684\u5E27\r\n */\r\n public beginFrame(): void {\r\n this.dirtyTrackingSystem.beginFrame();\r\n }\r\n\r\n /**\r\n * \u7ED3\u675F\u5F53\u524D\u5E27\r\n */\r\n public endFrame(): void {\r\n this.dirtyTrackingSystem.endFrame();\r\n }\r\n\r\n /**\r\n * \u6807\u8BB0\u5B9E\u4F53\u7EC4\u4EF6\u5DF2\u4FEE\u6539\uFF08\u7528\u4E8E\u810F\u6807\u8BB0\u8FFD\u8E2A\uFF09\r\n * \r\n * @param entity \u4FEE\u6539\u7684\u5B9E\u4F53\r\n * @param componentTypes \u4FEE\u6539\u7684\u7EC4\u4EF6\u7C7B\u578B\r\n */\r\n public markEntityDirty(entity: Entity, componentTypes: ComponentType[]): void {\r\n this.queryStats.dirtyChecks++;\r\n this.dirtyTrackingSystem.markDirty(entity, DirtyFlag.COMPONENT_MODIFIED, componentTypes);\r\n this.clearQueryCache();\r\n }\r\n\r\n /**\r\n * \u83B7\u53D6\u5B9E\u4F53\u6240\u5C5E\u7684\u539F\u578B\u4FE1\u606F\r\n * \r\n * @param entity \u8981\u67E5\u8BE2\u7684\u5B9E\u4F53\r\n */\r\n public getEntityArchetype(entity: Entity): Archetype | undefined {\r\n return this.archetypeSystem.getEntityArchetype(entity);\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\nimport type { IScene } from '../Types';\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", "import type { IComponent } from '../Types';\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 implements IComponent {\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\nimport type { ISystemBase } from '../../Types';\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 implements ISystemBase {\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} ", "import { \r\n IEventBus, \r\n IEventListenerConfig, \r\n IEventStats,\r\n IEventData,\r\n IEntityEventData,\r\n IComponentEventData,\r\n ISystemEventData,\r\n ISceneEventData,\r\n IPerformanceEventData\r\n} from '../../Types';\r\nimport { \r\n TypeSafeEventSystem, \r\n EventListenerConfig, \r\n EventStats \r\n} from './EventSystem';\r\nimport { \r\n ECSEventType, \r\n EventPriority, \r\n EVENT_TYPES,\r\n EventTypeValidator \r\n} from '../CoreEvents';\r\n\r\n/**\r\n * \u589E\u5F3A\u7684\u4E8B\u4EF6\u603B\u7EBF\u5B9E\u73B0\r\n * \u57FA\u4E8ETypeSafeEventSystem\uFF0C\u63D0\u4F9B\u7C7B\u578B\u5B89\u5168\u7684\u4E8B\u4EF6\u53D1\u5E03\u8BA2\u9605\u673A\u5236\r\n */\r\nexport class EventBus implements IEventBus {\r\n private eventSystem: TypeSafeEventSystem;\r\n private eventIdCounter = 0;\r\n private isDebugMode = false;\r\n \r\n constructor(debugMode: boolean = false) {\r\n this.eventSystem = new TypeSafeEventSystem();\r\n this.isDebugMode = debugMode;\r\n }\r\n \r\n /**\r\n * \u53D1\u5C04\u4E8B\u4EF6\r\n * @param eventType \u4E8B\u4EF6\u7C7B\u578B\r\n * @param data \u4E8B\u4EF6\u6570\u636E\r\n */\r\n public emit<T>(eventType: string, data: T): void {\r\n this.validateEventType(eventType);\r\n \r\n // \u589E\u5F3A\u4E8B\u4EF6\u6570\u636E\r\n const enhancedData = this.enhanceEventData(eventType, data);\r\n \r\n if (this.isDebugMode) {\r\n console.log(`[EventBus] Emitting event: ${eventType}`, enhancedData);\r\n }\r\n \r\n this.eventSystem.emitSync(eventType, enhancedData);\r\n }\r\n \r\n /**\r\n * \u5F02\u6B65\u53D1\u5C04\u4E8B\u4EF6\r\n * @param eventType \u4E8B\u4EF6\u7C7B\u578B\r\n * @param data \u4E8B\u4EF6\u6570\u636E\r\n */\r\n public async emitAsync<T>(eventType: string, data: T): Promise<void> {\r\n this.validateEventType(eventType);\r\n \r\n // \u589E\u5F3A\u4E8B\u4EF6\u6570\u636E\r\n const enhancedData = this.enhanceEventData(eventType, data);\r\n \r\n if (this.isDebugMode) {\r\n console.log(`[EventBus] Emitting async event: ${eventType}`, enhancedData);\r\n }\r\n \r\n await this.eventSystem.emit(eventType, enhancedData);\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 * @param config \u76D1\u542C\u5668\u914D\u7F6E\r\n * @returns \u76D1\u542C\u5668ID\r\n */\r\n public on<T>(\r\n eventType: string, \r\n handler: (data: T) => void, \r\n config: IEventListenerConfig = {}\r\n ): string {\r\n this.validateEventType(eventType);\r\n \r\n const eventConfig: EventListenerConfig = {\r\n once: config.once || false,\r\n priority: config.priority || EventPriority.NORMAL,\r\n async: config.async || false,\r\n context: config.context\r\n };\r\n \r\n if (this.isDebugMode) {\r\n console.log(`[EventBus] Adding listener for: ${eventType}`, eventConfig);\r\n }\r\n \r\n return this.eventSystem.on(eventType, handler, eventConfig);\r\n }\r\n \r\n /**\r\n * \u76D1\u542C\u4E8B\u4EF6\uFF08\u4E00\u6B21\u6027\uFF09\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: (data: T) => void, \r\n config: IEventListenerConfig = {}\r\n ): string {\r\n return this.on(eventType, handler, { ...config, once: true });\r\n }\r\n \r\n /**\r\n * \u5F02\u6B65\u76D1\u542C\u4E8B\u4EF6\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: (data: T) => Promise<void>, \r\n config: IEventListenerConfig = {}\r\n ): string {\r\n return this.on(eventType, handler as any, { ...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 */\r\n public off(eventType: string, listenerId: string): boolean {\r\n if (this.isDebugMode) {\r\n console.log(`[EventBus] Removing listener: ${listenerId} for event: ${eventType}`);\r\n }\r\n \r\n return this.eventSystem.off(eventType, listenerId);\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 if (this.isDebugMode) {\r\n console.log(`[EventBus] Removing all listeners for event: ${eventType}`);\r\n }\r\n \r\n this.eventSystem.offAll(eventType);\r\n }\r\n \r\n /**\r\n * \u68C0\u67E5\u662F\u5426\u6709\u6307\u5B9A\u4E8B\u4EF6\u7684\u76D1\u542C\u5668\r\n * @param eventType \u4E8B\u4EF6\u7C7B\u578B\r\n */\r\n public hasListeners(eventType: string): boolean {\r\n return this.eventSystem.hasListeners(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 */\r\n public getStats(eventType?: string): IEventStats | Map<string, IEventStats> {\r\n const stats = this.eventSystem.getStats(eventType);\r\n \r\n if (stats instanceof Map) {\r\n // \u8F6C\u6362Map\u4E2D\u7684\u6BCF\u4E2AEventStats\u4E3AIEventStats\r\n const result = new Map<string, IEventStats>();\r\n stats.forEach((stat, key) => {\r\n result.set(key, this.convertEventStats(stat));\r\n });\r\n return result;\r\n } else {\r\n return this.convertEventStats(stats);\r\n }\r\n }\r\n \r\n /**\r\n * \u6E05\u7A7A\u6240\u6709\u76D1\u542C\u5668\r\n */\r\n public clear(): void {\r\n if (this.isDebugMode) {\r\n console.log('[EventBus] Clearing all listeners');\r\n }\r\n \r\n this.eventSystem.clear();\r\n }\r\n \r\n /**\r\n * \u542F\u7528\u6216\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.eventSystem.setEnabled(enabled);\r\n }\r\n \r\n /**\r\n * \u8BBE\u7F6E\u8C03\u8BD5\u6A21\u5F0F\r\n * @param debug \u662F\u5426\u542F\u7528\u8C03\u8BD5\r\n */\r\n public setDebugMode(debug: boolean): void {\r\n this.isDebugMode = debug;\r\n }\r\n \r\n /**\r\n * \u8BBE\u7F6E\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.eventSystem.setMaxListeners(max);\r\n }\r\n \r\n /**\r\n * \u83B7\u53D6\u76D1\u542C\u5668\u6570\u91CF\r\n * @param eventType \u4E8B\u4EF6\u7C7B\u578B\r\n */\r\n public getListenerCount(eventType: string): number {\r\n return this.eventSystem.getListenerCount(eventType);\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 batchSize \u6279\u5904\u7406\u5927\u5C0F\r\n * @param delay \u5EF6\u8FDF\u65F6\u95F4\uFF08\u6BEB\u79D2\uFF09\r\n */\r\n public setBatchConfig(eventType: string, batchSize: number, delay: number): void {\r\n this.eventSystem.setBatchConfig(eventType, {\r\n batchSize,\r\n delay,\r\n enabled: true\r\n });\r\n }\r\n \r\n /**\r\n * \u5237\u65B0\u6307\u5B9A\u4E8B\u4EF6\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 this.eventSystem.flushBatch(eventType);\r\n }\r\n \r\n /**\r\n * \u91CD\u7F6E\u4E8B\u4EF6\u7EDF\u8BA1\r\n * @param eventType \u4E8B\u4EF6\u7C7B\u578B\uFF08\u53EF\u9009\uFF09\r\n */\r\n public resetStats(eventType?: string): void {\r\n this.eventSystem.resetStats(eventType);\r\n }\r\n \r\n // \u4FBF\u6377\u65B9\u6CD5\uFF1A\u53D1\u5C04\u9884\u5B9A\u4E49\u7684ECS\u4E8B\u4EF6\r\n \r\n /**\r\n * \u53D1\u5C04\u5B9E\u4F53\u521B\u5EFA\u4E8B\u4EF6\r\n * @param entityData \u5B9E\u4F53\u4E8B\u4EF6\u6570\u636E\r\n */\r\n public emitEntityCreated(entityData: IEntityEventData): void {\r\n this.emit(ECSEventType.ENTITY_CREATED, entityData);\r\n }\r\n \r\n /**\r\n * \u53D1\u5C04\u5B9E\u4F53\u9500\u6BC1\u4E8B\u4EF6\r\n * @param entityData \u5B9E\u4F53\u4E8B\u4EF6\u6570\u636E\r\n */\r\n public emitEntityDestroyed(entityData: IEntityEventData): void {\r\n this.emit(ECSEventType.ENTITY_DESTROYED, entityData);\r\n }\r\n \r\n /**\r\n * \u53D1\u5C04\u7EC4\u4EF6\u6DFB\u52A0\u4E8B\u4EF6\r\n * @param componentData \u7EC4\u4EF6\u4E8B\u4EF6\u6570\u636E\r\n */\r\n public emitComponentAdded(componentData: IComponentEventData): void {\r\n this.emit(ECSEventType.COMPONENT_ADDED, componentData);\r\n }\r\n \r\n /**\r\n * \u53D1\u5C04\u7EC4\u4EF6\u79FB\u9664\u4E8B\u4EF6\r\n * @param componentData \u7EC4\u4EF6\u4E8B\u4EF6\u6570\u636E\r\n */\r\n public emitComponentRemoved(componentData: IComponentEventData): void {\r\n this.emit(ECSEventType.COMPONENT_REMOVED, componentData);\r\n }\r\n \r\n /**\r\n * \u53D1\u5C04\u7CFB\u7EDF\u6DFB\u52A0\u4E8B\u4EF6\r\n * @param systemData \u7CFB\u7EDF\u4E8B\u4EF6\u6570\u636E\r\n */\r\n public emitSystemAdded(systemData: ISystemEventData): void {\r\n this.emit(ECSEventType.SYSTEM_ADDED, systemData);\r\n }\r\n \r\n /**\r\n * \u53D1\u5C04\u7CFB\u7EDF\u79FB\u9664\u4E8B\u4EF6\r\n * @param systemData \u7CFB\u7EDF\u4E8B\u4EF6\u6570\u636E\r\n */\r\n public emitSystemRemoved(systemData: ISystemEventData): void {\r\n this.emit(ECSEventType.SYSTEM_REMOVED, systemData);\r\n }\r\n \r\n /**\r\n * \u53D1\u5C04\u573A\u666F\u53D8\u5316\u4E8B\u4EF6\r\n * @param sceneData \u573A\u666F\u4E8B\u4EF6\u6570\u636E\r\n */\r\n public emitSceneChanged(sceneData: ISceneEventData): void {\r\n this.emit(EVENT_TYPES.CORE.SCENE_CHANGED, sceneData);\r\n }\r\n \r\n /**\r\n * \u53D1\u5C04\u6027\u80FD\u8B66\u544A\u4E8B\u4EF6\r\n * @param performanceData \u6027\u80FD\u4E8B\u4EF6\u6570\u636E\r\n */\r\n public emitPerformanceWarning(performanceData: IPerformanceEventData): void {\r\n this.emit(ECSEventType.PERFORMANCE_WARNING, performanceData);\r\n }\r\n \r\n // \u4FBF\u6377\u65B9\u6CD5\uFF1A\u76D1\u542C\u9884\u5B9A\u4E49\u7684ECS\u4E8B\u4EF6\r\n \r\n /**\r\n * \u76D1\u542C\u5B9E\u4F53\u521B\u5EFA\u4E8B\u4EF6\r\n * @param handler \u4E8B\u4EF6\u5904\u7406\u5668\r\n * @param config \u76D1\u542C\u5668\u914D\u7F6E\r\n */\r\n public onEntityCreated(\r\n handler: (data: IEntityEventData) => void, \r\n config?: IEventListenerConfig\r\n ): string {\r\n return this.on(ECSEventType.ENTITY_CREATED, handler, config);\r\n }\r\n \r\n /**\r\n * \u76D1\u542C\u7EC4\u4EF6\u6DFB\u52A0\u4E8B\u4EF6\r\n * @param handler \u4E8B\u4EF6\u5904\u7406\u5668\r\n * @param config \u76D1\u542C\u5668\u914D\u7F6E\r\n */\r\n public onComponentAdded(\r\n handler: (data: IComponentEventData) => void, \r\n config?: IEventListenerConfig\r\n ): string {\r\n return this.on(ECSEventType.COMPONENT_ADDED, handler, config);\r\n }\r\n \r\n /**\r\n * \u76D1\u542C\u7CFB\u7EDF\u9519\u8BEF\u4E8B\u4EF6\r\n * @param handler \u4E8B\u4EF6\u5904\u7406\u5668\r\n * @param config \u76D1\u542C\u5668\u914D\u7F6E\r\n */\r\n public onSystemError(\r\n handler: (data: ISystemEventData) => void, \r\n config?: IEventListenerConfig\r\n ): string {\r\n return this.on(ECSEventType.SYSTEM_ERROR, handler, config);\r\n }\r\n \r\n /**\r\n * \u76D1\u542C\u6027\u80FD\u8B66\u544A\u4E8B\u4EF6\r\n * @param handler \u4E8B\u4EF6\u5904\u7406\u5668\r\n * @param config \u76D1\u542C\u5668\u914D\u7F6E\r\n */\r\n public onPerformanceWarning(\r\n handler: (data: IPerformanceEventData) => void, \r\n config?: IEventListenerConfig\r\n ): string {\r\n return this.on(ECSEventType.PERFORMANCE_WARNING, handler, config);\r\n }\r\n \r\n // \u79C1\u6709\u65B9\u6CD5\r\n \r\n /**\r\n * \u9A8C\u8BC1\u4E8B\u4EF6\u7C7B\u578B\r\n * @param eventType \u4E8B\u4EF6\u7C7B\u578B\r\n */\r\n private validateEventType(eventType: string): void {\r\n if (!EventTypeValidator.isValid(eventType)) {\r\n if (this.isDebugMode) {\r\n console.warn(`[EventBus] Unknown event type: ${eventType}`);\r\n }\r\n // \u5728\u8C03\u8BD5\u6A21\u5F0F\u4E0B\u6DFB\u52A0\u81EA\u5B9A\u4E49\u4E8B\u4EF6\u7C7B\u578B\r\n if (this.isDebugMode) {\r\n EventTypeValidator.addCustomType(eventType);\r\n }\r\n }\r\n }\r\n \r\n /**\r\n * \u589E\u5F3A\u4E8B\u4EF6\u6570\u636E\r\n * @param eventType \u4E8B\u4EF6\u7C7B\u578B\r\n * @param data \u539F\u59CB\u6570\u636E\r\n */\r\n private enhanceEventData<T>(eventType: string, data: T): T & IEventData {\r\n const enhanced = data as T & IEventData;\r\n \r\n // \u5982\u679C\u6570\u636E\u8FD8\u6CA1\u6709\u57FA\u7840\u4E8B\u4EF6\u5C5E\u6027\uFF0C\u6DFB\u52A0\u5B83\u4EEC\r\n if (!enhanced.timestamp) {\r\n enhanced.timestamp = Date.now();\r\n }\r\n if (!enhanced.eventId) {\r\n enhanced.eventId = `${eventType}_${++this.eventIdCounter}`;\r\n }\r\n if (!enhanced.source) {\r\n enhanced.source = 'EventBus';\r\n }\r\n \r\n return enhanced;\r\n }\r\n \r\n /**\r\n * \u8F6C\u6362EventStats\u4E3AIEventStats\r\n * @param stats EventStats\u5B9E\u4F8B\r\n */\r\n private convertEventStats(stats: EventStats): IEventStats {\r\n return {\r\n eventType: stats.eventType,\r\n listenerCount: stats.listenerCount,\r\n triggerCount: stats.triggerCount,\r\n totalExecutionTime: stats.totalExecutionTime,\r\n averageExecutionTime: stats.averageExecutionTime,\r\n lastTriggerTime: stats.lastTriggerTime\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * \u5168\u5C40\u4E8B\u4EF6\u603B\u7EBF\u5B9E\u4F8B\r\n * \u63D0\u4F9B\u5168\u5C40\u8BBF\u95EE\u7684\u4E8B\u4EF6\u603B\u7EBF\r\n */\r\nexport class GlobalEventBus {\r\n private static instance: EventBus;\r\n \r\n /**\r\n * \u83B7\u53D6\u5168\u5C40\u4E8B\u4EF6\u603B\u7EBF\u5B9E\u4F8B\r\n * @param debugMode \u662F\u5426\u542F\u7528\u8C03\u8BD5\u6A21\u5F0F\r\n */\r\n public static getInstance(debugMode: boolean = false): EventBus {\r\n if (!this.instance) {\r\n this.instance = new EventBus(debugMode);\r\n }\r\n return this.instance;\r\n }\r\n \r\n /**\r\n * \u91CD\u7F6E\u5168\u5C40\u4E8B\u4EF6\u603B\u7EBF\u5B9E\u4F8B\r\n * @param debugMode \u662F\u5426\u542F\u7528\u8C03\u8BD5\u6A21\u5F0F\r\n */\r\n public static reset(debugMode: boolean = false): EventBus {\r\n if (this.instance) {\r\n this.instance.clear();\r\n }\r\n this.instance = new EventBus(debugMode);\r\n return this.instance;\r\n }\r\n}\r\n\r\n/**\r\n * \u4E8B\u4EF6\u88C5\u9970\u5668\u5DE5\u5382\r\n * \u7528\u4E8E\u81EA\u52A8\u6CE8\u518C\u4E8B\u4EF6\u76D1\u542C\u5668\r\n */\r\nexport function EventHandler(eventType: string, config: IEventListenerConfig = {}) {\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 const eventBus = GlobalEventBus.getInstance();\r\n eventBus.on(eventType, originalMethod.bind(this), config);\r\n };\r\n \r\n return descriptor;\r\n };\r\n}\r\n\r\n/**\r\n * \u5F02\u6B65\u4E8B\u4EF6\u88C5\u9970\u5668\u5DE5\u5382\r\n * \u7528\u4E8E\u81EA\u52A8\u6CE8\u518C\u5F02\u6B65\u4E8B\u4EF6\u76D1\u542C\u5668\r\n */\r\nexport function AsyncEventHandler(eventType: string, config: IEventListenerConfig = {}) {\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 const eventBus = GlobalEventBus.getInstance();\r\n eventBus.onAsync(eventType, originalMethod.bind(this), config);\r\n };\r\n \r\n return descriptor;\r\n };\r\n} ", "import { Entity } from '../Entity';\r\nimport { Component } from '../Component';\r\nimport { ComponentType } from './ComponentStorage';\r\nimport { IdentifierPool } from '../Utils/IdentifierPool';\r\nimport { ComponentIndexManager, IndexType } from './ComponentIndex';\r\nimport { ArchetypeSystem } from './ArchetypeSystem';\r\nimport { DirtyTrackingSystem, DirtyFlag } from './DirtyTrackingSystem';\r\nimport { EventBus } from './EventBus';\r\nimport { ECSEventType } from '../CoreEvents';\r\nimport { IEntityEventData, IComponentEventData } from '../../Types';\r\n\r\n/**\r\n * \u5B9E\u4F53\u67E5\u8BE2\u6784\u5EFA\u5668\r\n * \r\n * \u63D0\u4F9B\u6D41\u5F0FAPI\u6765\u6784\u5EFA\u590D\u6742\u7684\u5B9E\u4F53\u67E5\u8BE2\u6761\u4EF6\u3002\u652F\u6301\u7EC4\u4EF6\u8FC7\u6EE4\u3001\u6807\u7B7E\u8FC7\u6EE4\u3001\u72B6\u6001\u8FC7\u6EE4\u548C\u81EA\u5B9A\u4E49\u6761\u4EF6\u3002\r\n * \r\n * @example\r\n * ```typescript\r\n * const results = entityManager.query()\r\n * .withAll(PositionComponent, HealthComponent)\r\n * .without(VelocityComponent)\r\n * .withTag(1)\r\n * .active()\r\n * .where(entity => entity.name.startsWith(\"Player\"))\r\n * .execute();\r\n * ```\r\n */\r\nexport class EntityQueryBuilder {\r\n /** \u5FC5\u987B\u5305\u542B\u7684\u7EC4\u4EF6\u7C7B\u578B */\r\n private _allComponents: ComponentType[] = [];\r\n /** \u81F3\u5C11\u5305\u542B\u4E00\u4E2A\u7684\u7EC4\u4EF6\u7C7B\u578B */\r\n private _anyComponents: ComponentType[] = [];\r\n /** \u4E0D\u80FD\u5305\u542B\u7684\u7EC4\u4EF6\u7C7B\u578B */\r\n private _withoutComponents: ComponentType[] = [];\r\n /** \u5FC5\u987B\u5305\u542B\u7684\u6807\u7B7E */\r\n private _withTags: number[] = [];\r\n /** \u4E0D\u80FD\u5305\u542B\u7684\u6807\u7B7E */\r\n private _withoutTags: number[] = [];\r\n /** \u662F\u5426\u53EA\u67E5\u8BE2\u6FC0\u6D3B\u72B6\u6001\u7684\u5B9E\u4F53 */\r\n private _activeOnly: boolean = false;\r\n /** \u662F\u5426\u53EA\u67E5\u8BE2\u542F\u7528\u72B6\u6001\u7684\u5B9E\u4F53 */\r\n private _enabledOnly: boolean = false;\r\n /** \u81EA\u5B9A\u4E49\u8FC7\u6EE4\u6761\u4EF6 */\r\n private _customPredicates: Array<(entity: Entity) => boolean> = [];\r\n \r\n /**\r\n * \u521B\u5EFA\u67E5\u8BE2\u6784\u5EFA\u5668\u5B9E\u4F8B\r\n * @param entityManager \u5B9E\u4F53\u7BA1\u7406\u5668\u5B9E\u4F8B\r\n */\r\n constructor(private entityManager: EntityManager) {}\r\n \r\n /**\r\n * \u6DFB\u52A0\u5FC5\u987B\u5305\u542B\u7684\u7EC4\u4EF6\u6761\u4EF6\r\n * \r\n * \u8FD4\u56DE\u7684\u5B9E\u4F53\u5FC5\u987B\u5305\u542B\u6240\u6709\u6307\u5B9A\u7684\u7EC4\u4EF6\u7C7B\u578B\u3002\r\n * \r\n * @param componentTypes \u7EC4\u4EF6\u7C7B\u578B\u5217\u8868\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[]): EntityQueryBuilder {\r\n this._allComponents.push(...componentTypes);\r\n return this;\r\n }\r\n \r\n /**\r\n * \u6DFB\u52A0\u81F3\u5C11\u5305\u542B\u4E00\u4E2A\u7684\u7EC4\u4EF6\u6761\u4EF6\r\n * \r\n * \u8FD4\u56DE\u7684\u5B9E\u4F53\u5FC5\u987B\u81F3\u5C11\u5305\u542B\u5176\u4E2D\u4E00\u4E2A\u6307\u5B9A\u7684\u7EC4\u4EF6\u7C7B\u578B\u3002\r\n * \r\n * @param componentTypes \u7EC4\u4EF6\u7C7B\u578B\u5217\u8868\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[]): EntityQueryBuilder {\r\n this._anyComponents.push(...componentTypes);\r\n return this;\r\n }\r\n \r\n /**\r\n * \u6DFB\u52A0\u4E0D\u80FD\u5305\u542B\u7684\u7EC4\u4EF6\u6761\u4EF6\r\n * \r\n * \u8FD4\u56DE\u7684\u5B9E\u4F53\u4E0D\u80FD\u5305\u542B\u4EFB\u4F55\u6307\u5B9A\u7684\u7EC4\u4EF6\u7C7B\u578B\u3002\r\n * \r\n * @param componentTypes \u7EC4\u4EF6\u7C7B\u578B\u5217\u8868\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[]): EntityQueryBuilder {\r\n this._withoutComponents.push(...componentTypes);\r\n return this;\r\n }\r\n \r\n /**\r\n * \u6DFB\u52A0\u5FC5\u987B\u5305\u542B\u7684\u6807\u7B7E\u6761\u4EF6\r\n * \r\n * \u8FD4\u56DE\u7684\u5B9E\u4F53\u5FC5\u987B\u5177\u6709\u6307\u5B9A\u7684\u6807\u7B7E\u3002\r\n * \r\n * @param tag \u6807\u7B7E\u503C\r\n * @returns \u67E5\u8BE2\u6784\u5EFA\u5668\u5B9E\u4F8B\uFF0C\u652F\u6301\u94FE\u5F0F\u8C03\u7528\r\n */\r\n public withTag(tag: number): EntityQueryBuilder {\r\n this._withTags.push(tag);\r\n return this;\r\n }\r\n \r\n /**\r\n * \u6DFB\u52A0\u4E0D\u80FD\u5305\u542B\u7684\u6807\u7B7E\u6761\u4EF6\r\n * \r\n * \u8FD4\u56DE\u7684\u5B9E\u4F53\u4E0D\u80FD\u5177\u6709\u6307\u5B9A\u7684\u6807\u7B7E\u3002\r\n * \r\n * @param tag \u6807\u7B7E\u503C\r\n * @returns \u67E5\u8BE2\u6784\u5EFA\u5668\u5B9E\u4F8B\uFF0C\u652F\u6301\u94FE\u5F0F\u8C03\u7528\r\n */\r\n public withoutTag(tag: number): EntityQueryBuilder {\r\n this._withoutTags.push(tag);\r\n return this;\r\n }\r\n \r\n /**\r\n * \u6DFB\u52A0\u6FC0\u6D3B\u72B6\u6001\u8FC7\u6EE4\u6761\u4EF6\r\n * \r\n * \u8FD4\u56DE\u7684\u5B9E\u4F53\u5FC5\u987B\u5904\u4E8E\u6FC0\u6D3B\u72B6\u6001\uFF08active = true\uFF09\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 active(): EntityQueryBuilder {\r\n this._activeOnly = true;\r\n return this;\r\n }\r\n \r\n /**\r\n * \u6DFB\u52A0\u542F\u7528\u72B6\u6001\u8FC7\u6EE4\u6761\u4EF6\r\n * \r\n * \u8FD4\u56DE\u7684\u5B9E\u4F53\u5FC5\u987B\u5904\u4E8E\u542F\u7528\u72B6\u6001\uFF08enabled = true\uFF09\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 enabled(): EntityQueryBuilder {\r\n this._enabledOnly = true;\r\n return this;\r\n }\r\n \r\n /**\r\n * \u6DFB\u52A0\u81EA\u5B9A\u4E49\u8FC7\u6EE4\u6761\u4EF6\r\n * \r\n * \u5141\u8BB8\u7528\u6237\u5B9A\u4E49\u590D\u6742\u7684\u8FC7\u6EE4\u903B\u8F91\u3002\r\n * \r\n * @param predicate \u81EA\u5B9A\u4E49\u8FC7\u6EE4\u51FD\u6570\uFF0C\u63A5\u6536\u5B9E\u4F53\u4F5C\u4E3A\u53C2\u6570\uFF0C\u8FD4\u56DE\u5E03\u5C14\u503C\r\n * @returns \u67E5\u8BE2\u6784\u5EFA\u5668\u5B9E\u4F8B\uFF0C\u652F\u6301\u94FE\u5F0F\u8C03\u7528\r\n * \r\n * @example\r\n * ```typescript\r\n * .where(entity => entity.name.startsWith(\"Player\"))\r\n * .where(entity => entity.components.length > 5)\r\n * ```\r\n */\r\n public where(predicate: (entity: Entity) => boolean): EntityQueryBuilder {\r\n this._customPredicates.push(predicate);\r\n return this;\r\n }\r\n \r\n /**\r\n * \u6267\u884C\u67E5\u8BE2\u5E76\u8FD4\u56DE\u6240\u6709\u5339\u914D\u7684\u5B9E\u4F53\r\n * \r\n * @returns \u7B26\u5408\u6240\u6709\u67E5\u8BE2\u6761\u4EF6\u7684\u5B9E\u4F53\u6570\u7EC4\r\n */\r\n public execute(): Entity[] {\r\n let candidates: Entity[] = [];\r\n \r\n if (this._allComponents.length > 0) {\r\n const indexResult = this.entityManager.queryWithComponentIndex(this._allComponents, 'AND');\r\n candidates = Array.from(indexResult);\r\n } else if (this._anyComponents.length > 0) {\r\n const indexResult = this.entityManager.queryWithComponentIndex(this._anyComponents, 'OR');\r\n candidates = Array.from(indexResult);\r\n } else {\r\n candidates = this.entityManager.getAllEntities();\r\n }\r\n \r\n return candidates.filter(entity => this.matchesEntity(entity));\r\n }\r\n \r\n /**\r\n * \u6267\u884C\u67E5\u8BE2\u5E76\u8FD4\u56DE\u7B2C\u4E00\u4E2A\u5339\u914D\u7684\u5B9E\u4F53\r\n * \r\n * @returns \u7B2C\u4E00\u4E2A\u7B26\u5408\u67E5\u8BE2\u6761\u4EF6\u7684\u5B9E\u4F53\uFF0C\u5982\u679C\u6CA1\u6709\u627E\u5230\u5219\u8FD4\u56DEnull\r\n */\r\n public first(): Entity | null {\r\n const entities = this.entityManager.getAllEntities();\r\n return entities.find(entity => this.matchesEntity(entity)) || null;\r\n }\r\n \r\n /**\r\n * \u6267\u884C\u67E5\u8BE2\u5E76\u8FD4\u56DE\u5339\u914D\u5B9E\u4F53\u7684\u6570\u91CF\r\n * \r\n * @returns \u7B26\u5408\u67E5\u8BE2\u6761\u4EF6\u7684\u5B9E\u4F53\u6570\u91CF\r\n */\r\n public count(): number {\r\n const entities = this.entityManager.getAllEntities();\r\n return entities.filter(entity => this.matchesEntity(entity)).length;\r\n }\r\n \r\n /**\r\n * \u5BF9\u6240\u6709\u5339\u914D\u7684\u5B9E\u4F53\u6267\u884C\u6307\u5B9A\u64CD\u4F5C\r\n * \r\n * @param action \u8981\u6267\u884C\u7684\u64CD\u4F5C\u51FD\u6570\uFF0C\u63A5\u6536\u5339\u914D\u7684\u5B9E\u4F53\u4F5C\u4E3A\u53C2\u6570\r\n */\r\n public forEach(action: (entity: Entity) => void): void {\r\n const entities = this.entityManager.getAllEntities();\r\n entities.forEach(entity => {\r\n if (this.matchesEntity(entity)) {\r\n action(entity);\r\n }\r\n });\r\n }\r\n \r\n /**\r\n * \u68C0\u67E5\u5B9E\u4F53\u662F\u5426\u5339\u914D\u6240\u6709\u67E5\u8BE2\u6761\u4EF6\r\n * \r\n * \u6309\u4F18\u5148\u7EA7\u987A\u5E8F\u68C0\u67E5\u5404\u79CD\u8FC7\u6EE4\u6761\u4EF6\uFF0C\u4E00\u65E6\u53D1\u73B0\u4E0D\u5339\u914D\u7ACB\u5373\u8FD4\u56DEfalse\u3002\r\n * \r\n * @param entity \u8981\u68C0\u67E5\u7684\u5B9E\u4F53\r\n * @returns \u5B9E\u4F53\u662F\u5426\u5339\u914D\u6240\u6709\u67E5\u8BE2\u6761\u4EF6\r\n */\r\n private matchesEntity(entity: Entity): boolean {\r\n // \u68C0\u67E5\u6FC0\u6D3B\u72B6\u6001\r\n if (this._activeOnly && !entity.active) {\r\n return false;\r\n }\r\n \r\n // \u68C0\u67E5\u542F\u7528\u72B6\u6001\r\n if (this._enabledOnly && !entity.enabled) {\r\n return false;\r\n }\r\n \r\n // \u68C0\u67E5\u5FC5\u987B\u5305\u542B\u7684\u7EC4\u4EF6\r\n if (this._allComponents.length > 0) {\r\n for (const componentType of this._allComponents) {\r\n if (!entity.hasComponent(componentType)) {\r\n return false;\r\n }\r\n }\r\n }\r\n \r\n // \u68C0\u67E5\u81F3\u5C11\u5305\u542B\u4E00\u4E2A\u7684\u7EC4\u4EF6\r\n if (this._anyComponents.length > 0) {\r\n let hasAny = false;\r\n for (const componentType of this._anyComponents) {\r\n if (entity.hasComponent(componentType)) {\r\n hasAny = true;\r\n break;\r\n }\r\n }\r\n if (!hasAny) {\r\n return false;\r\n }\r\n }\r\n \r\n // \u68C0\u67E5\u4E0D\u80FD\u5305\u542B\u7684\u7EC4\u4EF6\r\n if (this._withoutComponents.length > 0) {\r\n for (const componentType of this._withoutComponents) {\r\n if (entity.hasComponent(componentType)) {\r\n return false;\r\n }\r\n }\r\n }\r\n \r\n // \u68C0\u67E5\u5FC5\u987B\u5305\u542B\u7684\u6807\u7B7E\r\n if (this._withTags.length > 0) {\r\n if (!this._withTags.includes(entity.tag)) {\r\n return false;\r\n }\r\n }\r\n \r\n // \u68C0\u67E5\u4E0D\u80FD\u5305\u542B\u7684\u6807\u7B7E\r\n if (this._withoutTags.length > 0) {\r\n if (this._withoutTags.includes(entity.tag)) {\r\n return false;\r\n }\r\n }\r\n \r\n // \u68C0\u67E5\u81EA\u5B9A\u4E49\u6761\u4EF6\r\n if (this._customPredicates.length > 0) {\r\n for (const predicate of this._customPredicates) {\r\n if (!predicate(entity)) {\r\n return false;\r\n }\r\n }\r\n }\r\n \r\n return true;\r\n }\r\n}\r\n\r\n/**\r\n * \u5B9E\u4F53\u7BA1\u7406\u5668\r\n * \r\n * \u63D0\u4F9B\u7EDF\u4E00\u7684\u5B9E\u4F53\u7BA1\u7406\u548C\u67E5\u8BE2\u673A\u5236\uFF0C\u652F\u6301\u9AD8\u6548\u7684\u5B9E\u4F53\u64CD\u4F5C\u3002\r\n * \u5305\u62EC\u5B9E\u4F53\u7684\u521B\u5EFA\u3001\u9500\u6BC1\u3001\u67E5\u8BE2\u548C\u7D22\u5F15\u7BA1\u7406\u529F\u80FD\u3002\r\n * \r\n * @example\r\n * ```typescript\r\n * const entityManager = new EntityManager();\r\n * \r\n * // \u521B\u5EFA\u5B9E\u4F53\r\n * const player = entityManager.createEntity(\"Player\");\r\n * \r\n * // \u67E5\u8BE2\u5B9E\u4F53\r\n * const playerEntity = entityManager.getEntityByName(\"Player\");\r\n * \r\n * // \u590D\u6742\u67E5\u8BE2\r\n * const results = entityManager.query()\r\n * .withAll(HealthComponent, PositionComponent)\r\n * .active()\r\n * .execute();\r\n * ```\r\n */\r\nexport class EntityManager {\r\n /** \u4E3B\u8981\u5B9E\u4F53\u5B58\u50A8\uFF0C\u4F7F\u7528ID\u4F5C\u4E3A\u952E */\r\n private _entities: Map<number, Entity> = new Map();\r\n /** \u6309\u540D\u79F0\u7D22\u5F15\u7684\u5B9E\u4F53\u6620\u5C04 */\r\n private _entitiesByName: Map<string, Entity[]> = new Map();\r\n /** \u6309\u6807\u7B7E\u7D22\u5F15\u7684\u5B9E\u4F53\u6620\u5C04 */\r\n private _entitiesByTag: Map<number, Entity[]> = new Map();\r\n /** \u5B9E\u4F53ID\u5206\u914D\u5668 */\r\n private _identifierPool: IdentifierPool;\r\n /** \u5DF2\u9500\u6BC1\u5B9E\u4F53\u7684ID\u96C6\u5408 */\r\n private _destroyedEntities: Set<number> = new Set();\r\n \r\n /** \u6027\u80FD\u4F18\u5316\u7CFB\u7EDF */\r\n private _componentIndexManager: ComponentIndexManager;\r\n private _archetypeSystem: ArchetypeSystem;\r\n private _dirtyTrackingSystem: DirtyTrackingSystem;\r\n /** \u4E8B\u4EF6\u603B\u7EBF */\r\n private _eventBus: EventBus;\r\n \r\n /**\r\n * \u521B\u5EFA\u5B9E\u4F53\u7BA1\u7406\u5668\u5B9E\u4F8B\r\n * \r\n * \u521D\u59CB\u5316\u5185\u90E8\u6570\u636E\u7ED3\u6784\u548CID\u5206\u914D\u5668\u3002\r\n */\r\n constructor() {\r\n this._identifierPool = new IdentifierPool();\r\n \r\n // \u521D\u59CB\u5316\u6027\u80FD\u4F18\u5316\u7CFB\u7EDF\r\n this._componentIndexManager = new ComponentIndexManager(IndexType.HASH);\r\n this._archetypeSystem = new ArchetypeSystem();\r\n this._dirtyTrackingSystem = new DirtyTrackingSystem();\r\n this._eventBus = new EventBus(false);\r\n \r\n // \u8BBE\u7F6EEntity\u7684\u9759\u6001\u4E8B\u4EF6\u603B\u7EBF\u5F15\u7528\r\n Entity.eventBus = this._eventBus;\r\n }\r\n \r\n /**\r\n * \u83B7\u53D6\u5B9E\u4F53\u603B\u6570\r\n * \r\n * @returns \u5F53\u524D\u7BA1\u7406\u7684\u5B9E\u4F53\u603B\u6570\u91CF\r\n */\r\n public get entityCount(): number {\r\n return this._entities.size;\r\n }\r\n \r\n /**\r\n * \u83B7\u53D6\u6FC0\u6D3B\u72B6\u6001\u7684\u5B9E\u4F53\u6570\u91CF\r\n * \r\n * \u53EA\u8BA1\u7B97\u540C\u65F6\u6EE1\u8DB3\u6FC0\u6D3B\u72B6\u6001\u4E14\u672A\u88AB\u9500\u6BC1\u7684\u5B9E\u4F53\u3002\r\n * \r\n * @returns \u6FC0\u6D3B\u72B6\u6001\u7684\u5B9E\u4F53\u6570\u91CF\r\n */\r\n public get activeEntityCount(): number {\r\n let count = 0;\r\n for (const entity of this._entities.values()) {\r\n if (entity.active && !entity.isDestroyed) {\r\n count++;\r\n }\r\n }\r\n return count;\r\n }\r\n \r\n /**\r\n * \u521B\u5EFA\u65B0\u5B9E\u4F53\r\n * \r\n * \u5206\u914D\u552F\u4E00ID\u5E76\u5C06\u5B9E\u4F53\u6DFB\u52A0\u5230\u7BA1\u7406\u7CFB\u7EDF\u4E2D\uFF0C\u540C\u65F6\u66F4\u65B0\u76F8\u5173\u7D22\u5F15\u3002\r\n * \r\n * @param name \u5B9E\u4F53\u540D\u79F0\uFF0C\u5982\u679C\u672A\u6307\u5B9A\u5219\u4F7F\u7528\u65F6\u95F4\u6233\u751F\u6210\u9ED8\u8BA4\u540D\u79F0\r\n * @returns \u521B\u5EFA\u7684\u5B9E\u4F53\u5B9E\u4F8B\r\n * \r\n * @example\r\n * ```typescript\r\n * const player = entityManager.createEntity(\"Player\");\r\n * const enemy = entityManager.createEntity(); // \u4F7F\u7528\u9ED8\u8BA4\u540D\u79F0\r\n * ```\r\n */\r\n public createEntity(name: string = `Entity_${Date.now()}`): Entity {\r\n const id = this._identifierPool.checkOut();\r\n const entity = new Entity(name, id);\r\n \r\n this._entities.set(id, entity);\r\n this.updateNameIndex(entity, true);\r\n this.updateTagIndex(entity, true);\r\n \r\n this._componentIndexManager.addEntity(entity);\r\n this._archetypeSystem.addEntity(entity);\r\n this._dirtyTrackingSystem.markDirty(entity, DirtyFlag.COMPONENT_ADDED);\r\n \r\n // \u53D1\u5C04\u5B9E\u4F53\u521B\u5EFA\u4E8B\u4EF6\r\n this._eventBus.emitEntityCreated({\r\n timestamp: Date.now(),\r\n source: 'EntityManager',\r\n entityId: entity.id,\r\n entityName: entity.name,\r\n entityTag: entity.tag?.toString()\r\n });\r\n \r\n return entity;\r\n }\r\n \r\n /**\r\n * \u9500\u6BC1\u5B9E\u4F53\r\n * \r\n * \u652F\u6301\u901A\u8FC7\u5B9E\u4F53\u5BF9\u8C61\u3001\u540D\u79F0\u6216ID\u6765\u9500\u6BC1\u5B9E\u4F53\u3002\r\n * \u4F1A\u6E05\u7406\u6240\u6709\u76F8\u5173\u7D22\u5F15\u5E76\u56DE\u6536ID\u3002\r\n * \r\n * @param entityOrId \u8981\u9500\u6BC1\u7684\u5B9E\u4F53\uFF0C\u53EF\u4EE5\u662F\u5B9E\u4F53\u5BF9\u8C61\u3001\u540D\u79F0\u5B57\u7B26\u4E32\u6216ID\u6570\u5B57\r\n * @returns \u662F\u5426\u6210\u529F\u9500\u6BC1\u5B9E\u4F53\r\n * \r\n * @example\r\n * ```typescript\r\n * // \u901A\u8FC7\u5B9E\u4F53\u5BF9\u8C61\u9500\u6BC1\r\n * entityManager.destroyEntity(player);\r\n * \r\n * // \u901A\u8FC7\u540D\u79F0\u9500\u6BC1\r\n * entityManager.destroyEntity(\"Enemy_1\");\r\n * \r\n * // \u901A\u8FC7ID\u9500\u6BC1\r\n * entityManager.destroyEntity(123);\r\n * ```\r\n */\r\n public destroyEntity(entityOrId: Entity | string | number): boolean {\r\n let entity: Entity | null = null;\r\n \r\n if (typeof entityOrId === 'string') {\r\n entity = this.getEntityByName(entityOrId);\r\n } else if (typeof entityOrId === 'number') {\r\n entity = this._entities.get(entityOrId) || null;\r\n } else {\r\n entity = this._entities.get(entityOrId.id) || null;\r\n }\r\n \r\n if (!entity) {\r\n return false;\r\n }\r\n \r\n this._destroyedEntities.add(entity.id);\r\n this.updateNameIndex(entity, false);\r\n this.updateTagIndex(entity, false);\r\n \r\n this._componentIndexManager.removeEntity(entity);\r\n this._archetypeSystem.removeEntity(entity);\r\n this._dirtyTrackingSystem.markDirty(entity, DirtyFlag.COMPONENT_REMOVED);\r\n \r\n // \u53D1\u5C04\u5B9E\u4F53\u9500\u6BC1\u4E8B\u4EF6\r\n this._eventBus.emitEntityDestroyed({\r\n timestamp: Date.now(),\r\n source: 'EntityManager',\r\n entityId: entity.id,\r\n entityName: entity.name,\r\n entityTag: entity.tag?.toString()\r\n });\r\n \r\n entity.destroy();\r\n this._entities.delete(entity.id);\r\n this._identifierPool.checkIn(entity.id);\r\n \r\n return true;\r\n }\r\n \r\n /**\r\n * \u83B7\u53D6\u6240\u6709\u5B9E\u4F53\r\n * \r\n * \u8FD4\u56DE\u5F53\u524D\u7BA1\u7406\u7684\u6240\u6709\u5B9E\u4F53\u7684\u526F\u672C\u6570\u7EC4\u3002\r\n * \r\n * @returns \u6240\u6709\u5B9E\u4F53\u7684\u6570\u7EC4\r\n */\r\n public getAllEntities(): Entity[] {\r\n return Array.from(this._entities.values());\r\n }\r\n \r\n /**\r\n * \u6839\u636EID\u83B7\u53D6\u5B9E\u4F53\r\n * \r\n * \u652F\u6301\u5B57\u7B26\u4E32\u548C\u6570\u5B57\u7C7B\u578B\u7684ID\u3002\r\n * \r\n * @param id \u5B9E\u4F53ID\uFF0C\u53EF\u4EE5\u662F\u5B57\u7B26\u4E32\u6216\u6570\u5B57\r\n * @returns \u5BF9\u5E94\u7684\u5B9E\u4F53\uFF0C\u5982\u679C\u4E0D\u5B58\u5728\u5219\u8FD4\u56DEnull\r\n */\r\n public getEntity(id: string | number): Entity | null {\r\n const numId = typeof id === 'string' ? parseInt(id) : id;\r\n return this._entities.get(numId) || null;\r\n }\r\n \r\n /**\r\n * \u6839\u636E\u540D\u79F0\u83B7\u53D6\u5B9E\u4F53\r\n * \r\n * \u5982\u679C\u5B58\u5728\u591A\u4E2A\u540C\u540D\u5B9E\u4F53\uFF0C\u8FD4\u56DE\u7B2C\u4E00\u4E2A\u627E\u5230\u7684\u5B9E\u4F53\u3002\r\n * \r\n * @param name \u5B9E\u4F53\u540D\u79F0\r\n * @returns \u5339\u914D\u7684\u5B9E\u4F53\uFF0C\u5982\u679C\u4E0D\u5B58\u5728\u5219\u8FD4\u56DEnull\r\n */\r\n public getEntityByName(name: string): Entity | null {\r\n const entities = this._entitiesByName.get(name);\r\n return entities && entities.length > 0 ? entities[0] : null;\r\n }\r\n \r\n /**\r\n * \u6839\u636E\u6807\u7B7E\u83B7\u53D6\u5B9E\u4F53\u5217\u8868\r\n * \r\n * \u8FD4\u56DE\u6240\u6709\u5177\u6709\u6307\u5B9A\u6807\u7B7E\u7684\u5B9E\u4F53\u3002\r\n * \r\n * @param tag \u6807\u7B7E\u503C\r\n * @returns \u5177\u6709\u6307\u5B9A\u6807\u7B7E\u7684\u5B9E\u4F53\u6570\u7EC4\r\n */\r\n public getEntitiesByTag(tag: number): Entity[] {\r\n return [...(this._entitiesByTag.get(tag) || [])];\r\n }\r\n \r\n /**\r\n * \u83B7\u53D6\u5305\u542B\u6307\u5B9A\u7EC4\u4EF6\u7684\u6240\u6709\u5B9E\u4F53\r\n * \r\n * \u904D\u5386\u6240\u6709\u5B9E\u4F53\uFF0C\u67E5\u627E\u5305\u542B\u6307\u5B9A\u7EC4\u4EF6\u7C7B\u578B\u7684\u5B9E\u4F53\u3002\r\n * \r\n * @param componentType \u7EC4\u4EF6\u7C7B\u578B\r\n * @returns \u5305\u542B\u6307\u5B9A\u7EC4\u4EF6\u7684\u5B9E\u4F53\u6570\u7EC4\r\n * \r\n * @example\r\n * ```typescript\r\n * const entitiesWithHealth = entityManager.getEntitiesWithComponent(HealthComponent);\r\n * ```\r\n */\r\n public getEntitiesWithComponent<T extends Component>(componentType: ComponentType<T>): Entity[] {\r\n const indexResult = this._componentIndexManager.query(componentType);\r\n return Array.from(indexResult);\r\n }\r\n \r\n /**\r\n * \u521B\u5EFA\u67E5\u8BE2\u6784\u5EFA\u5668\r\n * \r\n * \u8FD4\u56DE\u4E00\u4E2A\u65B0\u7684\u67E5\u8BE2\u6784\u5EFA\u5668\u5B9E\u4F8B\uFF0C\u7528\u4E8E\u6784\u5EFA\u590D\u6742\u7684\u5B9E\u4F53\u67E5\u8BE2\u3002\r\n * \r\n * @returns \u65B0\u7684\u67E5\u8BE2\u6784\u5EFA\u5668\u5B9E\u4F8B\r\n * \r\n * @example\r\n * ```typescript\r\n * const results = entityManager.query()\r\n * .withAll(PositionComponent, HealthComponent)\r\n * .without(VelocityComponent)\r\n * .active()\r\n * .execute();\r\n * ```\r\n */\r\n public query(): EntityQueryBuilder {\r\n return new EntityQueryBuilder(this);\r\n }\r\n\r\n /**\r\n * \u4F7F\u7528\u7EC4\u4EF6\u7D22\u5F15\u8FDB\u884C\u591A\u7EC4\u4EF6\u67E5\u8BE2\r\n * \r\n * @param componentTypes \u7EC4\u4EF6\u7C7B\u578B\u6570\u7EC4\r\n * @param operation \u67E5\u8BE2\u64CD\u4F5C\uFF1A'AND' \u6216 'OR'\r\n * @returns \u5339\u914D\u7684\u5B9E\u4F53\u96C6\u5408\r\n */\r\n public queryWithComponentIndex(componentTypes: ComponentType[], operation: 'AND' | 'OR'): Set<Entity> {\r\n return this._componentIndexManager.queryMultiple(componentTypes, operation);\r\n }\r\n \r\n /**\r\n * \u6807\u8BB0\u5B9E\u4F53\u7EC4\u4EF6\u5DF2\u4FEE\u6539\r\n * \r\n * @param entity \u4FEE\u6539\u7684\u5B9E\u4F53\r\n * @param componentTypes \u4FEE\u6539\u7684\u7EC4\u4EF6\u7C7B\u578B\r\n */\r\n public markEntityDirty(entity: Entity, componentTypes: ComponentType[]): void {\r\n this._dirtyTrackingSystem.markDirty(entity, DirtyFlag.COMPONENT_MODIFIED, componentTypes);\r\n }\r\n \r\n /**\r\n * \u83B7\u53D6\u6027\u80FD\u4F18\u5316\u7EDF\u8BA1\u4FE1\u606F\r\n */\r\n public getOptimizationStats(): any {\r\n return {\r\n componentIndex: this._componentIndexManager.getStats(),\r\n archetypeSystem: this._archetypeSystem.getAllArchetypes().map(a => ({\r\n id: a.id,\r\n componentTypes: a.componentTypes.map(t => t.name),\r\n entityCount: a.entities.length\r\n })),\r\n dirtyTracking: this._dirtyTrackingSystem.getStats()\r\n };\r\n }\r\n \r\n /**\r\n * \u83B7\u53D6\u4E8B\u4EF6\u603B\u7EBF\u5B9E\u4F8B\r\n * \r\n * \u5141\u8BB8\u5916\u90E8\u4EE3\u7801\u76D1\u542C\u548C\u53D1\u5C04ECS\u76F8\u5173\u4E8B\u4EF6\u3002\r\n * \r\n * @returns \u4E8B\u4EF6\u603B\u7EBF\u5B9E\u4F8B\r\n */\r\n public get eventBus(): EventBus {\r\n return this._eventBus;\r\n }\r\n \r\n /**\r\n * \u66F4\u65B0\u540D\u79F0\u7D22\u5F15\r\n * \r\n * \u7EF4\u62A4\u6309\u540D\u79F0\u67E5\u627E\u5B9E\u4F53\u7684\u7D22\u5F15\u7ED3\u6784\u3002\u652F\u6301\u6DFB\u52A0\u548C\u79FB\u9664\u64CD\u4F5C\u3002\r\n * \r\n * @param entity \u8981\u66F4\u65B0\u7D22\u5F15\u7684\u5B9E\u4F53\r\n * @param isAdd true\u8868\u793A\u6DFB\u52A0\u5230\u7D22\u5F15\uFF0Cfalse\u8868\u793A\u4ECE\u7D22\u5F15\u4E2D\u79FB\u9664\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._entitiesByName.get(entity.name);\r\n if (!entities) {\r\n entities = [];\r\n this._entitiesByName.set(entity.name, entities);\r\n }\r\n entities.push(entity);\r\n } else {\r\n const entities = this._entitiesByName.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 if (entities.length === 0) {\r\n this._entitiesByName.delete(entity.name);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n \r\n /**\r\n * \u66F4\u65B0\u6807\u7B7E\u7D22\u5F15\r\n * \r\n * \u7EF4\u62A4\u6309\u6807\u7B7E\u67E5\u627E\u5B9E\u4F53\u7684\u7D22\u5F15\u7ED3\u6784\u3002\u652F\u6301\u6DFB\u52A0\u548C\u79FB\u9664\u64CD\u4F5C\u3002\r\n * \r\n * @param entity \u8981\u66F4\u65B0\u7D22\u5F15\u7684\u5B9E\u4F53\r\n * @param isAdd true\u8868\u793A\u6DFB\u52A0\u5230\u7D22\u5F15\uFF0Cfalse\u8868\u793A\u4ECE\u7D22\u5F15\u4E2D\u79FB\u9664\r\n */\r\n private updateTagIndex(entity: Entity, isAdd: boolean): void {\r\n if (isAdd) {\r\n let entities = this._entitiesByTag.get(entity.tag);\r\n if (!entities) {\r\n entities = [];\r\n this._entitiesByTag.set(entity.tag, entities);\r\n }\r\n entities.push(entity);\r\n } else {\r\n const entities = this._entitiesByTag.get(entity.tag);\r\n if (entities) {\r\n const index = entities.indexOf(entity);\r\n if (index !== -1) {\r\n entities.splice(index, 1);\r\n if (entities.length === 0) {\r\n this._entitiesByTag.delete(entity.tag);\r\n }\r\n }\r\n }\r\n }\r\n }\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}\r\n\r\n/**\r\n * \u7EC4\u4EF6\u63A5\u53E3\r\n * \r\n * \u5B9A\u4E49\u7EC4\u4EF6\u7684\u57FA\u672C\u5951\u7EA6\uFF0C\u6240\u6709\u7EC4\u4EF6\u90FD\u5E94\u8BE5\u5B9E\u73B0\u6B64\u63A5\u53E3\r\n */\r\nexport interface IComponent {\r\n /** \u7EC4\u4EF6\u552F\u4E00\u6807\u8BC6\u7B26 */\r\n readonly id: number;\r\n /** \u7EC4\u4EF6\u6240\u5C5E\u7684\u5B9E\u4F53ID */\r\n entityId?: string | number;\r\n /** \u7EC4\u4EF6\u542F\u7528\u72B6\u6001 */\r\n enabled: boolean;\r\n /** \u66F4\u65B0\u987A\u5E8F */\r\n updateOrder: number;\r\n \r\n /** \u7EC4\u4EF6\u6DFB\u52A0\u5230\u5B9E\u4F53\u65F6\u7684\u56DE\u8C03 */\r\n onAddedToEntity(): void;\r\n /** \u7EC4\u4EF6\u4ECE\u5B9E\u4F53\u79FB\u9664\u65F6\u7684\u56DE\u8C03 */\r\n onRemovedFromEntity(): void;\r\n /** \u7EC4\u4EF6\u542F\u7528\u65F6\u7684\u56DE\u8C03 */\r\n onEnabled(): void;\r\n /** \u7EC4\u4EF6\u7981\u7528\u65F6\u7684\u56DE\u8C03 */\r\n onDisabled(): void;\r\n /** \u66F4\u65B0\u7EC4\u4EF6 */\r\n update(): void;\r\n}\r\n\r\n/**\r\n * \u5B9E\u4F53\u63A5\u53E3\r\n * \r\n * \u5B9A\u4E49\u5B9E\u4F53\u7684\u57FA\u672C\u5951\u7EA6\uFF0C\u6240\u6709\u5B9E\u4F53\u90FD\u5E94\u8BE5\u5B9E\u73B0\u6B64\u63A5\u53E3\r\n */\r\nexport interface IEntity {\r\n /** \u5B9E\u4F53\u552F\u4E00\u6807\u8BC6\u7B26 */\r\n readonly id: string | number;\r\n /** \u5B9E\u4F53\u540D\u79F0 */\r\n name: string;\r\n /** \u5B9E\u4F53\u6FC0\u6D3B\u72B6\u6001 */\r\n active: boolean;\r\n /** \u5B9E\u4F53\u542F\u7528\u72B6\u6001 */\r\n enabled: boolean;\r\n /** \u5B9E\u4F53\u662F\u5426\u5DF2\u9500\u6BC1 */\r\n readonly isDestroyed: boolean;\r\n /** \u66F4\u65B0\u987A\u5E8F */\r\n updateOrder: number;\r\n /** \u5B9E\u4F53\u6807\u7B7E */\r\n tag: number;\r\n \r\n /** \u6DFB\u52A0\u7EC4\u4EF6 */\r\n addComponent<T extends IComponent>(component: T): T;\r\n /** \u521B\u5EFA\u5E76\u6DFB\u52A0\u7EC4\u4EF6 */\r\n createComponent<T extends IComponent>(componentType: ComponentType<T>, ...args: any[]): T;\r\n /** \u83B7\u53D6\u7EC4\u4EF6 */\r\n getComponent<T extends IComponent>(type: ComponentType<T>): T | null;\r\n /** \u83B7\u53D6\u6216\u521B\u5EFA\u7EC4\u4EF6 */\r\n getOrCreateComponent<T extends IComponent>(type: ComponentType<T>, ...args: any[]): T;\r\n /** \u79FB\u9664\u7EC4\u4EF6 */\r\n removeComponent(component: IComponent): void;\r\n /** \u901A\u8FC7\u7C7B\u578B\u79FB\u9664\u7EC4\u4EF6 */\r\n removeComponentByType<T extends IComponent>(type: ComponentType<T>): T | null;\r\n /** \u68C0\u67E5\u662F\u5426\u6709\u7EC4\u4EF6 */\r\n hasComponent<T extends IComponent>(type: ComponentType<T>): boolean;\r\n /** \u83B7\u53D6\u6240\u6709\u6307\u5B9A\u7C7B\u578B\u7684\u7EC4\u4EF6 */\r\n getComponents<T extends IComponent>(type: ComponentType<T>): T[];\r\n \r\n /** \u6DFB\u52A0\u5B50\u5B9E\u4F53 */\r\n addChild(child: IEntity): IEntity;\r\n /** \u79FB\u9664\u5B50\u5B9E\u4F53 */\r\n removeChild(child: IEntity): boolean;\r\n /** \u67E5\u627E\u5B50\u5B9E\u4F53 */\r\n findChild(name: string, recursive?: boolean): IEntity | null;\r\n \r\n /** \u66F4\u65B0\u5B9E\u4F53 */\r\n update(): void;\r\n /** \u9500\u6BC1\u5B9E\u4F53 */\r\n destroy(): void;\r\n}\r\n\r\n/**\r\n * \u5B9E\u4F53\u57FA\u7840\u63A5\u53E3\uFF08\u5411\u540E\u517C\u5BB9\uFF09\r\n * \r\n * \u4E3A\u73B0\u6709\u7684Entity\u7C7B\u63D0\u4F9B\u66F4\u7075\u6D3B\u7684\u7C7B\u578B\u5B9A\u4E49\r\n */\r\nexport interface IEntityBase {\r\n /** \u5B9E\u4F53\u552F\u4E00\u6807\u8BC6\u7B26 */\r\n readonly id: string | number;\r\n /** \u5B9E\u4F53\u540D\u79F0 */\r\n name: string;\r\n /** \u5B9E\u4F53\u6FC0\u6D3B\u72B6\u6001 */\r\n active: boolean;\r\n /** \u5B9E\u4F53\u542F\u7528\u72B6\u6001 */\r\n enabled: boolean;\r\n /** \u5B9E\u4F53\u662F\u5426\u5DF2\u9500\u6BC1 */\r\n readonly isDestroyed: boolean;\r\n /** \u66F4\u65B0\u987A\u5E8F */\r\n updateOrder: number;\r\n /** \u5B9E\u4F53\u6807\u7B7E */\r\n tag: number;\r\n \r\n /** \u6DFB\u52A0\u7EC4\u4EF6\uFF08\u6CDB\u578B\u7248\u672C\uFF09 */\r\n addComponent<T>(component: T): T;\r\n /** \u83B7\u53D6\u7EC4\u4EF6\uFF08\u6CDB\u578B\u7248\u672C\uFF09 */\r\n getComponent<T>(type: ComponentClass<T>): T | null;\r\n /** \u68C0\u67E5\u662F\u5426\u6709\u7EC4\u4EF6\uFF08\u6CDB\u578B\u7248\u672C\uFF09 */\r\n hasComponent<T>(type: ComponentClass<T>): boolean;\r\n \r\n /** \u6DFB\u52A0\u5B50\u5B9E\u4F53 */\r\n addChild(child: any): any;\r\n /** \u79FB\u9664\u5B50\u5B9E\u4F53 */\r\n removeChild(child: any): boolean;\r\n /** \u67E5\u627E\u5B50\u5B9E\u4F53 */\r\n findChild(name: string, recursive?: boolean): any;\r\n \r\n /** \u66F4\u65B0\u5B9E\u4F53 */\r\n update(): void;\r\n /** \u9500\u6BC1\u5B9E\u4F53 */\r\n destroy(): void;\r\n}\r\n\r\n/**\r\n * \u7CFB\u7EDF\u63A5\u53E3\r\n * \r\n * \u5B9A\u4E49\u7CFB\u7EDF\u7684\u57FA\u672C\u5951\u7EA6\uFF0C\u6240\u6709\u7CFB\u7EDF\u90FD\u5E94\u8BE5\u5B9E\u73B0\u6B64\u63A5\u53E3\r\n */\r\nexport interface ISystem {\r\n /** \u7CFB\u7EDF\u540D\u79F0 */\r\n readonly systemName: string;\r\n /** \u7CFB\u7EDF\u5904\u7406\u7684\u5B9E\u4F53\u5217\u8868 */\r\n readonly entities: readonly IEntity[];\r\n /** \u66F4\u65B0\u987A\u5E8F/\u4F18\u5148\u7EA7 */\r\n updateOrder: number;\r\n /** \u7CFB\u7EDF\u542F\u7528\u72B6\u6001 */\r\n enabled: boolean;\r\n \r\n /** \u7CFB\u7EDF\u521D\u59CB\u5316 */\r\n initialize(): void;\r\n /** \u66F4\u65B0\u7CFB\u7EDF\uFF08\u4E3B\u8981\u5904\u7406\u9636\u6BB5\uFF09 */\r\n update(): void;\r\n /** \u5EF6\u8FDF\u66F4\u65B0\u7CFB\u7EDF */\r\n lateUpdate?(): void;\r\n \r\n /** \u5F53\u5B9E\u4F53\u6DFB\u52A0\u5230\u7CFB\u7EDF\u65F6\u7684\u56DE\u8C03 */\r\n onEntityAdded?(entity: IEntity): void;\r\n /** \u5F53\u5B9E\u4F53\u4ECE\u7CFB\u7EDF\u79FB\u9664\u65F6\u7684\u56DE\u8C03 */\r\n onEntityRemoved?(entity: IEntity): void;\r\n /** \u5F53\u5B9E\u4F53\u7EC4\u4EF6\u53D1\u751F\u53D8\u5316\u65F6\u7684\u56DE\u8C03 */\r\n onEntityChanged?(entity: IEntity): void;\r\n}\r\n\r\n/**\r\n * \u7CFB\u7EDF\u57FA\u7840\u63A5\u53E3\uFF08\u5411\u540E\u517C\u5BB9\uFF09\r\n * \r\n * \u4E3A\u73B0\u6709\u7684EntitySystem\u7C7B\u63D0\u4F9B\u66F4\u7075\u6D3B\u7684\u7C7B\u578B\u5B9A\u4E49\r\n */\r\nexport interface ISystemBase {\r\n /** \u7CFB\u7EDF\u540D\u79F0 */\r\n readonly systemName: string;\r\n /** \u7CFB\u7EDF\u5904\u7406\u7684\u5B9E\u4F53\u5217\u8868\uFF08\u6CDB\u578B\u7248\u672C\uFF09 */\r\n readonly entities: readonly any[];\r\n /** \u66F4\u65B0\u987A\u5E8F/\u4F18\u5148\u7EA7 */\r\n updateOrder: number;\r\n /** \u7CFB\u7EDF\u542F\u7528\u72B6\u6001 */\r\n enabled: boolean;\r\n \r\n /** \u7CFB\u7EDF\u521D\u59CB\u5316 */\r\n initialize(): void;\r\n /** \u66F4\u65B0\u7CFB\u7EDF\uFF08\u4E3B\u8981\u5904\u7406\u9636\u6BB5\uFF09 */\r\n update(): void;\r\n /** \u5EF6\u8FDF\u66F4\u65B0\u7CFB\u7EDF */\r\n lateUpdate?(): void;\r\n}\r\n\r\n/**\r\n * \u573A\u666F\u63A5\u53E3\r\n * \r\n * \u5B9A\u4E49\u573A\u666F\u7684\u57FA\u672C\u5951\u7EA6\r\n */\r\nexport interface IScene {\r\n /** \u573A\u666F\u540D\u79F0 */\r\n name: string;\r\n /** \u573A\u666F\u4E2D\u7684\u5B9E\u4F53\u5217\u8868 */\r\n readonly entities: readonly IEntity[];\r\n /** \u573A\u666F\u4E2D\u7684\u7CFB\u7EDF\u5217\u8868 */\r\n readonly systems: readonly ISystem[];\r\n \r\n /** \u521B\u5EFA\u5B9E\u4F53 */\r\n createEntity(name: string): IEntity;\r\n /** \u6DFB\u52A0\u5B9E\u4F53\u5230\u573A\u666F */\r\n addEntity(entity: IEntity): void;\r\n /** \u4ECE\u573A\u666F\u79FB\u9664\u5B9E\u4F53 */\r\n removeEntity(entity: IEntity): void;\r\n /** \u67E5\u627E\u5B9E\u4F53 */\r\n findEntity(name: string): IEntity | null;\r\n \r\n /** \u6DFB\u52A0\u7CFB\u7EDF\u5230\u573A\u666F */\r\n addSystem<T extends ISystem>(system: T): T;\r\n /** \u4ECE\u573A\u666F\u79FB\u9664\u7CFB\u7EDF */\r\n removeSystem(system: ISystem): void;\r\n /** \u83B7\u53D6\u7CFB\u7EDF */\r\n getSystem<T extends ISystem>(systemType: new (...args: any[]) => T): T | null;\r\n \r\n /** \u66F4\u65B0\u573A\u666F */\r\n update(): void;\r\n}\r\n\r\n/**\r\n * \u7EC4\u4EF6\u7C7B\u578B\u5B9A\u4E49\r\n * \r\n * \u7528\u4E8E\u7C7B\u578B\u5B89\u5168\u7684\u7EC4\u4EF6\u64CD\u4F5C\r\n */\r\nexport type ComponentType<T extends IComponent = IComponent> = new (...args: any[]) => T;\r\n\r\n/**\r\n * \u539F\u59CB\u7EC4\u4EF6\u7C7B\u578B\uFF08\u5411\u540E\u517C\u5BB9\uFF09\r\n * \r\n * \u7528\u4E8E\u4E0E\u73B0\u6709Component\u7C7B\u7684\u517C\u5BB9\r\n */\r\nexport type ComponentClass<T = any> = new (...args: any[]) => T;\r\n\r\n/**\r\n * \u5B9E\u4F53\u67E5\u8BE2\u5339\u914D\u5668\u63A5\u53E3\r\n * \r\n * \u7528\u4E8E\u67E5\u8BE2\u7B26\u5408\u7279\u5B9A\u6761\u4EF6\u7684\u5B9E\u4F53\r\n */\r\nexport interface IMatcher {\r\n /** \u5FC5\u987B\u5305\u542B\u7684\u7EC4\u4EF6\u7C7B\u578B */\r\n all(...componentTypes: ComponentType[]): IMatcher;\r\n /** \u81F3\u5C11\u5305\u542B\u5176\u4E2D\u4E00\u4E2A\u7EC4\u4EF6\u7C7B\u578B */\r\n any(...componentTypes: ComponentType[]): IMatcher;\r\n /** \u4E0D\u80FD\u5305\u542B\u7684\u7EC4\u4EF6\u7C7B\u578B */\r\n exclude(...componentTypes: ComponentType[]): IMatcher;\r\n /** \u68C0\u67E5\u5B9E\u4F53\u662F\u5426\u5339\u914D */\r\n isInterestedEntity(entity: IEntity): boolean;\r\n}\r\n\r\n/**\r\n * \u6027\u80FD\u76D1\u63A7\u63A5\u53E3\r\n */\r\nexport interface IPerformanceData {\r\n /** \u6267\u884C\u65F6\u95F4\uFF08\u6BEB\u79D2\uFF09 */\r\n executionTime: number;\r\n /** \u8C03\u7528\u6B21\u6570 */\r\n callCount: number;\r\n /** \u5E73\u5747\u6267\u884C\u65F6\u95F4 */\r\n averageTime: number;\r\n /** \u6700\u5927\u6267\u884C\u65F6\u95F4 */\r\n maxTime: number;\r\n /** \u6700\u5C0F\u6267\u884C\u65F6\u95F4 */\r\n minTime: number;\r\n}\r\n\r\n/**\r\n * \u751F\u547D\u5468\u671F\u7BA1\u7406\u63A5\u53E3\r\n */\r\nexport interface ILifecycle {\r\n /** \u521D\u59CB\u5316 */\r\n initialize?(): void;\r\n /** \u542F\u52A8 */\r\n start?(): void;\r\n /** \u66F4\u65B0 */\r\n update?(): void;\r\n /** \u5EF6\u8FDF\u66F4\u65B0 */\r\n lateUpdate?(): void;\r\n /** \u505C\u6B62 */\r\n stop?(): void;\r\n /** \u9500\u6BC1 */\r\n destroy?(): void;\r\n}\r\n\r\n/**\r\n * \u5B9E\u4F53\u7BA1\u7406\u5668\u63A5\u53E3\r\n * \r\n * \u63D0\u4F9B\u7EDF\u4E00\u7684\u5B9E\u4F53\u7BA1\u7406\u548C\u67E5\u8BE2\u673A\u5236\uFF0C\u652F\u6301\u9AD8\u6548\u7684\u5B9E\u4F53\u64CD\u4F5C\r\n */\r\nexport interface IEntityManager {\r\n /** \u6240\u6709\u5B9E\u4F53\u6570\u91CF */\r\n readonly entityCount: number;\r\n /** \u6FC0\u6D3B\u7684\u5B9E\u4F53\u6570\u91CF */\r\n readonly activeEntityCount: number;\r\n \r\n /** \u521B\u5EFA\u5B9E\u4F53 */\r\n createEntity(name?: string): IEntity;\r\n /** \u9500\u6BC1\u5B9E\u4F53 */\r\n destroyEntity(entity: IEntity | string | number): boolean;\r\n /** \u6279\u91CF\u9500\u6BC1\u5B9E\u4F53 */\r\n destroyEntities(entities: (IEntity | string | number)[]): number;\r\n /** \u9500\u6BC1\u6240\u6709\u5B9E\u4F53 */\r\n destroyAllEntities(): number;\r\n \r\n /** \u6839\u636EID\u83B7\u53D6\u5B9E\u4F53 */\r\n getEntity(id: string | number): IEntity | null;\r\n /** \u6839\u636E\u540D\u79F0\u83B7\u53D6\u5B9E\u4F53 */\r\n getEntityByName(name: string): IEntity | null;\r\n /** \u6839\u636E\u540D\u79F0\u83B7\u53D6\u6240\u6709\u5B9E\u4F53 */\r\n getEntitiesByName(name: string): IEntity[];\r\n /** \u6839\u636E\u6807\u7B7E\u83B7\u53D6\u5B9E\u4F53 */\r\n getEntitiesByTag(tag: number): IEntity[];\r\n /** \u83B7\u53D6\u6240\u6709\u5B9E\u4F53 */\r\n getAllEntities(): IEntity[];\r\n /** \u83B7\u53D6\u6240\u6709\u6FC0\u6D3B\u7684\u5B9E\u4F53 */\r\n getActiveEntities(): IEntity[];\r\n \r\n /** \u83B7\u53D6\u62E5\u6709\u6307\u5B9A\u7EC4\u4EF6\u7684\u5B9E\u4F53 */\r\n getEntitiesWithComponent<T extends IComponent>(componentType: ComponentType<T>): IEntity[];\r\n /** \u83B7\u53D6\u62E5\u6709\u6307\u5B9A\u7EC4\u4EF6\u7684\u5B9E\u4F53\u53CA\u5176\u7EC4\u4EF6 */\r\n getEntitiesWithComponentData<T extends IComponent>(componentType: ComponentType<T>): Array<{entity: IEntity, component: T}>;\r\n /** \u83B7\u53D6\u62E5\u6709\u6240\u6709\u6307\u5B9A\u7EC4\u4EF6\u7684\u5B9E\u4F53 */\r\n getEntitiesWithComponents(...componentTypes: ComponentType[]): IEntity[];\r\n /** \u83B7\u53D6\u62E5\u6709\u4EFB\u4E00\u6307\u5B9A\u7EC4\u4EF6\u7684\u5B9E\u4F53 */\r\n getEntitiesWithAnyComponent(...componentTypes: ComponentType[]): IEntity[];\r\n /** \u83B7\u53D6\u4E0D\u5305\u542B\u6307\u5B9A\u7EC4\u4EF6\u7684\u5B9E\u4F53 */\r\n getEntitiesWithoutComponent<T extends IComponent>(componentType: ComponentType<T>): IEntity[];\r\n \r\n /** \u5BF9\u6240\u6709\u5B9E\u4F53\u6267\u884C\u64CD\u4F5C */\r\n forEachEntity(action: (entity: IEntity) => void): void;\r\n /** \u5BF9\u7B26\u5408\u6761\u4EF6\u7684\u5B9E\u4F53\u6267\u884C\u64CD\u4F5C */\r\n forEachEntityWhere(predicate: (entity: IEntity) => boolean, action: (entity: IEntity) => void): void;\r\n /** \u5BF9\u62E5\u6709\u6307\u5B9A\u7EC4\u4EF6\u7684\u5B9E\u4F53\u6267\u884C\u64CD\u4F5C */\r\n forEachEntityWithComponent<T extends IComponent>(\r\n componentType: ComponentType<T>, \r\n action: (entity: IEntity, component: T) => void\r\n ): void;\r\n \r\n /** \u67E5\u627E\u7B2C\u4E00\u4E2A\u7B26\u5408\u6761\u4EF6\u7684\u5B9E\u4F53 */\r\n findEntity(predicate: (entity: IEntity) => boolean): IEntity | null;\r\n /** \u67E5\u627E\u6240\u6709\u7B26\u5408\u6761\u4EF6\u7684\u5B9E\u4F53 */\r\n findEntities(predicate: (entity: IEntity) => boolean): IEntity[];\r\n \r\n /** \u83B7\u53D6\u7EDF\u8BA1\u4FE1\u606F */\r\n getStatistics(): {\r\n totalEntities: number;\r\n activeEntities: number;\r\n destroyedEntities: number;\r\n entitiesByTag: Map<number, number>;\r\n componentsCount: Map<string, number>;\r\n };\r\n \r\n /** \u6E05\u7406\u5DF2\u9500\u6BC1\u7684\u5B9E\u4F53 */\r\n cleanup(): number;\r\n /** \u538B\u7F29\u5B58\u50A8\u7A7A\u95F4 */\r\n compact(): void;\r\n}\r\n\r\n/**\r\n * \u5B9E\u4F53\u67E5\u8BE2\u6784\u5EFA\u5668\u63A5\u53E3\r\n * \r\n * \u63D0\u4F9B\u6D41\u5F0FAPI\u6784\u5EFA\u590D\u6742\u7684\u5B9E\u4F53\u67E5\u8BE2\u6761\u4EF6\r\n */\r\nexport interface IEntityQueryBuilder {\r\n /** \u5FC5\u987B\u5305\u542B\u6240\u6709\u6307\u5B9A\u7EC4\u4EF6 */\r\n withAll(...componentTypes: ComponentType[]): IEntityQueryBuilder;\r\n /** \u5FC5\u987B\u5305\u542B\u4EFB\u4E00\u6307\u5B9A\u7EC4\u4EF6 */\r\n withAny(...componentTypes: ComponentType[]): IEntityQueryBuilder;\r\n /** \u5FC5\u987B\u4E0D\u5305\u542B\u6307\u5B9A\u7EC4\u4EF6 */\r\n without(...componentTypes: ComponentType[]): IEntityQueryBuilder;\r\n /** \u5FC5\u987B\u5305\u542B\u6307\u5B9A\u6807\u7B7E */\r\n withTag(tag: number): IEntityQueryBuilder;\r\n /** \u5FC5\u987B\u4E0D\u5305\u542B\u6307\u5B9A\u6807\u7B7E */\r\n withoutTag(tag: number): IEntityQueryBuilder;\r\n /** \u5FC5\u987B\u5904\u4E8E\u6FC0\u6D3B\u72B6\u6001 */\r\n active(): IEntityQueryBuilder;\r\n /** \u5FC5\u987B\u5904\u4E8E\u542F\u7528\u72B6\u6001 */\r\n enabled(): IEntityQueryBuilder;\r\n /** \u81EA\u5B9A\u4E49\u8FC7\u6EE4\u6761\u4EF6 */\r\n where(predicate: (entity: IEntity) => boolean): IEntityQueryBuilder;\r\n \r\n /** \u6267\u884C\u67E5\u8BE2\uFF0C\u8FD4\u56DE\u6240\u6709\u5339\u914D\u7684\u5B9E\u4F53 */\r\n execute(): IEntity[];\r\n /** \u6267\u884C\u67E5\u8BE2\uFF0C\u8FD4\u56DE\u7B2C\u4E00\u4E2A\u5339\u914D\u7684\u5B9E\u4F53 */\r\n first(): IEntity | null;\r\n /** \u6267\u884C\u67E5\u8BE2\uFF0C\u8FD4\u56DE\u5339\u914D\u5B9E\u4F53\u7684\u6570\u91CF */\r\n count(): number;\r\n /** \u5BF9\u67E5\u8BE2\u7ED3\u679C\u6267\u884C\u64CD\u4F5C */\r\n forEach(action: (entity: IEntity) => void): void;\r\n}\r\n\r\n/**\r\n * \u4E8B\u4EF6\u603B\u7EBF\u63A5\u53E3\r\n * \u63D0\u4F9B\u7C7B\u578B\u5B89\u5168\u7684\u4E8B\u4EF6\u53D1\u5E03\u8BA2\u9605\u673A\u5236\r\n */\r\nexport interface IEventBus {\r\n /**\r\n * \u53D1\u5C04\u4E8B\u4EF6\r\n * @param eventType \u4E8B\u4EF6\u7C7B\u578B\r\n * @param data \u4E8B\u4EF6\u6570\u636E\r\n */\r\n emit<T>(eventType: string, data: T): void;\r\n \r\n /**\r\n * \u5F02\u6B65\u53D1\u5C04\u4E8B\u4EF6\r\n * @param eventType \u4E8B\u4EF6\u7C7B\u578B\r\n * @param data \u4E8B\u4EF6\u6570\u636E\r\n */\r\n emitAsync<T>(eventType: string, data: T): Promise<void>;\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 * @param config \u76D1\u542C\u5668\u914D\u7F6E\r\n * @returns \u76D1\u542C\u5668ID\r\n */\r\n on<T>(eventType: string, handler: (data: T) => void, config?: IEventListenerConfig): string;\r\n \r\n /**\r\n * \u76D1\u542C\u4E8B\u4EF6\uFF08\u4E00\u6B21\u6027\uFF09\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 once<T>(eventType: string, handler: (data: T) => void, config?: IEventListenerConfig): string;\r\n \r\n /**\r\n * \u5F02\u6B65\u76D1\u542C\u4E8B\u4EF6\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 onAsync<T>(eventType: string, handler: (data: T) => Promise<void>, config?: IEventListenerConfig): string;\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 off(eventType: string, listenerId: string): boolean;\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 offAll(eventType: string): void;\r\n \r\n /**\r\n * \u68C0\u67E5\u662F\u5426\u6709\u6307\u5B9A\u4E8B\u4EF6\u7684\u76D1\u542C\u5668\r\n * @param eventType \u4E8B\u4EF6\u7C7B\u578B\r\n */\r\n hasListeners(eventType: string): boolean;\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 */\r\n getStats(eventType?: string): IEventStats | Map<string, IEventStats>;\r\n \r\n /**\r\n * \u6E05\u7A7A\u6240\u6709\u76D1\u542C\u5668\r\n */\r\n clear(): void;\r\n}\r\n\r\n/**\r\n * \u4E8B\u4EF6\u76D1\u542C\u5668\u914D\u7F6E\u63A5\u53E3\r\n */\r\nexport interface IEventListenerConfig {\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 * \u4E8B\u4EF6\u7EDF\u8BA1\u4FE1\u606F\u63A5\u53E3\r\n */\r\nexport interface IEventStats {\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\u6570\u636E\u57FA\u7C7B\u63A5\u53E3\r\n */\r\nexport interface IEventData {\r\n /** \u4E8B\u4EF6\u65F6\u95F4\u6233 */\r\n timestamp: number;\r\n /** \u4E8B\u4EF6\u6765\u6E90 */\r\n source?: string;\r\n /** \u4E8B\u4EF6ID */\r\n eventId?: string;\r\n}\r\n\r\n/**\r\n * \u5B9E\u4F53\u4E8B\u4EF6\u6570\u636E\u63A5\u53E3\r\n */\r\nexport interface IEntityEventData extends IEventData {\r\n /** \u5B9E\u4F53ID */\r\n entityId: number;\r\n /** \u5B9E\u4F53\u540D\u79F0 */\r\n entityName?: string;\r\n /** \u5B9E\u4F53\u6807\u7B7E */\r\n entityTag?: string;\r\n}\r\n\r\n/**\r\n * \u7EC4\u4EF6\u4E8B\u4EF6\u6570\u636E\u63A5\u53E3\r\n */\r\nexport interface IComponentEventData extends IEntityEventData {\r\n /** \u7EC4\u4EF6\u7C7B\u578B\u540D\u79F0 */\r\n componentType: string;\r\n /** \u7EC4\u4EF6\u5B9E\u4F8B */\r\n component?: IComponent;\r\n}\r\n\r\n/**\r\n * \u7CFB\u7EDF\u4E8B\u4EF6\u6570\u636E\u63A5\u53E3\r\n */\r\nexport interface ISystemEventData extends IEventData {\r\n /** \u7CFB\u7EDF\u540D\u79F0 */\r\n systemName: string;\r\n /** \u7CFB\u7EDF\u7C7B\u578B */\r\n systemType: string;\r\n}\r\n\r\n/**\r\n * \u573A\u666F\u4E8B\u4EF6\u6570\u636E\u63A5\u53E3\r\n */\r\nexport interface ISceneEventData extends IEventData {\r\n /** \u573A\u666F\u540D\u79F0 */\r\n sceneName: string;\r\n /** \u524D\u4E00\u4E2A\u573A\u666F\u540D\u79F0 */\r\n previousSceneName?: string;\r\n}\r\n\r\n/**\r\n * \u6027\u80FD\u4E8B\u4EF6\u6570\u636E\u63A5\u53E3\r\n */\r\nexport interface IPerformanceEventData extends IEventData {\r\n /** \u64CD\u4F5C\u7C7B\u578B */\r\n operation: string;\r\n /** \u6267\u884C\u65F6\u95F4\uFF08\u6BEB\u79D2\uFF09 */\r\n executionTime: number;\r\n /** \u5185\u5B58\u4F7F\u7528\u91CF */\r\n memoryUsage?: number;\r\n /** \u989D\u5916\u6570\u636E */\r\n metadata?: Record<string, any>;\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", "ECSEventType", "EventPriority", "EVENT_TYPES", "_EventTypeValidator", "eventType", "__name", "EventTypeValidator", "e", "_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", "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", "now", "cleanupThreshold", "result", "child", "childrenToRemove", "recursive", "found", "tag", "root", "entity", "current", "depth", "callback", "childrenToDestroy", "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", "_WasmLoader", "silent", "wasmPath", "__name", "WasmLoader", "_JavaScriptFallback", "entityId", "mask", "entityIds", "masks", "i", "maxResults", "results", "entityMask", "matches", "includeMask", "excludeMask", "componentIds", "id", "componentId", "__name", "JavaScriptFallback", "_WasmEcsCore", "WasmLoader", "JavaScriptFallback", "silent", "wasmCore", "entityId", "mask", "entityIds", "masks", "entityIdArray", "maskArray", "maxResults", "resultPtr", "count", "wasmModule", "memory", "entities", "i", "includeMask", "excludeMask", "componentIds", "componentIdArray", "componentId", "stats", "__name", "WasmEcsCore", "ecsCore", "WasmEcsCore", "initializeEcs", "silent", "__name", "_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", "IndexType", "_HashComponentIndex", "entity", "components", "componentTypes", "component", "componentType", "entities", "startTime", "result", "operation", "smallestSet", "smallestSize", "hasAll", "memoryUsage", "__name", "HashComponentIndex", "_BitmapComponentIndex", "bitmap", "bit", "bitMask", "targetBitmap", "validBits", "entityBitmap", "BitmapComponentIndex", "_ComponentIndexManager", "initialType", "type", "oldIndex", "enabled", "current", "stats", "ComponentIndexManager", "_ArchetypeSystem", "entity", "componentTypes", "archetypeId", "archetype", "index", "operation", "startTime", "cacheKey", "t", "cached", "matchingArchetypes", "totalEntities", "foundArchetypes", "componentType", "archetypes", "result", "component", "type", "id", "add", "__name", "ArchetypeSystem", "DirtyFlag", "_DirtyTrackingSystem", "entity", "flags", "modifiedComponents", "dirtyData", "componentType", "result", "startTime", "processed", "listener", "a", "b", "callback", "index", "l", "batchSize", "maxProcessingTime", "error", "newFlags", "usage", "__name", "DirtyTrackingSystem", "QueryConditionType", "_QuerySystem", "ComponentPoolManager", "BitMaskOptimizer", "IndexUpdateBatcher", "ComponentIndexManager", "IndexType", "ArchetypeSystem", "DirtyTrackingSystem", "entities", "entity", "updates", "update", "wasmLoaded", "ecsCore", "error", "deferCacheClear", "DirtyFlag", "existingIds", "e", "addedCount", "index", "mask", "maskSet", "components", "i", "componentType", "typeSet", "tag", "tagSet", "name", "nameSet", "component", "componentTypes", "startTime", "cacheKey", "t", "cached", "archetypeResult", "archetype", "indexResult", "smallestSet", "smallestSize", "set", "result", "entry", "now", "key", "entries", "a", "b", "toRemove", "entityIds", "u", "masks", "providerName", "componentNames", "type", "indexType", "batchSize", "maxProcessingTime", "stats", "__name", "QuerySystem", "_QueryBuilder", "querySystem", "condition", "bitMask", "ComponentRegistry", "QueryBuilder", "_TypeSafeEventSystem", "eventType", "handler", "config", "listenerId", "listeners", "index", "l", "event", "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", "__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", "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", "_EventBus", "debugMode", "TypeSafeEventSystem", "eventType", "data", "enhancedData", "handler", "config", "eventConfig", "EventPriority", "listenerId", "stats", "result", "stat", "key", "enabled", "debug", "max", "batchSize", "delay", "entityData", "ECSEventType", "componentData", "systemData", "sceneData", "EVENT_TYPES", "performanceData", "EventTypeValidator", "enhanced", "__name", "EventBus", "_GlobalEventBus", "GlobalEventBus", "EventHandler", "target", "propertyKey", "descriptor", "originalMethod", "initMethod", "AsyncEventHandler", "_EntityQueryBuilder", "entityManager", "componentTypes", "tag", "predicate", "candidates", "indexResult", "entity", "action", "componentType", "hasAny", "__name", "EntityQueryBuilder", "_EntityManager", "IdentifierPool", "ComponentIndexManager", "IndexType", "ArchetypeSystem", "DirtyTrackingSystem", "EventBus", "Entity", "count", "name", "id", "DirtyFlag", "entityOrId", "numId", "entities", "operation", "a", "t", "isAdd", "index", "EntityManager", "_TypeUtils", "obj", "__name", "TypeUtils", "_NumberExtension", "value", "__name", "NumberExtension", "LogType", "ComponentTransform"]
|
|
7
7
|
}
|