@esengine/ecs-framework 2.1.7 → 2.1.9

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/index.js.map CHANGED
@@ -1,7 +1 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/Utils/Emitter.ts", "../src/ECS/CoreEvents.ts", "../src/Utils/GlobalManager.ts", "../src/Utils/Time.ts", "../src/Utils/Timers/Timer.ts", "../src/Utils/Timers/TimerManager.ts", "../src/Utils/PerformanceMonitor.ts", "../src/Utils/Pool.ts", "../src/ECS/Core/ComponentStorage.ts", "../src/ECS/Entity.ts", "../src/ECS/Utils/EntityList.ts", "../src/ECS/Utils/EntityProcessorList.ts", "../src/ECS/Utils/IdentifierPool.ts", "../src/Utils/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
- }
1
+ {"version":3,"file":"index.js","sources":["../bin/Utils/Emitter.js","../bin/ECS/CoreEvents.js","../bin/Utils/GlobalManager.js","../bin/Utils/Time.js","../bin/Utils/Timers/Timer.js","../bin/Utils/Timers/TimerManager.js","../bin/Utils/PerformanceMonitor.js","../bin/Utils/Pool.js","../bin/ECS/Core/ComponentStorage.js","../bin/ECS/Entity.js","../bin/ECS/Utils/EntityList.js","../bin/ECS/Utils/EntityProcessorList.js","../bin/ECS/Utils/IdentifierPool.js","../bin/Utils/Wasm/loader.js","../bin/Utils/Wasm/fallback.js","../bin/Utils/Wasm/core.js","../bin/Utils/Wasm/instance.js","../bin/ECS/Core/ComponentPool.js","../bin/ECS/Core/BitMaskOptimizer.js","../bin/ECS/Core/IndexUpdateBatcher.js","../bin/ECS/Core/ComponentIndex.js","../bin/ECS/Core/DirtyTrackingSystem.js","../bin/ECS/Core/QuerySystem.js","../bin/Types/index.js","../bin/ECS/Core/ArchetypeSystem.js","../bin/ECS/Core/EventSystem.js","../bin/ECS/Scene.js","../bin/ECS/Core/FluentAPI.js","../bin/Core.js","../bin/ECS/Component.js","../bin/ECS/Utils/Bits.js","../bin/ECS/Utils/ComponentTypeManager.js","../bin/ECS/Utils/Matcher.js","../bin/ECS/Systems/EntitySystem.js","../bin/ECS/Systems/ProcessingSystem.js","../bin/ECS/Systems/PassiveSystem.js","../bin/ECS/Systems/IntervalSystem.js","../bin/ECS/Core/EventBus.js","../bin/ECS/Core/EntityManager.js","../bin/Utils/Extensions/TypeUtils.js","../bin/Utils/Extensions/NumberExtension.js"],"sourcesContent":["/**\n * 用于包装事件的一个小类\n */\nexport class FuncPack {\n constructor(func, context) {\n this.func = func;\n this.context = context;\n }\n}\n/**\n * 用于事件管理\n */\nexport class Emitter {\n constructor() {\n this._messageTable = new Map();\n }\n /**\n * 开始监听项\n * @param eventType 监听类型\n * @param handler 监听函数\n * @param context 监听上下文\n */\n addObserver(eventType, handler, context) {\n let list = this._messageTable.get(eventType);\n if (!list) {\n list = [];\n this._messageTable.set(eventType, list);\n }\n if (!this.hasObserver(eventType, handler)) {\n list.push(new FuncPack(handler, context));\n }\n }\n /**\n * 移除监听项\n * @param eventType 事件类型\n * @param handler 事件函数\n */\n removeObserver(eventType, handler) {\n let messageData = this._messageTable.get(eventType);\n if (messageData) {\n let index = messageData.findIndex(data => data.func == handler);\n if (index != -1)\n messageData.splice(index, 1);\n }\n }\n /**\n * 触发该事件\n * @param eventType 事件类型\n * @param data 事件数据\n */\n emit(eventType, ...data) {\n let list = this._messageTable.get(eventType);\n if (list) {\n for (let observer of list) {\n observer.func.call(observer.context, ...data);\n }\n }\n }\n /**\n * 判断是否存在该类型的观察者\n * @param eventType 事件类型\n * @param handler 事件函数\n */\n hasObserver(eventType, handler) {\n let list = this._messageTable.get(eventType);\n return list ? list.some(observer => observer.func === handler) : false;\n }\n}\n//# sourceMappingURL=Emitter.js.map","/**\n * 核心事件枚举\n * 定义框架中的核心事件类型\n */\nexport var CoreEvents;\n(function (CoreEvents) {\n /**\n * 当场景发生变化时触发\n */\n CoreEvents[CoreEvents[\"sceneChanged\"] = 0] = \"sceneChanged\";\n /**\n * 每帧更新事件\n */\n CoreEvents[CoreEvents[\"frameUpdated\"] = 1] = \"frameUpdated\";\n /**\n * 当渲染发生时触发\n */\n CoreEvents[CoreEvents[\"renderChanged\"] = 2] = \"renderChanged\";\n})(CoreEvents || (CoreEvents = {}));\n/**\n * ECS事件类型枚举\n * 定义实体组件系统中的所有事件类型\n */\nexport var ECSEventType;\n(function (ECSEventType) {\n // 实体相关事件\n ECSEventType[\"ENTITY_CREATED\"] = \"entity:created\";\n ECSEventType[\"ENTITY_DESTROYED\"] = \"entity:destroyed\";\n ECSEventType[\"ENTITY_ENABLED\"] = \"entity:enabled\";\n ECSEventType[\"ENTITY_DISABLED\"] = \"entity:disabled\";\n ECSEventType[\"ENTITY_TAG_ADDED\"] = \"entity:tag:added\";\n ECSEventType[\"ENTITY_TAG_REMOVED\"] = \"entity:tag:removed\";\n ECSEventType[\"ENTITY_NAME_CHANGED\"] = \"entity:name:changed\";\n // 组件相关事件\n ECSEventType[\"COMPONENT_ADDED\"] = \"component:added\";\n ECSEventType[\"COMPONENT_REMOVED\"] = \"component:removed\";\n ECSEventType[\"COMPONENT_MODIFIED\"] = \"component:modified\";\n ECSEventType[\"COMPONENT_ENABLED\"] = \"component:enabled\";\n ECSEventType[\"COMPONENT_DISABLED\"] = \"component:disabled\";\n // 系统相关事件\n ECSEventType[\"SYSTEM_ADDED\"] = \"system:added\";\n ECSEventType[\"SYSTEM_REMOVED\"] = \"system:removed\";\n ECSEventType[\"SYSTEM_ENABLED\"] = \"system:enabled\";\n ECSEventType[\"SYSTEM_DISABLED\"] = \"system:disabled\";\n ECSEventType[\"SYSTEM_PROCESSING_START\"] = \"system:processing:start\";\n ECSEventType[\"SYSTEM_PROCESSING_END\"] = \"system:processing:end\";\n ECSEventType[\"SYSTEM_ERROR\"] = \"system:error\";\n // 场景相关事件\n ECSEventType[\"SCENE_CREATED\"] = \"scene:created\";\n ECSEventType[\"SCENE_DESTROYED\"] = \"scene:destroyed\";\n ECSEventType[\"SCENE_ACTIVATED\"] = \"scene:activated\";\n ECSEventType[\"SCENE_DEACTIVATED\"] = \"scene:deactivated\";\n ECSEventType[\"SCENE_PAUSED\"] = \"scene:paused\";\n ECSEventType[\"SCENE_RESUMED\"] = \"scene:resumed\";\n // 查询相关事件\n ECSEventType[\"QUERY_EXECUTED\"] = \"query:executed\";\n ECSEventType[\"QUERY_CACHE_HIT\"] = \"query:cache:hit\";\n ECSEventType[\"QUERY_CACHE_MISS\"] = \"query:cache:miss\";\n ECSEventType[\"QUERY_OPTIMIZED\"] = \"query:optimized\";\n // 性能相关事件\n ECSEventType[\"PERFORMANCE_WARNING\"] = \"performance:warning\";\n ECSEventType[\"PERFORMANCE_CRITICAL\"] = \"performance:critical\";\n ECSEventType[\"MEMORY_USAGE_HIGH\"] = \"memory:usage:high\";\n ECSEventType[\"FRAME_RATE_DROP\"] = \"frame:rate:drop\";\n // 索引相关事件\n ECSEventType[\"INDEX_CREATED\"] = \"index:created\";\n ECSEventType[\"INDEX_UPDATED\"] = \"index:updated\";\n ECSEventType[\"INDEX_OPTIMIZED\"] = \"index:optimized\";\n // Archetype相关事件\n ECSEventType[\"ARCHETYPE_CREATED\"] = \"archetype:created\";\n ECSEventType[\"ARCHETYPE_ENTITY_ADDED\"] = \"archetype:entity:added\";\n ECSEventType[\"ARCHETYPE_ENTITY_REMOVED\"] = \"archetype:entity:removed\";\n // 脏标记相关事件\n ECSEventType[\"DIRTY_MARK_ADDED\"] = \"dirty:mark:added\";\n ECSEventType[\"DIRTY_BATCH_PROCESSED\"] = \"dirty:batch:processed\";\n // 错误和警告事件\n ECSEventType[\"ERROR_OCCURRED\"] = \"error:occurred\";\n ECSEventType[\"WARNING_ISSUED\"] = \"warning:issued\";\n // 生命周期事件\n ECSEventType[\"FRAMEWORK_INITIALIZED\"] = \"framework:initialized\";\n ECSEventType[\"FRAMEWORK_SHUTDOWN\"] = \"framework:shutdown\";\n // 调试相关事件\n ECSEventType[\"DEBUG_INFO\"] = \"debug:info\";\n ECSEventType[\"DEBUG_STATS_UPDATED\"] = \"debug:stats:updated\";\n})(ECSEventType || (ECSEventType = {}));\n/**\n * 事件优先级枚举\n * 定义事件处理的优先级级别\n */\nexport var EventPriority;\n(function (EventPriority) {\n EventPriority[EventPriority[\"LOWEST\"] = 0] = \"LOWEST\";\n EventPriority[EventPriority[\"LOW\"] = 25] = \"LOW\";\n EventPriority[EventPriority[\"NORMAL\"] = 50] = \"NORMAL\";\n EventPriority[EventPriority[\"HIGH\"] = 75] = \"HIGH\";\n EventPriority[EventPriority[\"HIGHEST\"] = 100] = \"HIGHEST\";\n EventPriority[EventPriority[\"CRITICAL\"] = 200] = \"CRITICAL\";\n})(EventPriority || (EventPriority = {}));\n/**\n * 预定义的事件类型常量\n * 提供类型安全的事件类型字符串\n */\nexport const EVENT_TYPES = {\n // 核心事件\n CORE: {\n SCENE_CHANGED: 'core:scene:changed',\n FRAME_UPDATED: 'core:frame:updated',\n RENDER_CHANGED: 'core:render:changed'\n },\n // 实体事件\n ENTITY: {\n CREATED: ECSEventType.ENTITY_CREATED,\n DESTROYED: ECSEventType.ENTITY_DESTROYED,\n ENABLED: ECSEventType.ENTITY_ENABLED,\n DISABLED: ECSEventType.ENTITY_DISABLED,\n TAG_ADDED: ECSEventType.ENTITY_TAG_ADDED,\n TAG_REMOVED: ECSEventType.ENTITY_TAG_REMOVED,\n NAME_CHANGED: ECSEventType.ENTITY_NAME_CHANGED\n },\n // 组件事件\n COMPONENT: {\n ADDED: ECSEventType.COMPONENT_ADDED,\n REMOVED: ECSEventType.COMPONENT_REMOVED,\n MODIFIED: ECSEventType.COMPONENT_MODIFIED,\n ENABLED: ECSEventType.COMPONENT_ENABLED,\n DISABLED: ECSEventType.COMPONENT_DISABLED\n },\n // 系统事件\n SYSTEM: {\n ADDED: ECSEventType.SYSTEM_ADDED,\n REMOVED: ECSEventType.SYSTEM_REMOVED,\n ENABLED: ECSEventType.SYSTEM_ENABLED,\n DISABLED: ECSEventType.SYSTEM_DISABLED,\n PROCESSING_START: ECSEventType.SYSTEM_PROCESSING_START,\n PROCESSING_END: ECSEventType.SYSTEM_PROCESSING_END,\n ERROR: ECSEventType.SYSTEM_ERROR\n },\n // 性能事件\n PERFORMANCE: {\n WARNING: ECSEventType.PERFORMANCE_WARNING,\n CRITICAL: ECSEventType.PERFORMANCE_CRITICAL,\n MEMORY_HIGH: ECSEventType.MEMORY_USAGE_HIGH,\n FRAME_DROP: ECSEventType.FRAME_RATE_DROP\n }\n};\n/**\n * 事件类型验证器\n * 验证事件类型是否有效\n */\nexport class EventTypeValidator {\n /**\n * 验证事件类型是否有效\n * @param eventType 事件类型\n * @returns 是否有效\n */\n static isValid(eventType) {\n return this.validTypes.has(eventType);\n }\n /**\n * 获取所有有效的事件类型\n * @returns 事件类型数组\n */\n static getAllValidTypes() {\n return Array.from(this.validTypes);\n }\n /**\n * 添加自定义事件类型\n * @param eventType 事件类型\n */\n static addCustomType(eventType) {\n this.validTypes.add(eventType);\n }\n /**\n * 移除自定义事件类型\n * @param eventType 事件类型\n */\n static removeCustomType(eventType) {\n this.validTypes.delete(eventType);\n }\n}\nEventTypeValidator.validTypes = new Set([\n ...Object.values(CoreEvents).map(e => e.toString()),\n ...Object.values(ECSEventType),\n ...Object.values(EVENT_TYPES.CORE),\n ...Object.values(EVENT_TYPES.ENTITY),\n ...Object.values(EVENT_TYPES.COMPONENT),\n ...Object.values(EVENT_TYPES.SYSTEM),\n ...Object.values(EVENT_TYPES.PERFORMANCE)\n]);\n//# sourceMappingURL=CoreEvents.js.map","/**\n * 全局管理器的基类。所有全局管理器都应该从此类继承。\n */\nexport class GlobalManager {\n constructor() {\n /**\n * 表示管理器是否启用\n */\n this._enabled = false;\n }\n /**\n * 获取或设置管理器是否启用\n */\n get enabled() {\n return this._enabled;\n }\n set enabled(value) {\n this.setEnabled(value);\n }\n /**\n * 设置管理器是否启用\n * @param isEnabled 如果为true,则启用管理器;否则禁用管理器\n */\n setEnabled(isEnabled) {\n if (this._enabled != isEnabled) {\n this._enabled = isEnabled;\n if (this._enabled) {\n // 如果启用了管理器,则调用onEnabled方法\n this.onEnabled();\n }\n else {\n // 如果禁用了管理器,则调用onDisabled方法\n this.onDisabled();\n }\n }\n }\n /**\n * 在启用管理器时调用的回调方法\n */\n onEnabled() {\n }\n /**\n * 在禁用管理器时调用的回调方法\n */\n onDisabled() {\n }\n /**\n * 更新管理器状态的方法\n */\n update() {\n }\n}\n//# sourceMappingURL=GlobalManager.js.map","/**\n * 时间管理工具类\n * 提供游戏时间相关的功能,包括帧时间、总时间、时间缩放等\n */\nexport class Time {\n /**\n * 更新时间信息\n * @param currentTime 当前时间戳(毫秒)\n */\n static update(currentTime = -1) {\n if (currentTime === -1) {\n currentTime = Date.now();\n }\n if (this._isFirstUpdate) {\n this._lastTime = currentTime;\n this._isFirstUpdate = false;\n return;\n }\n // 计算帧时间间隔(转换为秒)\n this.unscaledDeltaTime = (currentTime - this._lastTime) / 1000;\n this.deltaTime = this.unscaledDeltaTime * this.timeScale;\n // 更新总时间\n this.unscaledTotalTime += this.unscaledDeltaTime;\n this.totalTime += this.deltaTime;\n // 更新帧数\n this.frameCount++;\n // 记录当前时间\n this._lastTime = currentTime;\n }\n /**\n * 场景改变时重置时间\n */\n static sceneChanged() {\n this._isFirstUpdate = true;\n }\n /**\n * 检查指定的时间间隔是否已经过去\n * @param interval 时间间隔(秒)\n * @param lastTime 上次检查的时间\n * @returns 是否已经过去指定时间\n */\n static checkEvery(interval, lastTime) {\n return this.totalTime - lastTime >= interval;\n }\n}\n/**\n * 上一帧到当前帧的时间间隔(秒)\n */\nTime.deltaTime = 0;\n/**\n * 未缩放的帧时间间隔(秒)\n */\nTime.unscaledDeltaTime = 0;\n/**\n * 游戏开始以来的总时间(秒)\n */\nTime.totalTime = 0;\n/**\n * 未缩放的总时间(秒)\n */\nTime.unscaledTotalTime = 0;\n/**\n * 时间缩放比例\n */\nTime.timeScale = 1;\n/**\n * 当前帧数\n */\nTime.frameCount = 0;\n/**\n * 上一帧的时间戳\n */\nTime._lastTime = 0;\n/**\n * 是否为第一次更新\n */\nTime._isFirstUpdate = true;\n//# sourceMappingURL=Time.js.map","import { Time } from '../Time';\n/**\n * 私有类隐藏ITimer的实现\n */\nexport class Timer {\n constructor() {\n this._timeInSeconds = 0;\n this._repeats = false;\n this._isDone = false;\n this._elapsedTime = 0;\n }\n getContext() {\n return this.context;\n }\n reset() {\n this._elapsedTime = 0;\n }\n stop() {\n this._isDone = true;\n }\n tick() {\n // 如果stop在tick之前被调用,那么isDone将为true,我们不应该再做任何事情\n if (!this._isDone && this._elapsedTime > this._timeInSeconds) {\n this._elapsedTime -= this._timeInSeconds;\n this._onTime(this);\n if (!this._isDone && !this._repeats)\n this._isDone = true;\n }\n this._elapsedTime += Time.deltaTime;\n return this._isDone;\n }\n initialize(timeInsSeconds, repeats, context, onTime) {\n this._timeInSeconds = timeInsSeconds;\n this._repeats = repeats;\n this.context = context;\n this._onTime = onTime.bind(context);\n }\n /**\n * 空出对象引用,以便在js需要时GC可以清理它们的引用\n */\n unload() {\n this.context = null;\n this._onTime = null;\n }\n}\n//# sourceMappingURL=Timer.js.map","import { GlobalManager } from '../GlobalManager';\nimport { Timer } from './Timer';\n/**\n * 允许动作的延迟和重复执行\n */\nexport class TimerManager extends GlobalManager {\n constructor() {\n super(...arguments);\n this._timers = [];\n }\n update() {\n for (let i = this._timers.length - 1; i >= 0; i--) {\n if (this._timers[i].tick()) {\n this._timers[i].unload();\n this._timers.splice(i, 1);\n }\n }\n }\n /**\n * 调度一个一次性或重复的计时器,该计时器将调用已传递的动作\n * @param timeInSeconds\n * @param repeats\n * @param context\n * @param onTime\n */\n schedule(timeInSeconds, repeats, context, onTime) {\n let timer = new Timer();\n timer.initialize(timeInSeconds, repeats, context, onTime);\n this._timers.push(timer);\n return timer;\n }\n}\n//# sourceMappingURL=TimerManager.js.map","/**\n * 性能警告类型\n */\nexport var PerformanceWarningType;\n(function (PerformanceWarningType) {\n PerformanceWarningType[\"HIGH_EXECUTION_TIME\"] = \"high_execution_time\";\n PerformanceWarningType[\"HIGH_MEMORY_USAGE\"] = \"high_memory_usage\";\n PerformanceWarningType[\"HIGH_CPU_USAGE\"] = \"high_cpu_usage\";\n PerformanceWarningType[\"FREQUENT_GC\"] = \"frequent_gc\";\n PerformanceWarningType[\"LOW_FPS\"] = \"low_fps\";\n PerformanceWarningType[\"HIGH_ENTITY_COUNT\"] = \"high_entity_count\";\n})(PerformanceWarningType || (PerformanceWarningType = {}));\n/**\n * 高性能监控器\n * 用于监控ECS系统的性能表现,提供详细的分析和优化建议\n */\nexport class PerformanceMonitor {\n /**\n * 获取单例实例\n */\n static get instance() {\n if (!PerformanceMonitor._instance) {\n PerformanceMonitor._instance = new PerformanceMonitor();\n }\n return PerformanceMonitor._instance;\n }\n constructor() {\n this._systemData = new Map();\n this._systemStats = new Map();\n this._warnings = [];\n this._isEnabled = false;\n this._maxRecentSamples = 60; // 保留最近60帧的数据\n this._maxWarnings = 100; // 最大警告数量\n // 性能阈值配置\n this._thresholds = {\n executionTime: { warning: 16.67, critical: 33.33 }, // 60fps和30fps对应的帧时间\n memoryUsage: { warning: 100, critical: 200 }, // MB\n cpuUsage: { warning: 70, critical: 90 }, // 百分比\n fps: { warning: 45, critical: 30 },\n entityCount: { warning: 1000, critical: 5000 }\n };\n // FPS监控\n this._fpsHistory = [];\n this._lastFrameTime = 0;\n this._frameCount = 0;\n this._fpsUpdateInterval = 1000; // 1秒更新一次FPS\n this._lastFpsUpdate = 0;\n this._currentFps = 60;\n // 内存监控\n this._memoryCheckInterval = 5000; // 5秒检查一次内存\n this._lastMemoryCheck = 0;\n this._memoryHistory = [];\n // GC监控\n this._gcCount = 0;\n this._lastGcCheck = 0;\n this._gcCheckInterval = 1000;\n }\n /**\n * 启用性能监控\n */\n enable() {\n this._isEnabled = true;\n }\n /**\n * 禁用性能监控\n */\n disable() {\n this._isEnabled = false;\n }\n /**\n * 检查是否启用了性能监控\n */\n get isEnabled() {\n return this._isEnabled;\n }\n /**\n * 开始监控系统性能\n * @param systemName 系统名称\n * @returns 开始时间戳\n */\n startMonitoring(systemName) {\n if (!this._isEnabled) {\n return 0;\n }\n return performance.now();\n }\n /**\n * 结束监控并记录性能数据\n * @param systemName 系统名称\n * @param startTime 开始时间戳\n * @param entityCount 处理的实体数量\n */\n endMonitoring(systemName, startTime, entityCount = 0) {\n if (!this._isEnabled || startTime === 0) {\n return;\n }\n const endTime = performance.now();\n const executionTime = endTime - startTime;\n const averageTimePerEntity = entityCount > 0 ? executionTime / entityCount : 0;\n // 更新当前性能数据\n const data = {\n name: systemName,\n executionTime,\n entityCount,\n averageTimePerEntity,\n lastUpdateTime: endTime\n };\n this._systemData.set(systemName, data);\n // 更新统计信息\n this.updateStats(systemName, executionTime);\n }\n /**\n * 更新系统统计信息\n * @param systemName 系统名称\n * @param executionTime 执行时间\n */\n updateStats(systemName, executionTime) {\n let stats = this._systemStats.get(systemName);\n if (!stats) {\n stats = {\n totalTime: 0,\n averageTime: 0,\n minTime: Number.MAX_VALUE,\n maxTime: 0,\n executionCount: 0,\n recentTimes: [],\n standardDeviation: 0,\n percentile95: 0,\n percentile99: 0\n };\n this._systemStats.set(systemName, stats);\n }\n // 更新基本统计\n stats.totalTime += executionTime;\n stats.executionCount++;\n stats.averageTime = stats.totalTime / stats.executionCount;\n stats.minTime = Math.min(stats.minTime, executionTime);\n stats.maxTime = Math.max(stats.maxTime, executionTime);\n // 更新最近时间列表\n stats.recentTimes.push(executionTime);\n if (stats.recentTimes.length > this._maxRecentSamples) {\n stats.recentTimes.shift();\n }\n // 计算高级统计信息\n this.calculateAdvancedStats(stats);\n }\n /**\n * 计算高级统计信息\n * @param stats 统计信息对象\n */\n calculateAdvancedStats(stats) {\n if (stats.recentTimes.length === 0)\n return;\n // 计算标准差\n const mean = stats.recentTimes.reduce((a, b) => a + b, 0) / stats.recentTimes.length;\n const variance = stats.recentTimes.reduce((acc, time) => acc + Math.pow(time - mean, 2), 0) / stats.recentTimes.length;\n stats.standardDeviation = Math.sqrt(variance);\n // 计算百分位数\n const sortedTimes = [...stats.recentTimes].sort((a, b) => a - b);\n const len = sortedTimes.length;\n stats.percentile95 = sortedTimes[Math.floor(len * 0.95)] || 0;\n stats.percentile99 = sortedTimes[Math.floor(len * 0.99)] || 0;\n }\n /**\n * 获取系统的当前性能数据\n * @param systemName 系统名称\n * @returns 性能数据或undefined\n */\n getSystemData(systemName) {\n return this._systemData.get(systemName);\n }\n /**\n * 获取系统的统计信息\n * @param systemName 系统名称\n * @returns 统计信息或undefined\n */\n getSystemStats(systemName) {\n return this._systemStats.get(systemName);\n }\n /**\n * 获取所有系统的性能数据\n * @returns 所有系统的性能数据\n */\n getAllSystemData() {\n return new Map(this._systemData);\n }\n /**\n * 获取所有系统的统计信息\n * @returns 所有系统的统计信息\n */\n getAllSystemStats() {\n return new Map(this._systemStats);\n }\n /**\n * 获取性能报告\n * @returns 格式化的性能报告字符串\n */\n getPerformanceReport() {\n if (!this._isEnabled) {\n return \"Performance monitoring is disabled.\";\n }\n const lines = [];\n lines.push(\"=== ECS Performance Report ===\");\n lines.push(\"\");\n // 按平均执行时间排序\n const sortedSystems = Array.from(this._systemStats.entries())\n .sort((a, b) => b[1].averageTime - a[1].averageTime);\n for (const [systemName, stats] of sortedSystems) {\n const data = this._systemData.get(systemName);\n lines.push(`System: ${systemName}`);\n lines.push(` Current: ${data?.executionTime.toFixed(2)}ms (${data?.entityCount} entities)`);\n lines.push(` Average: ${stats.averageTime.toFixed(2)}ms`);\n lines.push(` Min/Max: ${stats.minTime.toFixed(2)}ms / ${stats.maxTime.toFixed(2)}ms`);\n lines.push(` Total: ${stats.totalTime.toFixed(2)}ms (${stats.executionCount} calls)`);\n if (data?.averageTimePerEntity && data.averageTimePerEntity > 0) {\n lines.push(` Per Entity: ${data.averageTimePerEntity.toFixed(4)}ms`);\n }\n lines.push(\"\");\n }\n // 总体统计\n const totalCurrentTime = Array.from(this._systemData.values())\n .reduce((sum, data) => sum + data.executionTime, 0);\n lines.push(`Total Frame Time: ${totalCurrentTime.toFixed(2)}ms`);\n lines.push(`Systems Count: ${this._systemData.size}`);\n return lines.join('\\n');\n }\n /**\n * 重置所有性能数据\n */\n reset() {\n this._systemData.clear();\n this._systemStats.clear();\n }\n /**\n * 重置指定系统的性能数据\n * @param systemName 系统名称\n */\n resetSystem(systemName) {\n this._systemData.delete(systemName);\n this._systemStats.delete(systemName);\n }\n /**\n * 获取性能警告\n * @param thresholdMs 警告阈值(毫秒)\n * @returns 超过阈值的系统列表\n */\n getPerformanceWarnings(thresholdMs = 16.67) {\n const warnings = [];\n for (const [systemName, data] of this._systemData.entries()) {\n if (data.executionTime > thresholdMs) {\n warnings.push(`${systemName}: ${data.executionTime.toFixed(2)}ms (>${thresholdMs}ms)`);\n }\n }\n return warnings;\n }\n /**\n * 设置最大保留样本数\n * @param maxSamples 最大样本数\n */\n setMaxRecentSamples(maxSamples) {\n this._maxRecentSamples = maxSamples;\n // 裁剪现有数据\n for (const stats of this._systemStats.values()) {\n while (stats.recentTimes.length > maxSamples) {\n stats.recentTimes.shift();\n }\n }\n }\n}\n//# sourceMappingURL=PerformanceMonitor.js.map","/**\n * 高性能通用对象池\n * 支持任意类型的对象池化,包含详细的统计信息\n */\nexport class Pool {\n /**\n * 构造函数\n * @param createFn 创建对象的函数\n * @param maxSize 池的最大大小,默认100\n * @param estimatedObjectSize 估算的单个对象大小(字节),默认1024\n */\n constructor(createFn, maxSize = 100, estimatedObjectSize = 1024) {\n this._objects = [];\n this._createFn = createFn;\n this._maxSize = maxSize;\n this._objectSize = estimatedObjectSize;\n this._stats = {\n size: 0,\n maxSize,\n totalCreated: 0,\n totalObtained: 0,\n totalReleased: 0,\n hitRate: 0,\n estimatedMemoryUsage: 0\n };\n }\n /**\n * 获取指定类型的对象池\n * @param type 对象类型\n * @param maxSize 池的最大大小\n * @param estimatedObjectSize 估算的单个对象大小\n * @returns 对象池实例\n */\n static getPool(type, maxSize = 100, estimatedObjectSize = 1024) {\n let pool = this._pools.get(type);\n if (!pool) {\n pool = new Pool(() => new type(), maxSize, estimatedObjectSize);\n this._pools.set(type, pool);\n }\n return pool;\n }\n /**\n * 从池中获取对象\n * @returns 对象实例\n */\n obtain() {\n this._stats.totalObtained++;\n if (this._objects.length > 0) {\n const obj = this._objects.pop();\n this._stats.size--;\n this._updateHitRate();\n this._updateMemoryUsage();\n return obj;\n }\n // 池中没有对象,创建新的\n const obj = this._createFn();\n this._stats.totalCreated++;\n this._updateHitRate();\n return obj;\n }\n /**\n * 将对象归还到池中\n * @param obj 要归还的对象\n */\n free(obj) {\n if (this._objects.length < this._maxSize) {\n obj.reset();\n this._objects.push(obj);\n this._stats.size++;\n this._stats.totalReleased++;\n this._updateMemoryUsage();\n }\n // 如果池已满,对象会被丢弃(由GC回收)\n }\n /**\n * 预热池,创建指定数量的对象\n * @param count 要创建的对象数量\n */\n warmUp(count) {\n const targetSize = Math.min(count, this._maxSize);\n while (this._objects.length < targetSize) {\n const obj = this._createFn();\n this._stats.totalCreated++;\n this._objects.push(obj);\n this._stats.size++;\n }\n this._updateMemoryUsage();\n }\n /**\n * 清空池\n */\n clear() {\n this._objects.length = 0;\n this._stats.size = 0;\n this._updateMemoryUsage();\n }\n /**\n * 获取池中对象数量\n */\n get size() {\n return this._objects.length;\n }\n /**\n * 获取池的最大大小\n */\n get maxSize() {\n return this._maxSize;\n }\n /**\n * 设置池的最大大小\n */\n set maxSize(value) {\n this._maxSize = value;\n this._stats.maxSize = value;\n // 如果当前池大小超过新的最大值,则移除多余的对象\n while (this._objects.length > this._maxSize) {\n this._objects.pop();\n this._stats.size--;\n }\n this._updateMemoryUsage();\n }\n /**\n * 获取池的统计信息\n */\n getStats() {\n return { ...this._stats };\n }\n /**\n * 重置统计信息\n */\n resetStats() {\n this._stats.totalCreated = 0;\n this._stats.totalObtained = 0;\n this._stats.totalReleased = 0;\n this._stats.hitRate = 0;\n }\n /**\n * 更新命中率\n */\n _updateHitRate() {\n if (this._stats.totalObtained > 0) {\n const hits = this._stats.totalObtained - this._stats.totalCreated;\n this._stats.hitRate = hits / this._stats.totalObtained;\n }\n }\n /**\n * 更新内存使用估算\n */\n _updateMemoryUsage() {\n this._stats.estimatedMemoryUsage = this._stats.size * this._objectSize;\n }\n /**\n * 静态方法:从指定类型的池中获取对象\n * @param type 对象类型\n * @returns 对象实例\n */\n static obtain(type) {\n return this.getPool(type).obtain();\n }\n /**\n * 静态方法:将对象归还到对应类型的池中\n * @param type 对象类型\n * @param obj 要归还的对象\n */\n static free(type, obj) {\n this.getPool(type).free(obj);\n }\n /**\n * 静态方法:预热指定类型的池\n * @param type 对象类型\n * @param count 要创建的对象数量\n */\n static warmUp(type, count) {\n this.getPool(type).warmUp(count);\n }\n /**\n * 静态方法:清空指定类型的池\n * @param type 对象类型\n */\n static clearPool(type) {\n const pool = this._pools.get(type);\n if (pool) {\n pool.clear();\n }\n }\n /**\n * 静态方法:清空所有池\n */\n static clearAllPools() {\n for (const pool of this._pools.values()) {\n pool.clear();\n }\n this._pools.clear();\n }\n /**\n * 静态方法:获取池的统计信息\n * @returns 池的统计信息\n */\n static getStats() {\n const stats = {};\n for (const [type, pool] of this._pools.entries()) {\n const typeName = type.name || 'Unknown';\n stats[typeName] = pool.getStats();\n }\n return stats;\n }\n /**\n * 静态方法:获取所有池的总内存使用量\n * @returns 总内存使用量(字节)\n */\n static getTotalMemoryUsage() {\n let total = 0;\n for (const pool of this._pools.values()) {\n total += pool.getStats().estimatedMemoryUsage;\n }\n return total;\n }\n /**\n * 静态方法:获取性能报告\n * @returns 格式化的性能报告\n */\n static getPerformanceReport() {\n const stats = this.getStats();\n const lines = [];\n lines.push('=== Object Pool Performance Report ===');\n lines.push(`Total Memory Usage: ${(this.getTotalMemoryUsage() / 1024 / 1024).toFixed(2)} MB`);\n lines.push('');\n for (const [typeName, stat] of Object.entries(stats)) {\n lines.push(`${typeName}:`);\n lines.push(` Size: ${stat.size}/${stat.maxSize}`);\n lines.push(` Hit Rate: ${(stat.hitRate * 100).toFixed(1)}%`);\n lines.push(` Total Created: ${stat.totalCreated}`);\n lines.push(` Total Obtained: ${stat.totalObtained}`);\n lines.push(` Memory: ${(stat.estimatedMemoryUsage / 1024).toFixed(1)} KB`);\n lines.push('');\n }\n return lines.join('\\n');\n }\n}\nPool._pools = new Map();\n/**\n * 分层对象池\n * 使用多个不同大小的池来优化内存使用\n */\nexport class TieredObjectPool {\n /**\n * 构造函数\n * @param createFn 创建对象的函数\n * @param resetFn 重置对象的函数\n * @param tierSizes 各层级的大小,默认[10, 50, 200]\n * @param estimatedObjectSize 估算的单个对象大小\n */\n constructor(createFn, resetFn, tierSizes = [10, 50, 200], estimatedObjectSize = 1024) {\n this.pools = [];\n this.totalObtained = 0;\n this.totalReleased = 0;\n this.createFn = createFn;\n this.resetFn = resetFn;\n this.tierSizes = tierSizes;\n // 初始化不同层级的池\n for (const size of tierSizes) {\n this.pools.push(new Pool(createFn, size, estimatedObjectSize));\n }\n }\n /**\n * 获取对象\n * @returns 对象实例\n */\n obtain() {\n this.totalObtained++;\n // 从最小的池开始尝试获取\n for (const pool of this.pools) {\n if (pool.size > 0) {\n return pool.obtain();\n }\n }\n // 所有池都空了,创建新对象\n return this.createFn();\n }\n /**\n * 释放对象\n * @param obj 要释放的对象\n */\n release(obj) {\n this.totalReleased++;\n this.resetFn(obj);\n // 放入第一个有空间的池\n for (const pool of this.pools) {\n if (pool.size < pool.maxSize) {\n pool.free(obj);\n return;\n }\n }\n // 所有池都满了,直接丢弃\n }\n /**\n * 预热所有池\n * @param totalCount 总预热数量\n */\n warmUp(totalCount) {\n let remaining = totalCount;\n for (const pool of this.pools) {\n const warmUpCount = Math.min(remaining, pool.maxSize);\n pool.warmUp(warmUpCount);\n remaining -= warmUpCount;\n if (remaining <= 0)\n break;\n }\n }\n /**\n * 清空所有池\n */\n clear() {\n for (const pool of this.pools) {\n pool.clear();\n }\n }\n /**\n * 获取统计信息\n */\n getStats() {\n let totalSize = 0;\n let totalMaxSize = 0;\n let totalMemoryUsage = 0;\n const tierStats = [];\n for (const pool of this.pools) {\n const stats = pool.getStats();\n tierStats.push(stats);\n totalSize += stats.size;\n totalMaxSize += stats.maxSize;\n totalMemoryUsage += stats.estimatedMemoryUsage;\n }\n const hitRate = this.totalObtained > 0 ?\n (this.totalObtained - this.getTotalCreated()) / this.totalObtained : 0;\n return {\n totalSize,\n totalMaxSize,\n totalMemoryUsage,\n tierStats,\n hitRate\n };\n }\n /**\n * 获取总创建数量\n */\n getTotalCreated() {\n return this.pools.reduce((total, pool) => total + pool.getStats().totalCreated, 0);\n }\n}\n/**\n * 池管理器\n * 统一管理所有对象池\n */\nexport class PoolManager {\n constructor() {\n this.pools = new Map();\n this.autoCompactInterval = 60000; // 60秒\n this.lastCompactTime = 0;\n }\n static getInstance() {\n if (!PoolManager.instance) {\n PoolManager.instance = new PoolManager();\n }\n return PoolManager.instance;\n }\n /**\n * 注册池\n * @param name 池名称\n * @param pool 池实例\n */\n registerPool(name, pool) {\n this.pools.set(name, pool);\n }\n /**\n * 获取池\n * @param name 池名称\n * @returns 池实例\n */\n getPool(name) {\n return this.pools.get(name) || null;\n }\n /**\n * 更新池管理器(应在游戏循环中调用)\n */\n update() {\n const now = Date.now();\n if (now - this.lastCompactTime > this.autoCompactInterval) {\n this.compactAllPools();\n this.lastCompactTime = now;\n }\n }\n /**\n * 压缩所有池(清理碎片)\n */\n compactAllPools() {\n // 对于标准池,可以考虑清理一些长时间未使用的对象\n // 这里简单实现为重置统计信息\n for (const pool of this.pools.values()) {\n if (pool instanceof Pool) {\n pool.resetStats();\n }\n }\n }\n /**\n * 获取所有池的统计信息\n */\n getAllStats() {\n const stats = new Map();\n for (const [name, pool] of this.pools.entries()) {\n if (pool instanceof Pool) {\n stats.set(name, pool.getStats());\n }\n else if (pool instanceof TieredObjectPool) {\n stats.set(name, pool.getStats());\n }\n }\n return stats;\n }\n /**\n * 生成性能报告\n */\n generateReport() {\n const lines = [];\n lines.push('=== Pool Manager Report ===');\n let totalMemory = 0;\n for (const [name, pool] of this.pools.entries()) {\n lines.push(`\\n${name}:`);\n if (pool instanceof Pool) {\n const stats = pool.getStats();\n lines.push(` Type: Standard Pool`);\n lines.push(` Size: ${stats.size}/${stats.maxSize}`);\n lines.push(` Hit Rate: ${(stats.hitRate * 100).toFixed(1)}%`);\n lines.push(` Memory: ${(stats.estimatedMemoryUsage / 1024).toFixed(1)} KB`);\n totalMemory += stats.estimatedMemoryUsage;\n }\n else if (pool instanceof TieredObjectPool) {\n const stats = pool.getStats();\n lines.push(` Type: Tiered Pool`);\n lines.push(` Total Size: ${stats.totalSize}/${stats.totalMaxSize}`);\n lines.push(` Hit Rate: ${(stats.hitRate * 100).toFixed(1)}%`);\n lines.push(` Memory: ${(stats.totalMemoryUsage / 1024).toFixed(1)} KB`);\n totalMemory += stats.totalMemoryUsage;\n }\n }\n lines.push(`\\nTotal Memory Usage: ${(totalMemory / 1024 / 1024).toFixed(2)} MB`);\n return lines.join('\\n');\n }\n}\n//# sourceMappingURL=Pool.js.map","/**\n * 组件注册表\n * 管理组件类型的位掩码分配\n */\nexport class ComponentRegistry {\n /**\n * 注册组件类型并分配位掩码\n * @param componentType 组件类型\n * @returns 分配的位索引\n */\n static register(componentType) {\n if (this.componentTypes.has(componentType)) {\n return this.componentTypes.get(componentType);\n }\n if (this.nextBitIndex >= this.maxComponents) {\n throw new Error(`Maximum number of component types (${this.maxComponents}) exceeded`);\n }\n const bitIndex = this.nextBitIndex++;\n this.componentTypes.set(componentType, bitIndex);\n return bitIndex;\n }\n /**\n * 获取组件类型的位掩码\n * @param componentType 组件类型\n * @returns 位掩码\n */\n static getBitMask(componentType) {\n const bitIndex = this.componentTypes.get(componentType);\n if (bitIndex === undefined) {\n throw new Error(`Component type ${componentType.name} is not registered`);\n }\n return BigInt(1) << BigInt(bitIndex);\n }\n /**\n * 获取组件类型的位索引\n * @param componentType 组件类型\n * @returns 位索引\n */\n static getBitIndex(componentType) {\n const bitIndex = this.componentTypes.get(componentType);\n if (bitIndex === undefined) {\n throw new Error(`Component type ${componentType.name} is not registered`);\n }\n return bitIndex;\n }\n /**\n * 检查组件类型是否已注册\n * @param componentType 组件类型\n * @returns 是否已注册\n */\n static isRegistered(componentType) {\n return this.componentTypes.has(componentType);\n }\n /**\n * 获取所有已注册的组件类型\n * @returns 组件类型映射\n */\n static getAllRegisteredTypes() {\n return new Map(this.componentTypes);\n }\n}\nComponentRegistry.componentTypes = new Map();\nComponentRegistry.nextBitIndex = 0;\nComponentRegistry.maxComponents = 64; // 支持最多64种组件类型\n/**\n * 高性能组件存储器\n * 使用SoA(Structure of Arrays)模式存储组件\n */\nexport class ComponentStorage {\n constructor(componentType) {\n this.components = [];\n this.entityToIndex = new Map();\n this.indexToEntity = [];\n this.freeIndices = [];\n this._size = 0;\n this.componentType = componentType;\n // 确保组件类型已注册\n if (!ComponentRegistry.isRegistered(componentType)) {\n ComponentRegistry.register(componentType);\n }\n }\n /**\n * 添加组件\n * @param entityId 实体ID\n * @param component 组件实例\n */\n addComponent(entityId, component) {\n // 检查实体是否已有此组件\n if (this.entityToIndex.has(entityId)) {\n throw new Error(`Entity ${entityId} already has component ${this.componentType.name}`);\n }\n let index;\n if (this.freeIndices.length > 0) {\n // 重用空闲索引\n index = this.freeIndices.pop();\n this.components[index] = component;\n this.indexToEntity[index] = entityId;\n }\n else {\n // 添加到末尾\n index = this.components.length;\n this.components.push(component);\n this.indexToEntity.push(entityId);\n }\n this.entityToIndex.set(entityId, index);\n this._size++;\n }\n /**\n * 获取组件\n * @param entityId 实体ID\n * @returns 组件实例或null\n */\n getComponent(entityId) {\n const index = this.entityToIndex.get(entityId);\n return index !== undefined ? this.components[index] : null;\n }\n /**\n * 检查实体是否有此组件\n * @param entityId 实体ID\n * @returns 是否有组件\n */\n hasComponent(entityId) {\n return this.entityToIndex.has(entityId);\n }\n /**\n * 移除组件\n * @param entityId 实体ID\n * @returns 被移除的组件或null\n */\n removeComponent(entityId) {\n const index = this.entityToIndex.get(entityId);\n if (index === undefined) {\n return null;\n }\n const component = this.components[index];\n this.entityToIndex.delete(entityId);\n this.components[index] = null;\n this.freeIndices.push(index);\n this._size--;\n return component;\n }\n /**\n * 高效遍历所有组件\n * @param callback 回调函数\n */\n forEach(callback) {\n for (let i = 0; i < this.components.length; i++) {\n const component = this.components[i];\n if (component) {\n callback(component, this.indexToEntity[i], i);\n }\n }\n }\n /**\n * 获取所有组件(密集数组)\n * @returns 组件数组\n */\n getDenseArray() {\n const components = [];\n const entityIds = [];\n for (let i = 0; i < this.components.length; i++) {\n const component = this.components[i];\n if (component) {\n components.push(component);\n entityIds.push(this.indexToEntity[i]);\n }\n }\n return { components, entityIds };\n }\n /**\n * 清空所有组件\n */\n clear() {\n this.components.length = 0;\n this.entityToIndex.clear();\n this.indexToEntity.length = 0;\n this.freeIndices.length = 0;\n this._size = 0;\n }\n /**\n * 获取组件数量\n */\n get size() {\n return this._size;\n }\n /**\n * 获取组件类型\n */\n get type() {\n return this.componentType;\n }\n /**\n * 压缩存储(移除空洞)\n */\n compact() {\n if (this.freeIndices.length === 0) {\n return; // 没有空洞,无需压缩\n }\n const newComponents = [];\n const newIndexToEntity = [];\n const newEntityToIndex = new Map();\n let newIndex = 0;\n for (let i = 0; i < this.components.length; i++) {\n const component = this.components[i];\n if (component) {\n newComponents[newIndex] = component;\n newIndexToEntity[newIndex] = this.indexToEntity[i];\n newEntityToIndex.set(this.indexToEntity[i], newIndex);\n newIndex++;\n }\n }\n this.components = newComponents;\n this.indexToEntity = newIndexToEntity;\n this.entityToIndex = newEntityToIndex;\n this.freeIndices.length = 0;\n }\n /**\n * 获取存储统计信息\n */\n getStats() {\n const totalSlots = this.components.length;\n const usedSlots = this._size;\n const freeSlots = this.freeIndices.length;\n const fragmentation = totalSlots > 0 ? freeSlots / totalSlots : 0;\n return {\n totalSlots,\n usedSlots,\n freeSlots,\n fragmentation\n };\n }\n}\n/**\n * 组件存储管理器\n * 管理所有组件类型的存储器\n */\nexport class ComponentStorageManager {\n constructor() {\n this.storages = new Map();\n }\n /**\n * 获取或创建组件存储器\n * @param componentType 组件类型\n * @returns 组件存储器\n */\n getStorage(componentType) {\n let storage = this.storages.get(componentType);\n if (!storage) {\n storage = new ComponentStorage(componentType);\n this.storages.set(componentType, storage);\n }\n return storage;\n }\n /**\n * 添加组件\n * @param entityId 实体ID\n * @param component 组件实例\n */\n addComponent(entityId, component) {\n const componentType = component.constructor;\n const storage = this.getStorage(componentType);\n storage.addComponent(entityId, component);\n }\n /**\n * 获取组件\n * @param entityId 实体ID\n * @param componentType 组件类型\n * @returns 组件实例或null\n */\n getComponent(entityId, componentType) {\n const storage = this.storages.get(componentType);\n return storage ? storage.getComponent(entityId) : null;\n }\n /**\n * 检查实体是否有组件\n * @param entityId 实体ID\n * @param componentType 组件类型\n * @returns 是否有组件\n */\n hasComponent(entityId, componentType) {\n const storage = this.storages.get(componentType);\n return storage ? storage.hasComponent(entityId) : false;\n }\n /**\n * 移除组件\n * @param entityId 实体ID\n * @param componentType 组件类型\n * @returns 被移除的组件或null\n */\n removeComponent(entityId, componentType) {\n const storage = this.storages.get(componentType);\n return storage ? storage.removeComponent(entityId) : null;\n }\n /**\n * 移除实体的所有组件\n * @param entityId 实体ID\n */\n removeAllComponents(entityId) {\n for (const storage of this.storages.values()) {\n storage.removeComponent(entityId);\n }\n }\n /**\n * 获取实体的组件位掩码\n * @param entityId 实体ID\n * @returns 组件位掩码\n */\n getComponentMask(entityId) {\n let mask = BigInt(0);\n for (const [componentType, storage] of this.storages.entries()) {\n if (storage.hasComponent(entityId)) {\n mask |= ComponentRegistry.getBitMask(componentType);\n }\n }\n return mask;\n }\n /**\n * 压缩所有存储器\n */\n compactAll() {\n for (const storage of this.storages.values()) {\n storage.compact();\n }\n }\n /**\n * 获取所有存储器的统计信息\n */\n getAllStats() {\n const stats = new Map();\n for (const [componentType, storage] of this.storages.entries()) {\n const typeName = componentType.name || 'Unknown';\n stats.set(typeName, storage.getStats());\n }\n return stats;\n }\n /**\n * 清空所有存储器\n */\n clear() {\n for (const storage of this.storages.values()) {\n storage.clear();\n }\n this.storages.clear();\n }\n}\n//# sourceMappingURL=ComponentStorage.js.map","import { ComponentRegistry } from './Core/ComponentStorage';\n/**\n * 实体比较器\n *\n * 用于比较两个实体的优先级,首先按更新顺序比较,然后按ID比较。\n */\nexport class EntityComparer {\n /**\n * 比较两个实体\n *\n * @param self - 第一个实体\n * @param other - 第二个实体\n * @returns 比较结果,负数表示self优先级更高,正数表示other优先级更高,0表示相等\n */\n compare(self, other) {\n let compare = self.updateOrder - other.updateOrder;\n if (compare == 0)\n compare = self.id - other.id;\n return compare;\n }\n}\n/**\n * 高性能组件缓存\n */\nclass ComponentCache {\n constructor(config = {\n maxSize: 16,\n ttl: 5000,\n enableLRU: true\n }) {\n this.cache = new Map();\n this.accessOrder = [];\n this.config = config;\n }\n get(type) {\n const entry = this.cache.get(type);\n if (!entry) {\n return null;\n }\n // 检查TTL\n if (Date.now() - entry.lastAccessed > this.config.ttl) {\n this.cache.delete(type);\n this.removeFromAccessOrder(type);\n return null;\n }\n // 更新访问信息\n entry.lastAccessed = Date.now();\n entry.accessCount++;\n // 更新LRU顺序\n if (this.config.enableLRU) {\n this.updateAccessOrder(type);\n }\n return entry.component;\n }\n set(type, component) {\n // 检查缓存大小限制\n if (this.cache.size >= this.config.maxSize && !this.cache.has(type)) {\n this.evictLeastRecentlyUsed();\n }\n const entry = {\n component,\n lastAccessed: Date.now(),\n accessCount: 1\n };\n this.cache.set(type, entry);\n if (this.config.enableLRU) {\n this.updateAccessOrder(type);\n }\n }\n delete(type) {\n const deleted = this.cache.delete(type);\n if (deleted) {\n this.removeFromAccessOrder(type);\n }\n return deleted;\n }\n clear() {\n this.cache.clear();\n this.accessOrder.length = 0;\n }\n has(type) {\n return this.cache.has(type);\n }\n evictLeastRecentlyUsed() {\n if (this.accessOrder.length > 0) {\n const lruType = this.accessOrder[0];\n this.cache.delete(lruType);\n this.accessOrder.shift();\n }\n }\n updateAccessOrder(type) {\n this.removeFromAccessOrder(type);\n this.accessOrder.push(type);\n }\n removeFromAccessOrder(type) {\n const index = this.accessOrder.indexOf(type);\n if (index !== -1) {\n this.accessOrder.splice(index, 1);\n }\n }\n getStats() {\n let totalAccess = 0;\n let totalHits = 0;\n for (const entry of this.cache.values()) {\n totalAccess += entry.accessCount;\n totalHits++;\n }\n return {\n size: this.cache.size,\n maxSize: this.config.maxSize,\n hitRate: totalAccess > 0 ? totalHits / totalAccess : 0,\n averageAccessCount: this.cache.size > 0 ? totalAccess / this.cache.size : 0\n };\n }\n}\n/**\n * 游戏实体类\n *\n * ECS架构中的实体(Entity),作为组件的容器。\n * 实体本身不包含游戏逻辑,所有功能都通过组件来实现。\n * 支持父子关系,可以构建实体层次结构。\n *\n * @example\n * ```typescript\n * // 创建实体\n * const entity = new Entity(\"Player\", 1);\n *\n * // 添加组件\n * const healthComponent = entity.addComponent(new HealthComponent(100));\n *\n * // 获取组件\n * const health = entity.getComponent(HealthComponent);\n *\n * // 设置位置\n * entity.position = new Vector2(100, 200);\n *\n * // 添加子实体\n * const weapon = new Entity(\"Weapon\", 2);\n * entity.addChild(weapon);\n * ```\n */\nexport class Entity {\n /**\n * 构造函数\n *\n * @param name - 实体名称\n * @param id - 实体唯一标识符\n */\n constructor(name, id) {\n /**\n * 组件集合\n *\n * 存储实体拥有的所有组件。\n */\n this.components = [];\n /**\n * 更新间隔\n *\n * 控制实体更新的频率,值越大更新越不频繁。\n */\n this.updateInterval = 1;\n /**\n * 销毁状态标志\n *\n * 标记实体是否已被销毁。\n */\n this._isDestroyed = false;\n /**\n * 父实体引用\n *\n * 指向父级实体,用于构建实体层次结构。\n */\n this._parent = null;\n /**\n * 子实体集合\n *\n * 存储所有子级实体的数组。\n */\n this._children = [];\n /**\n * 激活状态\n *\n * 控制实体是否处于激活状态。\n */\n this._active = true;\n /**\n * 实体标签\n *\n * 用于分类和查询的数字标签。\n */\n this._tag = 0;\n /**\n * 启用状态\n *\n * 控制实体是否启用更新和处理。\n */\n this._enabled = true;\n /**\n * 更新顺序\n *\n * 控制实体在系统中的更新优先级。\n */\n this._updateOrder = 0;\n /**\n * 组件位掩码\n *\n * 用于快速查询实体拥有的组件类型。\n */\n this._componentMask = BigInt(0);\n /**\n * 组件类型到索引的映射\n *\n * 用于快速定位组件在数组中的位置。\n */\n this._componentTypeToIndex = new Map();\n /**\n * 组件访问统计\n *\n * 记录组件访问的性能统计信息。\n */\n this._componentAccessStats = new Map();\n this.name = name;\n this.id = id;\n // 初始化组件缓存\n this._componentCache = new ComponentCache();\n }\n /**\n * 获取销毁状态\n *\n * @returns 如果实体已被销毁则返回true\n */\n get isDestroyed() {\n return this._isDestroyed;\n }\n /**\n * 获取父实体\n *\n * @returns 父实体,如果没有父实体则返回null\n */\n get parent() {\n return this._parent;\n }\n /**\n * 获取子实体数组的只读副本\n *\n * @returns 子实体数组的副本\n */\n get children() {\n return [...this._children];\n }\n /**\n * 获取子实体数量\n *\n * @returns 子实体的数量\n */\n get childCount() {\n return this._children.length;\n }\n /**\n * 获取活跃状态\n *\n * @returns 如果实体处于活跃状态则返回true\n */\n get active() {\n return this._active;\n }\n /**\n * 设置活跃状态\n *\n * 设置实体的活跃状态,会影响子实体的有效活跃状态。\n *\n * @param value - 新的活跃状态\n */\n set active(value) {\n if (this._active !== value) {\n this._active = value;\n this.onActiveChanged();\n }\n }\n /**\n * 获取实体的有效活跃状态\n *\n * 考虑父实体的活跃状态,只有当实体本身和所有父实体都处于活跃状态时才返回true。\n *\n * @returns 有效的活跃状态\n */\n get activeInHierarchy() {\n if (!this._active)\n return false;\n if (this._parent)\n return this._parent.activeInHierarchy;\n return true;\n }\n /**\n * 获取实体标签\n *\n * @returns 实体的数字标签\n */\n get tag() {\n return this._tag;\n }\n /**\n * 设置实体标签\n *\n * @param value - 新的标签值\n */\n set tag(value) {\n this._tag = value;\n }\n /**\n * 获取启用状态\n *\n * @returns 如果实体已启用则返回true\n */\n get enabled() {\n return this._enabled;\n }\n /**\n * 设置启用状态\n *\n * @param value - 新的启用状态\n */\n set enabled(value) {\n this._enabled = value;\n }\n /**\n * 获取更新顺序\n *\n * @returns 实体的更新顺序值\n */\n get updateOrder() {\n return this._updateOrder;\n }\n /**\n * 设置更新顺序\n *\n * @param value - 新的更新顺序值\n */\n set updateOrder(value) {\n this._updateOrder = value;\n }\n /**\n * 获取组件位掩码\n *\n * @returns 实体的组件位掩码\n */\n get componentMask() {\n return this._componentMask;\n }\n /**\n * 创建并添加组件\n *\n * @param componentType - 组件类型\n * @param args - 组件构造函数参数\n * @returns 创建的组件实例\n */\n createComponent(componentType, ...args) {\n const component = new componentType(...args);\n return this.addComponent(component);\n }\n /**\n * 内部添加组件方法(不进行重复检查,用于初始化)\n *\n * @param component - 要添加的组件实例\n * @returns 添加的组件实例\n */\n addComponentInternal(component) {\n const componentType = component.constructor;\n // 注册组件类型(如果尚未注册)\n if (!ComponentRegistry.isRegistered(componentType)) {\n ComponentRegistry.register(componentType);\n }\n // 设置组件的实体引用\n component.entity = this;\n // 添加到组件列表并建立索引映射\n const index = this.components.length;\n this.components.push(component);\n this._componentTypeToIndex.set(componentType, index);\n // 更新位掩码\n this._componentMask |= ComponentRegistry.getBitMask(componentType);\n // 添加到缓存\n this._componentCache.set(componentType, component);\n // 初始化访问统计\n this._componentAccessStats.set(componentType, {\n accessCount: 0,\n lastAccessed: Date.now(),\n cacheHits: 0,\n cacheMisses: 0\n });\n return component;\n }\n /**\n * 添加组件到实体\n *\n * @param component - 要添加的组件实例\n * @returns 添加的组件实例\n * @throws {Error} 如果组件类型已存在\n */\n addComponent(component) {\n const componentType = component.constructor;\n // 检查是否已有此类型的组件\n if (this.hasComponent(componentType)) {\n throw new Error(`Entity ${this.name} already has component ${componentType.name}`);\n }\n // 使用内部方法添加组件\n this.addComponentInternal(component);\n // 如果场景存在且有组件存储管理器,添加到存储器\n if (this.scene && this.scene.componentStorageManager) {\n this.scene.componentStorageManager.addComponent(this.id, component);\n }\n // 调用组件的生命周期方法\n component.onAddedToEntity();\n // 发射组件添加事件\n if (Entity.eventBus) {\n Entity.eventBus.emitComponentAdded({\n timestamp: Date.now(),\n source: 'Entity',\n entityId: this.id,\n entityName: this.name,\n entityTag: this.tag?.toString(),\n componentType: componentType.name,\n component: component\n });\n }\n // 通知场景实体已改变\n if (this.scene && this.scene.entityProcessors) {\n for (const processor of this.scene.entityProcessors.processors) {\n processor.onChanged(this);\n }\n }\n return component;\n }\n /**\n * 获取指定类型的组件\n *\n * @param type - 组件类型\n * @returns 组件实例或null\n */\n getComponent(type) {\n // 更新访问统计\n this.updateComponentAccessStats(type);\n // 首先检查位掩码,快速排除\n if (!ComponentRegistry.isRegistered(type)) {\n this.recordCacheMiss(type);\n return null;\n }\n const mask = ComponentRegistry.getBitMask(type);\n if ((this._componentMask & mask) === BigInt(0)) {\n this.recordCacheMiss(type);\n return null;\n }\n // 尝试从缓存获取(O(1))\n const cachedComponent = this._componentCache.get(type);\n if (cachedComponent) {\n this.recordCacheHit(type);\n return cachedComponent;\n }\n // 尝试从索引映射获取(O(1))\n const index = this._componentTypeToIndex.get(type);\n if (index !== undefined && index < this.components.length) {\n const component = this.components[index];\n if (component && component.constructor === type) {\n // 添加到缓存\n this._componentCache.set(type, component);\n this.recordCacheHit(type);\n return component;\n }\n }\n // 如果场景有组件存储管理器,从存储器获取\n if (this.scene && this.scene.componentStorageManager) {\n const component = this.scene.componentStorageManager.getComponent(this.id, type);\n if (component) {\n // 更新本地缓存和索引\n this._componentCache.set(type, component);\n this.rebuildComponentIndex();\n this.recordCacheHit(type);\n return component;\n }\n }\n // 最后回退到线性搜索并重建索引\n for (let i = 0; i < this.components.length; i++) {\n const component = this.components[i];\n if (component instanceof type) {\n // 重建索引映射\n this._componentTypeToIndex.set(type, i);\n this._componentCache.set(type, component);\n this.recordCacheHit(type);\n return component;\n }\n }\n this.recordCacheMiss(type);\n return null;\n }\n /**\n * 更新组件访问统计\n *\n * @param type - 组件类型\n */\n updateComponentAccessStats(type) {\n let stats = this._componentAccessStats.get(type);\n if (!stats) {\n stats = {\n accessCount: 0,\n lastAccessed: Date.now(),\n cacheHits: 0,\n cacheMisses: 0\n };\n this._componentAccessStats.set(type, stats);\n }\n stats.accessCount++;\n stats.lastAccessed = Date.now();\n }\n /**\n * 记录缓存命中\n *\n * @param type - 组件类型\n */\n recordCacheHit(type) {\n const stats = this._componentAccessStats.get(type);\n if (stats) {\n stats.cacheHits++;\n }\n }\n /**\n * 记录缓存未命中\n *\n * @param type - 组件类型\n */\n recordCacheMiss(type) {\n const stats = this._componentAccessStats.get(type);\n if (stats) {\n stats.cacheMisses++;\n }\n }\n /**\n * 重建组件索引映射\n */\n rebuildComponentIndex() {\n this._componentTypeToIndex.clear();\n for (let i = 0; i < this.components.length; i++) {\n const component = this.components[i];\n const componentType = component.constructor;\n this._componentTypeToIndex.set(componentType, i);\n }\n }\n /**\n * 检查实体是否有指定类型的组件\n *\n * @param type - 组件类型\n * @returns 如果有该组件则返回true\n */\n hasComponent(type) {\n if (!ComponentRegistry.isRegistered(type)) {\n return false;\n }\n const mask = ComponentRegistry.getBitMask(type);\n return (this._componentMask & mask) !== BigInt(0);\n }\n /**\n * 获取或创建指定类型的组件\n *\n * @param type - 组件类型\n * @param args - 组件构造函数参数(仅在创建时使用)\n * @returns 组件实例\n */\n getOrCreateComponent(type, ...args) {\n let component = this.getComponent(type);\n if (!component) {\n component = this.createComponent(type, ...args);\n }\n return component;\n }\n /**\n * 移除指定的组件\n *\n * @param component - 要移除的组件实例\n */\n removeComponent(component) {\n const componentType = component.constructor;\n // 从组件列表中移除\n const index = this.components.indexOf(component);\n if (index !== -1) {\n this.components.splice(index, 1);\n // 重建索引映射(因为数组索引发生了变化)\n this.rebuildComponentIndex();\n }\n // 从缓存中移除\n this._componentCache.delete(componentType);\n // 清除访问统计\n this._componentAccessStats.delete(componentType);\n // 更新位掩码\n if (ComponentRegistry.isRegistered(componentType)) {\n this._componentMask &= ~ComponentRegistry.getBitMask(componentType);\n }\n // 从组件存储管理器中移除\n if (this.scene && this.scene.componentStorageManager) {\n this.scene.componentStorageManager.removeComponent(this.id, componentType);\n }\n // 调用组件的生命周期方法\n component.onRemovedFromEntity();\n // 发射组件移除事件\n if (Entity.eventBus) {\n Entity.eventBus.emitComponentRemoved({\n timestamp: Date.now(),\n source: 'Entity',\n entityId: this.id,\n entityName: this.name,\n entityTag: this.tag?.toString(),\n componentType: componentType.name,\n component: component\n });\n }\n // 清除组件的实体引用\n component.entity = null;\n // 通知场景实体已改变\n if (this.scene && this.scene.entityProcessors) {\n for (const processor of this.scene.entityProcessors.processors) {\n processor.onChanged(this);\n }\n }\n }\n /**\n * 移除指定类型的组件\n *\n * @param type - 组件类型\n * @returns 被移除的组件实例或null\n */\n removeComponentByType(type) {\n const component = this.getComponent(type);\n if (component) {\n this.removeComponent(component);\n return component;\n }\n return null;\n }\n /**\n * 移除所有组件\n */\n removeAllComponents() {\n // 复制组件列表,避免在迭代时修改\n const componentsToRemove = [...this.components];\n // 清空所有缓存和索引\n this._componentCache.clear();\n this._componentTypeToIndex.clear();\n this._componentAccessStats.clear();\n this._componentMask = BigInt(0);\n // 移除组件\n for (const component of componentsToRemove) {\n const componentType = component.constructor;\n // 从组件存储管理器中移除\n if (this.scene && this.scene.componentStorageManager) {\n this.scene.componentStorageManager.removeComponent(this.id, componentType);\n }\n // 调用组件的生命周期方法\n component.onRemovedFromEntity();\n // 清除组件的实体引用\n component.entity = null;\n }\n // 清空组件列表\n this.components.length = 0;\n // 通知场景实体已改变\n if (this.scene && this.scene.entityProcessors) {\n for (const processor of this.scene.entityProcessors.processors) {\n processor.onChanged(this);\n }\n }\n }\n /**\n * 批量添加组件\n *\n * @param components - 要添加的组件数组\n * @returns 添加的组件数组\n */\n addComponents(components) {\n const addedComponents = [];\n for (const component of components) {\n try {\n addedComponents.push(this.addComponent(component));\n }\n catch (error) {\n // 如果某个组件添加失败,继续添加其他组件\n console.warn(`Failed to add component ${component.constructor.name}:`, error);\n }\n }\n return addedComponents;\n }\n /**\n * 批量移除组件类型\n *\n * @param componentTypes - 要移除的组件类型数组\n * @returns 被移除的组件数组\n */\n removeComponentsByTypes(componentTypes) {\n const removedComponents = [];\n for (const componentType of componentTypes) {\n removedComponents.push(this.removeComponentByType(componentType));\n }\n return removedComponents;\n }\n /**\n * 获取组件缓存统计信息\n *\n * @returns 缓存统计信息\n */\n getComponentCacheStats() {\n const accessStats = new Map();\n for (const [componentType, stats] of this._componentAccessStats) {\n const total = stats.cacheHits + stats.cacheMisses;\n accessStats.set(componentType.name, {\n ...stats,\n hitRate: total > 0 ? stats.cacheHits / total : 0\n });\n }\n return {\n cacheStats: this._componentCache.getStats(),\n accessStats,\n indexMappingSize: this._componentTypeToIndex.size,\n totalComponents: this.components.length\n };\n }\n /**\n * 预热组件缓存\n *\n * 将所有组件添加到缓存中,提升后续访问性能\n */\n warmUpComponentCache() {\n for (let i = 0; i < this.components.length; i++) {\n const component = this.components[i];\n const componentType = component.constructor;\n // 更新索引映射\n this._componentTypeToIndex.set(componentType, i);\n // 添加到缓存\n this._componentCache.set(componentType, component);\n }\n }\n /**\n * 清理组件缓存\n *\n * 清除过期的缓存项,释放内存\n */\n cleanupComponentCache() {\n // ComponentCache内部会自动处理TTL过期\n // 这里我们可以强制清理一些不常用的缓存项\n const now = Date.now();\n const cleanupThreshold = 30000; // 30秒未访问的组件从缓存中移除\n for (const [componentType, stats] of this._componentAccessStats) {\n if (now - stats.lastAccessed > cleanupThreshold && stats.accessCount < 5) {\n this._componentCache.delete(componentType);\n }\n }\n }\n /**\n * 获取所有指定类型的组件\n *\n * @param type - 组件类型\n * @returns 组件实例数组\n */\n getComponents(type) {\n const result = [];\n for (const component of this.components) {\n if (component instanceof type) {\n result.push(component);\n }\n }\n return result;\n }\n /**\n * 添加子实体\n *\n * @param child - 要添加的子实体\n * @returns 添加的子实体\n */\n addChild(child) {\n if (child === this) {\n throw new Error(\"Entity cannot be its own child\");\n }\n if (child._parent === this) {\n return child; // 已经是子实体\n }\n // 如果子实体已有父实体,先从原父实体移除\n if (child._parent) {\n child._parent.removeChild(child);\n }\n // 设置父子关系\n child._parent = this;\n this._children.push(child);\n // 如果子实体还没有场景,设置为父实体的场景\n if (!child.scene && this.scene) {\n child.scene = this.scene;\n this.scene.addEntity(child);\n }\n return child;\n }\n /**\n * 移除子实体\n *\n * @param child - 要移除的子实体\n * @returns 是否成功移除\n */\n removeChild(child) {\n const index = this._children.indexOf(child);\n if (index === -1) {\n return false;\n }\n // 移除父子关系\n this._children.splice(index, 1);\n child._parent = null;\n return true;\n }\n /**\n * 移除所有子实体\n */\n removeAllChildren() {\n // 复制子实体列表,避免在迭代时修改\n const childrenToRemove = [...this._children];\n for (const child of childrenToRemove) {\n this.removeChild(child);\n }\n }\n /**\n * 根据名称查找子实体\n *\n * @param name - 子实体名称\n * @param recursive - 是否递归查找\n * @returns 找到的子实体或null\n */\n findChild(name, recursive = false) {\n // 在直接子实体中查找\n for (const child of this._children) {\n if (child.name === name) {\n return child;\n }\n }\n // 递归查找\n if (recursive) {\n for (const child of this._children) {\n const found = child.findChild(name, true);\n if (found) {\n return found;\n }\n }\n }\n return null;\n }\n /**\n * 根据标签查找子实体\n *\n * @param tag - 标签\n * @param recursive - 是否递归查找\n * @returns 找到的子实体数组\n */\n findChildrenByTag(tag, recursive = false) {\n const result = [];\n // 在直接子实体中查找\n for (const child of this._children) {\n if (child.tag === tag) {\n result.push(child);\n }\n }\n // 递归查找\n if (recursive) {\n for (const child of this._children) {\n result.push(...child.findChildrenByTag(tag, true));\n }\n }\n return result;\n }\n /**\n * 获取根实体\n *\n * @returns 层次结构的根实体\n */\n getRoot() {\n let root = this;\n while (root._parent) {\n root = root._parent;\n }\n return root;\n }\n /**\n * 检查是否是指定实体的祖先\n *\n * @param entity - 要检查的实体\n * @returns 如果是祖先则返回true\n */\n isAncestorOf(entity) {\n let current = entity._parent;\n while (current) {\n if (current === this) {\n return true;\n }\n current = current._parent;\n }\n return false;\n }\n /**\n * 检查是否是指定实体的后代\n *\n * @param entity - 要检查的实体\n * @returns 如果是后代则返回true\n */\n isDescendantOf(entity) {\n return entity.isAncestorOf(this);\n }\n /**\n * 获取层次深度\n *\n * @returns 在层次结构中的深度(根实体为0)\n */\n getDepth() {\n let depth = 0;\n let current = this._parent;\n while (current) {\n depth++;\n current = current._parent;\n }\n return depth;\n }\n /**\n * 遍历所有子实体(深度优先)\n *\n * @param callback - 对每个子实体执行的回调函数\n * @param recursive - 是否递归遍历\n */\n forEachChild(callback, recursive = false) {\n this._children.forEach((child, index) => {\n callback(child, index);\n if (recursive) {\n child.forEachChild(callback, true);\n }\n });\n }\n /**\n * 活跃状态改变时的回调\n */\n onActiveChanged() {\n // 通知所有组件活跃状态改变\n for (const component of this.components) {\n if ('onActiveChanged' in component && typeof component.onActiveChanged === 'function') {\n component.onActiveChanged();\n }\n }\n // 通知场景实体状态改变\n if (this.scene && this.scene.eventSystem) {\n this.scene.eventSystem.emitSync('entity:activeChanged', {\n entity: this,\n active: this._active,\n activeInHierarchy: this.activeInHierarchy\n });\n }\n }\n /**\n * 更新实体\n *\n * 调用所有组件的更新方法,并更新子实体。\n */\n update() {\n if (!this.activeInHierarchy || this._isDestroyed) {\n return;\n }\n // 更新所有组件\n for (const component of this.components) {\n if (component.enabled) {\n component.update();\n }\n }\n // 更新所有子实体\n for (const child of this._children) {\n child.update();\n }\n }\n /**\n * 销毁实体\n *\n * 移除所有组件、子实体并标记为已销毁。\n */\n destroy() {\n if (this._isDestroyed) {\n return;\n }\n this._isDestroyed = true;\n // 销毁所有子实体\n const childrenToDestroy = [...this._children];\n for (const child of childrenToDestroy) {\n child.destroy();\n }\n // 从父实体中移除\n if (this._parent) {\n this._parent.removeChild(this);\n }\n // 移除所有组件\n this.removeAllComponents();\n // 从场景中移除\n if (this.scene && this.scene.entities) {\n this.scene.entities.remove(this);\n }\n }\n /**\n * 比较实体\n *\n * @param other - 另一个实体\n * @returns 比较结果\n */\n compareTo(other) {\n return EntityComparer.prototype.compare(this, other);\n }\n /**\n * 获取实体的字符串表示\n *\n * @returns 实体的字符串描述\n */\n toString() {\n return `Entity[${this.name}:${this.id}]`;\n }\n /**\n * 获取实体的调试信息(包含组件缓存信息)\n *\n * @returns 包含实体详细信息的对象\n */\n getDebugInfo() {\n const cacheStats = this.getComponentCacheStats();\n const accessStatsArray = Array.from(cacheStats.accessStats.entries()).map(([type, stats]) => ({\n componentType: type,\n accessCount: stats.accessCount,\n cacheHits: stats.cacheHits,\n cacheMisses: stats.cacheMisses,\n hitRate: stats.hitRate,\n lastAccessed: new Date(stats.lastAccessed).toISOString()\n }));\n return {\n name: this.name,\n id: this.id,\n enabled: this._enabled,\n active: this._active,\n activeInHierarchy: this.activeInHierarchy,\n destroyed: this._isDestroyed,\n componentCount: this.components.length,\n componentTypes: this.components.map(c => c.constructor.name),\n componentMask: this._componentMask.toString(2), // 二进制表示\n parentId: this._parent?.id || null,\n childCount: this._children.length,\n childIds: this._children.map(c => c.id),\n depth: this.getDepth(),\n componentCache: cacheStats.cacheStats,\n componentAccessStats: accessStatsArray,\n indexMappingSize: cacheStats.indexMappingSize\n };\n }\n}\n/**\n * 实体比较器实例\n */\nEntity.entityComparer = new EntityComparer();\n/**\n * 全局事件总线实例\n * 用于发射组件相关事件\n */\nEntity.eventBus = null;\n//# sourceMappingURL=Entity.js.map","/**\n * 高性能实体列表管理器\n * 管理场景中的所有实体,支持快速查找和批量操作\n */\nexport class EntityList {\n get count() {\n return this.buffer.length;\n }\n constructor(scene) {\n this.buffer = [];\n // 索引映射,提升查找性能\n this._idToEntity = new Map();\n this._nameToEntities = new Map();\n // 延迟操作队列\n this._entitiesToAdd = [];\n this._entitiesToRemove = [];\n this._isUpdating = false;\n this._scene = scene;\n }\n /**\n * 添加实体(立即添加或延迟添加)\n * @param entity 要添加的实体\n */\n add(entity) {\n if (this._isUpdating) {\n // 如果正在更新中,延迟添加\n this._entitiesToAdd.push(entity);\n }\n else {\n this.addImmediate(entity);\n }\n }\n /**\n * 立即添加实体\n * @param entity 要添加的实体\n */\n addImmediate(entity) {\n // 检查是否已存在\n if (this._idToEntity.has(entity.id)) {\n return;\n }\n this.buffer.push(entity);\n this._idToEntity.set(entity.id, entity);\n // 更新名称索引\n this.updateNameIndex(entity, true);\n }\n /**\n * 移除实体(立即移除或延迟移除)\n * @param entity 要移除的实体\n */\n remove(entity) {\n if (this._isUpdating) {\n // 如果正在更新中,延迟移除\n this._entitiesToRemove.push(entity);\n }\n else {\n this.removeImmediate(entity);\n }\n }\n /**\n * 立即移除实体\n * @param entity 要移除的实体\n */\n removeImmediate(entity) {\n const index = this.buffer.indexOf(entity);\n if (index !== -1) {\n this.buffer.splice(index, 1);\n this._idToEntity.delete(entity.id);\n // 更新名称索引\n this.updateNameIndex(entity, false);\n }\n }\n /**\n * 移除所有实体\n */\n removeAllEntities() {\n for (let i = this.buffer.length - 1; i >= 0; i--) {\n this.buffer[i].destroy();\n }\n this.buffer.length = 0;\n this._idToEntity.clear();\n this._nameToEntities.clear();\n this._entitiesToAdd.length = 0;\n this._entitiesToRemove.length = 0;\n }\n /**\n * 更新实体列表,处理延迟操作\n */\n updateLists() {\n // 处理延迟添加的实体\n if (this._entitiesToAdd.length > 0) {\n for (const entity of this._entitiesToAdd) {\n this.addImmediate(entity);\n }\n this._entitiesToAdd.length = 0;\n }\n // 处理延迟移除的实体\n if (this._entitiesToRemove.length > 0) {\n for (const entity of this._entitiesToRemove) {\n this.removeImmediate(entity);\n }\n this._entitiesToRemove.length = 0;\n }\n }\n /**\n * 更新所有实体\n */\n update() {\n this._isUpdating = true;\n try {\n for (let i = 0; i < this.buffer.length; i++) {\n const entity = this.buffer[i];\n if (entity.enabled && !entity.isDestroyed) {\n entity.update();\n }\n }\n }\n finally {\n this._isUpdating = false;\n }\n // 处理延迟操作\n this.updateLists();\n }\n /**\n * 根据名称查找实体(使用索引,O(1)复杂度)\n * @param name 实体名称\n * @returns 找到的第一个实体或null\n */\n findEntity(name) {\n const entities = this._nameToEntities.get(name);\n return entities && entities.length > 0 ? entities[0] : null;\n }\n /**\n * 根据名称查找所有实体\n * @param name 实体名称\n * @returns 找到的所有实体数组\n */\n findEntitiesByName(name) {\n return this._nameToEntities.get(name) || [];\n }\n /**\n * 根据ID查找实体(使用索引,O(1)复杂度)\n * @param id 实体ID\n * @returns 找到的实体或null\n */\n findEntityById(id) {\n return this._idToEntity.get(id) || null;\n }\n /**\n * 根据标签查找实体\n * @param tag 标签\n * @returns 找到的所有实体数组\n */\n findEntitiesByTag(tag) {\n const result = [];\n for (const entity of this.buffer) {\n if (entity.tag === tag) {\n result.push(entity);\n }\n }\n return result;\n }\n /**\n * 根据组件类型查找实体\n * @param componentType 组件类型\n * @returns 找到的所有实体数组\n */\n findEntitiesWithComponent(componentType) {\n const result = [];\n for (const entity of this.buffer) {\n if (entity.hasComponent(componentType)) {\n result.push(entity);\n }\n }\n return result;\n }\n /**\n * 批量操作:对所有实体执行指定操作\n * @param action 要执行的操作\n */\n forEach(action) {\n for (const entity of this.buffer) {\n action(entity);\n }\n }\n /**\n * 批量操作:对符合条件的实体执行指定操作\n * @param predicate 筛选条件\n * @param action 要执行的操作\n */\n forEachWhere(predicate, action) {\n for (const entity of this.buffer) {\n if (predicate(entity)) {\n action(entity);\n }\n }\n }\n /**\n * 更新名称索引\n * @param entity 实体\n * @param isAdd 是否为添加操作\n */\n updateNameIndex(entity, isAdd) {\n if (!entity.name) {\n return;\n }\n if (isAdd) {\n let entities = this._nameToEntities.get(entity.name);\n if (!entities) {\n entities = [];\n this._nameToEntities.set(entity.name, entities);\n }\n entities.push(entity);\n }\n else {\n const entities = this._nameToEntities.get(entity.name);\n if (entities) {\n const index = entities.indexOf(entity);\n if (index !== -1) {\n entities.splice(index, 1);\n // 如果数组为空,删除映射\n if (entities.length === 0) {\n this._nameToEntities.delete(entity.name);\n }\n }\n }\n }\n }\n /**\n * 获取实体列表的统计信息\n * @returns 统计信息\n */\n getStats() {\n let activeCount = 0;\n for (const entity of this.buffer) {\n if (entity.enabled && !entity.isDestroyed) {\n activeCount++;\n }\n }\n return {\n totalEntities: this.buffer.length,\n activeEntities: activeCount,\n pendingAdd: this._entitiesToAdd.length,\n pendingRemove: this._entitiesToRemove.length,\n nameIndexSize: this._nameToEntities.size\n };\n }\n}\n//# sourceMappingURL=EntityList.js.map","/**\n * 实体处理器列表管理器\n * 管理场景中的所有实体系统\n */\nexport class EntityProcessorList {\n constructor() {\n this._processors = [];\n this._isDirty = false;\n }\n /**\n * 设置为脏状态,需要重新排序\n */\n setDirty() {\n this._isDirty = true;\n }\n /**\n * 添加实体处理器\n * @param processor 要添加的处理器\n */\n add(processor) {\n this._processors.push(processor);\n this.setDirty();\n }\n /**\n * 移除实体处理器\n * @param processor 要移除的处理器\n */\n remove(processor) {\n const index = this._processors.indexOf(processor);\n if (index !== -1) {\n this._processors.splice(index, 1);\n }\n }\n /**\n * 获取指定类型的处理器\n * @param type 处理器类型\n */\n getProcessor(type) {\n for (const processor of this._processors) {\n if (processor instanceof type) {\n return processor;\n }\n }\n return null;\n }\n /**\n * 开始处理\n */\n begin() {\n this.sortProcessors();\n for (const processor of this._processors) {\n processor.initialize();\n }\n }\n /**\n * 结束处理\n */\n end() {\n // 清理处理器\n }\n /**\n * 更新所有处理器\n */\n update() {\n this.sortProcessors();\n for (const processor of this._processors) {\n processor.update();\n }\n }\n /**\n * 后期更新所有处理器\n */\n lateUpdate() {\n for (const processor of this._processors) {\n processor.lateUpdate();\n }\n }\n /**\n * 排序处理器\n */\n sortProcessors() {\n if (this._isDirty) {\n this._processors.sort((a, b) => a.updateOrder - b.updateOrder);\n this._isDirty = false;\n }\n }\n /** 获取处理器列表 */\n get processors() {\n return this._processors;\n }\n /** 获取处理器数量 */\n get count() {\n return this._processors.length;\n }\n}\n//# sourceMappingURL=EntityProcessorList.js.map","/**\n * ID池管理器\n * 用于管理实体ID的分配和回收\n */\nexport class IdentifierPool {\n constructor() {\n this._nextAvailableId = 0;\n this._ids = [];\n }\n /**\n * 获取一个可用的ID\n */\n checkOut() {\n if (this._ids.length > 0) {\n return this._ids.pop();\n }\n return this._nextAvailableId++;\n }\n /**\n * 回收一个ID\n * @param id 要回收的ID\n */\n checkIn(id) {\n this._ids.push(id);\n }\n}\n//# sourceMappingURL=IdentifierPool.js.map","/**\n * WASM模块加载器\n */\nexport class WasmLoader {\n constructor() {\n this.wasmModule = null;\n this.wasmCore = null;\n this.silent = false;\n }\n setSilent(silent) {\n this.silent = silent;\n }\n async loadWasmModule() {\n try {\n const wasmPath = '../../bin/wasm/ecs_wasm_core';\n this.wasmModule = await import(wasmPath);\n if (this.wasmModule) {\n await this.initializeWasmModule();\n this.wasmCore = new this.wasmModule.EcsCore();\n }\n return true;\n }\n catch (error) {\n if (!this.silent) {\n console.warn('WASM加载失败,使用JavaScript实现');\n }\n return false;\n }\n }\n async initializeWasmModule() {\n if (!this.wasmModule)\n return;\n if (typeof require !== 'undefined') {\n const fs = require('fs');\n const path = require('path');\n const currentDir = path.dirname(__filename);\n const wasmPath = path.resolve(currentDir, '../../bin/wasm/ecs_wasm_core_bg.wasm');\n if (fs.existsSync(wasmPath)) {\n const wasmBytes = fs.readFileSync(wasmPath);\n if (this.wasmModule.initSync) {\n this.wasmModule.initSync(wasmBytes);\n }\n else {\n await this.wasmModule.default({ module_or_path: wasmBytes });\n }\n }\n else {\n throw new Error(`WASM文件不存在: ${wasmPath}`);\n }\n }\n else {\n await this.wasmModule.default();\n }\n }\n getWasmCore() {\n return this.wasmCore;\n }\n getWasmModule() {\n return this.wasmModule;\n }\n cleanup() {\n if (this.wasmCore && this.wasmCore.free) {\n this.wasmCore.free();\n }\n this.wasmCore = null;\n this.wasmModule = null;\n }\n}\n//# sourceMappingURL=loader.js.map","/**\n * JavaScript回退实现\n */\nexport class JavaScriptFallback {\n constructor() {\n this.jsEntityMasks = new Map();\n this.jsNextEntityId = 1;\n this.jsQueryCount = 0;\n this.jsUpdateCount = 0;\n }\n createEntity() {\n const entityId = this.jsNextEntityId++;\n this.jsEntityMasks.set(entityId, 0n);\n return entityId;\n }\n destroyEntity(entityId) {\n return this.jsEntityMasks.delete(entityId);\n }\n updateEntityMask(entityId, mask) {\n this.jsEntityMasks.set(entityId, mask);\n this.jsUpdateCount++;\n }\n batchUpdateMasks(entityIds, masks) {\n for (let i = 0; i < entityIds.length && i < masks.length; i++) {\n this.jsEntityMasks.set(entityIds[i], masks[i]);\n }\n this.jsUpdateCount += Math.min(entityIds.length, masks.length);\n }\n queryEntities(mask, maxResults = 10000) {\n const results = [];\n for (const [entityId, entityMask] of this.jsEntityMasks) {\n if ((entityMask & mask) === mask) {\n results.push(entityId);\n if (results.length >= maxResults)\n break;\n }\n }\n this.jsQueryCount++;\n return {\n entities: new Uint32Array(results),\n count: results.length\n };\n }\n queryCached(mask) {\n return this.queryEntities(mask);\n }\n queryMultipleComponents(masks, maxResults = 10000) {\n const results = [];\n for (const [entityId, entityMask] of this.jsEntityMasks) {\n let matches = false;\n for (const mask of masks) {\n if ((entityMask & mask) === mask) {\n matches = true;\n break;\n }\n }\n if (matches) {\n results.push(entityId);\n if (results.length >= maxResults)\n break;\n }\n }\n this.jsQueryCount++;\n return {\n entities: new Uint32Array(results),\n count: results.length\n };\n }\n queryWithExclusion(includeMask, excludeMask, maxResults = 10000) {\n const results = [];\n for (const [entityId, entityMask] of this.jsEntityMasks) {\n if ((entityMask & includeMask) === includeMask && (entityMask & excludeMask) === 0n) {\n results.push(entityId);\n if (results.length >= maxResults)\n break;\n }\n }\n this.jsQueryCount++;\n return {\n entities: new Uint32Array(results),\n count: results.length\n };\n }\n getEntityMask(entityId) {\n return this.jsEntityMasks.get(entityId) || null;\n }\n entityExists(entityId) {\n return this.jsEntityMasks.has(entityId);\n }\n createComponentMask(componentIds) {\n let mask = 0n;\n for (const id of componentIds) {\n mask |= (1n << BigInt(id));\n }\n return mask;\n }\n maskContainsComponent(mask, componentId) {\n return (mask & (1n << BigInt(componentId))) !== 0n;\n }\n getPerformanceStats() {\n return {\n entityCount: this.jsEntityMasks.size,\n indexCount: 0,\n queryCount: this.jsQueryCount,\n updateCount: this.jsUpdateCount,\n wasmEnabled: false\n };\n }\n clear() {\n this.jsEntityMasks.clear();\n this.jsNextEntityId = 1;\n this.jsQueryCount = 0;\n this.jsUpdateCount = 0;\n }\n getEntityCount() {\n return this.jsEntityMasks.size;\n }\n}\n//# sourceMappingURL=fallback.js.map","/**\n * WASM ECS核心模块\n */\nimport { WasmLoader } from './loader';\nimport { JavaScriptFallback } from './fallback';\nexport class WasmEcsCore {\n constructor() {\n this.initialized = false;\n this.usingWasm = false;\n this.wasmLoader = new WasmLoader();\n this.jsFallback = new JavaScriptFallback();\n }\n setSilent(silent) {\n this.wasmLoader.setSilent(silent);\n }\n async initialize() {\n if (this.initialized)\n return true;\n console.log('🔄 初始化ECS核心...');\n this.usingWasm = await this.wasmLoader.loadWasmModule();\n this.initialized = true;\n return true;\n }\n createEntity() {\n this.ensureInitialized();\n if (this.usingWasm) {\n const wasmCore = this.wasmLoader.getWasmCore();\n return wasmCore ? wasmCore.create_entity() : this.jsFallback.createEntity();\n }\n return this.jsFallback.createEntity();\n }\n destroyEntity(entityId) {\n this.ensureInitialized();\n if (this.usingWasm) {\n const wasmCore = this.wasmLoader.getWasmCore();\n return wasmCore ? wasmCore.destroy_entity(entityId) : this.jsFallback.destroyEntity(entityId);\n }\n return this.jsFallback.destroyEntity(entityId);\n }\n updateEntityMask(entityId, mask) {\n this.ensureInitialized();\n if (this.usingWasm) {\n const wasmCore = this.wasmLoader.getWasmCore();\n if (wasmCore) {\n wasmCore.update_entity_mask(entityId, mask);\n }\n else {\n this.jsFallback.updateEntityMask(entityId, mask);\n }\n }\n else {\n this.jsFallback.updateEntityMask(entityId, mask);\n }\n }\n batchUpdateMasks(entityIds, masks) {\n this.ensureInitialized();\n if (this.usingWasm) {\n const wasmCore = this.wasmLoader.getWasmCore();\n if (wasmCore) {\n const entityIdArray = new Uint32Array(entityIds);\n const maskArray = new BigUint64Array(masks);\n wasmCore.batch_update_masks(entityIdArray, maskArray);\n }\n else {\n this.jsFallback.batchUpdateMasks(entityIds, masks);\n }\n }\n else {\n this.jsFallback.batchUpdateMasks(entityIds, masks);\n }\n }\n queryEntities(mask, maxResults = 10000) {\n this.ensureInitialized();\n if (this.usingWasm) {\n const wasmCore = this.wasmLoader.getWasmCore();\n if (wasmCore) {\n const resultPtr = wasmCore.query_entities(mask, maxResults);\n const count = wasmCore.get_query_result_count();\n const wasmModule = this.wasmLoader.getWasmModule();\n if (wasmModule && wasmModule.memory) {\n const memory = new Uint32Array(wasmModule.memory.buffer);\n const entities = new Uint32Array(count);\n for (let i = 0; i < count; i++) {\n entities[i] = memory[resultPtr / 4 + i];\n }\n return { entities, count };\n }\n }\n }\n return this.jsFallback.queryEntities(mask, maxResults);\n }\n queryCached(mask) {\n this.ensureInitialized();\n if (this.usingWasm) {\n const wasmCore = this.wasmLoader.getWasmCore();\n if (wasmCore) {\n const resultPtr = wasmCore.query_cached(mask);\n const count = wasmCore.get_cached_query_count(mask);\n const wasmModule = this.wasmLoader.getWasmModule();\n if (wasmModule && wasmModule.memory) {\n const memory = new Uint32Array(wasmModule.memory.buffer);\n const entities = new Uint32Array(count);\n for (let i = 0; i < count; i++) {\n entities[i] = memory[resultPtr / 4 + i];\n }\n return { entities, count };\n }\n }\n }\n return this.jsFallback.queryCached(mask);\n }\n queryMultipleComponents(masks, maxResults = 10000) {\n this.ensureInitialized();\n if (this.usingWasm) {\n const wasmCore = this.wasmLoader.getWasmCore();\n if (wasmCore) {\n const maskArray = new BigUint64Array(masks);\n const resultPtr = wasmCore.query_multiple_components(maskArray, maxResults);\n const count = wasmCore.get_query_result_count();\n const wasmModule = this.wasmLoader.getWasmModule();\n if (wasmModule && wasmModule.memory) {\n const memory = new Uint32Array(wasmModule.memory.buffer);\n const entities = new Uint32Array(count);\n for (let i = 0; i < count; i++) {\n entities[i] = memory[resultPtr / 4 + i];\n }\n return { entities, count };\n }\n }\n }\n return this.jsFallback.queryMultipleComponents(masks, maxResults);\n }\n queryWithExclusion(includeMask, excludeMask, maxResults = 10000) {\n this.ensureInitialized();\n if (this.usingWasm) {\n const wasmCore = this.wasmLoader.getWasmCore();\n if (wasmCore) {\n const resultPtr = wasmCore.query_with_exclusion(includeMask, excludeMask, maxResults);\n const count = wasmCore.get_query_result_count();\n const wasmModule = this.wasmLoader.getWasmModule();\n if (wasmModule && wasmModule.memory) {\n const memory = new Uint32Array(wasmModule.memory.buffer);\n const entities = new Uint32Array(count);\n for (let i = 0; i < count; i++) {\n entities[i] = memory[resultPtr / 4 + i];\n }\n return { entities, count };\n }\n }\n }\n return this.jsFallback.queryWithExclusion(includeMask, excludeMask, maxResults);\n }\n getEntityMask(entityId) {\n this.ensureInitialized();\n if (this.usingWasm) {\n const wasmCore = this.wasmLoader.getWasmCore();\n if (wasmCore) {\n return wasmCore.get_entity_mask(entityId);\n }\n }\n return this.jsFallback.getEntityMask(entityId);\n }\n entityExists(entityId) {\n this.ensureInitialized();\n if (this.usingWasm) {\n const wasmCore = this.wasmLoader.getWasmCore();\n if (wasmCore) {\n return wasmCore.entity_exists(entityId);\n }\n }\n return this.jsFallback.entityExists(entityId);\n }\n createComponentMask(componentIds) {\n this.ensureInitialized();\n if (this.usingWasm) {\n const wasmModule = this.wasmLoader.getWasmModule();\n if (wasmModule) {\n const componentIdArray = new Uint32Array(componentIds);\n return wasmModule.create_component_mask(componentIdArray);\n }\n }\n return this.jsFallback.createComponentMask(componentIds);\n }\n maskContainsComponent(mask, componentId) {\n this.ensureInitialized();\n if (this.usingWasm) {\n const wasmModule = this.wasmLoader.getWasmModule();\n if (wasmModule) {\n return wasmModule.mask_contains_component(mask, componentId);\n }\n }\n return this.jsFallback.maskContainsComponent(mask, componentId);\n }\n getPerformanceStats() {\n this.ensureInitialized();\n if (this.usingWasm) {\n const wasmCore = this.wasmLoader.getWasmCore();\n if (wasmCore) {\n const stats = wasmCore.get_performance_stats();\n return {\n entityCount: stats[0] || 0,\n indexCount: stats[1] || 0,\n queryCount: stats[2] || 0,\n updateCount: stats[3] || 0,\n wasmEnabled: true\n };\n }\n }\n return this.jsFallback.getPerformanceStats();\n }\n clear() {\n this.ensureInitialized();\n if (this.usingWasm) {\n const wasmCore = this.wasmLoader.getWasmCore();\n if (wasmCore) {\n wasmCore.clear();\n }\n }\n this.jsFallback.clear();\n }\n isUsingWasm() {\n return this.usingWasm;\n }\n isInitialized() {\n return this.initialized;\n }\n ensureInitialized() {\n if (!this.initialized) {\n throw new Error('ECS核心未初始化,请先调用 initialize() 方法');\n }\n }\n cleanup() {\n this.wasmLoader.cleanup();\n this.jsFallback.clear();\n this.initialized = false;\n this.usingWasm = false;\n }\n}\n//# sourceMappingURL=core.js.map","/**\n * WASM ECS核心全局实例\n */\nimport { WasmEcsCore } from './core';\nexport const ecsCore = new WasmEcsCore();\nexport async function initializeEcs(silent = false) {\n ecsCore.setSilent(silent);\n return await ecsCore.initialize();\n}\n//# sourceMappingURL=instance.js.map","/**\n * 组件对象池,用于复用组件实例以减少内存分配\n */\nexport class ComponentPool {\n constructor(createFn, resetFn, maxSize = 1000) {\n this.pool = [];\n this.createFn = createFn;\n this.resetFn = resetFn;\n this.maxSize = maxSize;\n }\n /**\n * 获取一个组件实例\n */\n acquire() {\n if (this.pool.length > 0) {\n return this.pool.pop();\n }\n return this.createFn();\n }\n /**\n * 释放一个组件实例回池中\n */\n release(component) {\n if (this.pool.length < this.maxSize) {\n if (this.resetFn) {\n this.resetFn(component);\n }\n this.pool.push(component);\n }\n }\n /**\n * 预填充对象池\n */\n prewarm(count) {\n for (let i = 0; i < count && this.pool.length < this.maxSize; i++) {\n this.pool.push(this.createFn());\n }\n }\n /**\n * 清空对象池\n */\n clear() {\n this.pool.length = 0;\n }\n /**\n * 获取池中可用对象数量\n */\n getAvailableCount() {\n return this.pool.length;\n }\n /**\n * 获取池的最大容量\n */\n getMaxSize() {\n return this.maxSize;\n }\n}\n/**\n * 全局组件池管理器\n */\nexport class ComponentPoolManager {\n constructor() {\n this.pools = new Map();\n }\n static getInstance() {\n if (!ComponentPoolManager.instance) {\n ComponentPoolManager.instance = new ComponentPoolManager();\n }\n return ComponentPoolManager.instance;\n }\n /**\n * 注册组件池\n */\n registerPool(componentName, createFn, resetFn, maxSize) {\n this.pools.set(componentName, new ComponentPool(createFn, resetFn, maxSize));\n }\n /**\n * 获取组件实例\n */\n acquireComponent(componentName) {\n const pool = this.pools.get(componentName);\n return pool ? pool.acquire() : null;\n }\n /**\n * 释放组件实例\n */\n releaseComponent(componentName, component) {\n const pool = this.pools.get(componentName);\n if (pool) {\n pool.release(component);\n }\n }\n /**\n * 预热所有池\n */\n prewarmAll(count = 100) {\n for (const pool of this.pools.values()) {\n pool.prewarm(count);\n }\n }\n /**\n * 清空所有池\n */\n clearAll() {\n for (const pool of this.pools.values()) {\n pool.clear();\n }\n }\n /**\n * 获取池统计信息\n */\n getPoolStats() {\n const stats = new Map();\n for (const [name, pool] of this.pools) {\n stats.set(name, {\n available: pool.getAvailableCount(),\n maxSize: pool.getMaxSize()\n });\n }\n return stats;\n }\n}\n//# sourceMappingURL=ComponentPool.js.map","/**\n * 位掩码优化器,用于预计算和缓存常用的组件掩码\n */\nexport class BitMaskOptimizer {\n constructor() {\n this.maskCache = new Map();\n this.componentTypeMap = new Map();\n this.nextComponentId = 0;\n }\n static getInstance() {\n if (!BitMaskOptimizer.instance) {\n BitMaskOptimizer.instance = new BitMaskOptimizer();\n }\n return BitMaskOptimizer.instance;\n }\n /**\n * 注册组件类型\n */\n registerComponentType(componentName) {\n if (!this.componentTypeMap.has(componentName)) {\n this.componentTypeMap.set(componentName, this.nextComponentId++);\n }\n return this.componentTypeMap.get(componentName);\n }\n /**\n * 获取组件类型ID\n */\n getComponentTypeId(componentName) {\n return this.componentTypeMap.get(componentName);\n }\n /**\n * 创建单个组件的掩码\n */\n createSingleComponentMask(componentName) {\n const cacheKey = `single:${componentName}`;\n if (this.maskCache.has(cacheKey)) {\n return this.maskCache.get(cacheKey);\n }\n const componentId = this.getComponentTypeId(componentName);\n if (componentId === undefined) {\n throw new Error(`Component type not registered: ${componentName}`);\n }\n const mask = 1n << BigInt(componentId);\n this.maskCache.set(cacheKey, mask);\n return mask;\n }\n /**\n * 创建多个组件的组合掩码\n */\n createCombinedMask(componentNames) {\n const sortedNames = [...componentNames].sort();\n const cacheKey = `combined:${sortedNames.join(',')}`;\n if (this.maskCache.has(cacheKey)) {\n return this.maskCache.get(cacheKey);\n }\n let mask = 0n;\n for (const componentName of componentNames) {\n const componentId = this.getComponentTypeId(componentName);\n if (componentId === undefined) {\n throw new Error(`Component type not registered: ${componentName}`);\n }\n mask |= 1n << BigInt(componentId);\n }\n this.maskCache.set(cacheKey, mask);\n return mask;\n }\n /**\n * 检查掩码是否包含指定组件\n */\n maskContainsComponent(mask, componentName) {\n const componentMask = this.createSingleComponentMask(componentName);\n return (mask & componentMask) !== 0n;\n }\n /**\n * 检查掩码是否包含所有指定组件\n */\n maskContainsAllComponents(mask, componentNames) {\n const requiredMask = this.createCombinedMask(componentNames);\n return (mask & requiredMask) === requiredMask;\n }\n /**\n * 检查掩码是否包含任一指定组件\n */\n maskContainsAnyComponent(mask, componentNames) {\n const anyMask = this.createCombinedMask(componentNames);\n return (mask & anyMask) !== 0n;\n }\n /**\n * 添加组件到掩码\n */\n addComponentToMask(mask, componentName) {\n const componentMask = this.createSingleComponentMask(componentName);\n return mask | componentMask;\n }\n /**\n * 从掩码中移除组件\n */\n removeComponentFromMask(mask, componentName) {\n const componentMask = this.createSingleComponentMask(componentName);\n return mask & ~componentMask;\n }\n /**\n * 预计算常用掩码组合\n */\n precomputeCommonMasks(commonCombinations) {\n for (const combination of commonCombinations) {\n this.createCombinedMask(combination);\n }\n }\n /**\n * 获取掩码缓存统计信息\n */\n getCacheStats() {\n return {\n size: this.maskCache.size,\n componentTypes: this.componentTypeMap.size\n };\n }\n /**\n * 清空缓存\n */\n clearCache() {\n this.maskCache.clear();\n }\n /**\n * 重置优化器\n */\n reset() {\n this.maskCache.clear();\n this.componentTypeMap.clear();\n this.nextComponentId = 0;\n }\n /**\n * 将掩码转换为组件名称数组\n */\n maskToComponentNames(mask) {\n const componentNames = [];\n for (const [componentName, componentId] of this.componentTypeMap) {\n const componentMask = 1n << BigInt(componentId);\n if ((mask & componentMask) !== 0n) {\n componentNames.push(componentName);\n }\n }\n return componentNames;\n }\n /**\n * 获取掩码中组件的数量\n */\n getComponentCount(mask) {\n let count = 0;\n let tempMask = mask;\n while (tempMask !== 0n) {\n if ((tempMask & 1n) !== 0n) {\n count++;\n }\n tempMask >>= 1n;\n }\n return count;\n }\n}\n//# sourceMappingURL=BitMaskOptimizer.js.map","/**\n * 索引更新操作类型\n */\nexport var IndexUpdateType;\n(function (IndexUpdateType) {\n IndexUpdateType[\"ADD_ENTITY\"] = \"add_entity\";\n IndexUpdateType[\"REMOVE_ENTITY\"] = \"remove_entity\";\n IndexUpdateType[\"UPDATE_ENTITY\"] = \"update_entity\";\n})(IndexUpdateType || (IndexUpdateType = {}));\n/**\n * 延迟索引更新器,用于批量更新查询索引以提高性能\n */\nexport class IndexUpdateBatcher {\n constructor() {\n this.pendingOperations = [];\n this.isProcessing = false;\n this.batchSize = 1000;\n this.flushTimeout = null;\n this.flushDelay = 16; // 16ms,约60fps\n }\n /**\n * 添加索引更新操作\n */\n addOperation(operation) {\n this.pendingOperations.push(operation);\n // 如果达到批量大小,立即处理\n if (this.pendingOperations.length >= this.batchSize) {\n this.flush();\n }\n else {\n // 否则延迟处理\n this.scheduleFlush();\n }\n }\n /**\n * 批量添加实体\n */\n addEntities(entities) {\n for (const entity of entities) {\n this.pendingOperations.push({\n type: IndexUpdateType.ADD_ENTITY,\n entity\n });\n }\n if (this.pendingOperations.length >= this.batchSize) {\n this.flush();\n }\n else {\n this.scheduleFlush();\n }\n }\n /**\n * 批量移除实体\n */\n removeEntities(entities) {\n for (const entity of entities) {\n this.pendingOperations.push({\n type: IndexUpdateType.REMOVE_ENTITY,\n entity\n });\n }\n if (this.pendingOperations.length >= this.batchSize) {\n this.flush();\n }\n else {\n this.scheduleFlush();\n }\n }\n /**\n * 批量更新实体\n */\n updateEntities(updates) {\n for (const update of updates) {\n this.pendingOperations.push({\n type: IndexUpdateType.UPDATE_ENTITY,\n entity: update.entity,\n oldMask: update.oldMask,\n newMask: update.newMask\n });\n }\n if (this.pendingOperations.length >= this.batchSize) {\n this.flush();\n }\n else {\n this.scheduleFlush();\n }\n }\n /**\n * 安排延迟刷新\n */\n scheduleFlush() {\n if (this.flushTimeout) {\n return;\n }\n this.flushTimeout = setTimeout(() => {\n this.flush();\n }, this.flushDelay);\n }\n /**\n * 立即处理所有待处理的操作\n */\n flush() {\n if (this.isProcessing || this.pendingOperations.length === 0) {\n return;\n }\n this.isProcessing = true;\n if (this.flushTimeout) {\n clearTimeout(this.flushTimeout);\n this.flushTimeout = null;\n }\n try {\n this.processBatch();\n }\n finally {\n this.isProcessing = false;\n }\n }\n /**\n * 处理批量操作\n */\n processBatch() {\n const operations = this.pendingOperations;\n this.pendingOperations = [];\n // 按操作类型分组以优化处理\n const addOperations = [];\n const removeOperations = [];\n const updateOperations = [];\n for (const operation of operations) {\n switch (operation.type) {\n case IndexUpdateType.ADD_ENTITY:\n addOperations.push(operation.entity);\n break;\n case IndexUpdateType.REMOVE_ENTITY:\n removeOperations.push(operation.entity);\n break;\n case IndexUpdateType.UPDATE_ENTITY:\n if (operation.oldMask !== undefined && operation.newMask !== undefined) {\n updateOperations.push({\n entity: operation.entity,\n oldMask: operation.oldMask,\n newMask: operation.newMask\n });\n }\n break;\n }\n }\n // 批量处理每种类型的操作\n if (addOperations.length > 0) {\n this.processBatchAdd(addOperations);\n }\n if (removeOperations.length > 0) {\n this.processBatchRemove(removeOperations);\n }\n if (updateOperations.length > 0) {\n this.processBatchUpdate(updateOperations);\n }\n }\n /**\n * 批量处理添加操作\n */\n processBatchAdd(entities) {\n // 这里应该调用QuerySystem的批量添加方法\n // 由于需要访问QuerySystem,这个方法应该由外部注入处理函数\n if (this.onBatchAdd) {\n this.onBatchAdd(entities);\n }\n }\n /**\n * 批量处理移除操作\n */\n processBatchRemove(entities) {\n if (this.onBatchRemove) {\n this.onBatchRemove(entities);\n }\n }\n /**\n * 批量处理更新操作\n */\n processBatchUpdate(updates) {\n if (this.onBatchUpdate) {\n this.onBatchUpdate(updates);\n }\n }\n /**\n * 设置批量大小\n */\n setBatchSize(size) {\n this.batchSize = Math.max(1, size);\n }\n /**\n * 设置刷新延迟\n */\n setFlushDelay(delay) {\n this.flushDelay = Math.max(0, delay);\n }\n /**\n * 获取待处理操作数量\n */\n getPendingCount() {\n return this.pendingOperations.length;\n }\n /**\n * 清空所有待处理操作\n */\n clear() {\n this.pendingOperations.length = 0;\n if (this.flushTimeout) {\n clearTimeout(this.flushTimeout);\n this.flushTimeout = null;\n }\n }\n /**\n * 检查是否有待处理操作\n */\n hasPendingOperations() {\n return this.pendingOperations.length > 0;\n }\n}\n//# sourceMappingURL=IndexUpdateBatcher.js.map","/**\n * 组件索引类型\n */\nexport var IndexType;\n(function (IndexType) {\n /** 哈希索引 - 最快查找 */\n IndexType[\"HASH\"] = \"hash\";\n /** 位图索引 - 内存高效 */\n IndexType[\"BITMAP\"] = \"bitmap\";\n /** 排序索引 - 支持范围查询 */\n IndexType[\"SORTED\"] = \"sorted\";\n})(IndexType || (IndexType = {}));\n/**\n * 哈希索引实现\n *\n * 使用Map数据结构,提供O(1)的查找性能。\n * 适合大多数查询场景。\n */\nexport class HashComponentIndex {\n constructor() {\n this.type = IndexType.HASH;\n this._componentToEntities = new Map();\n this._entityToComponents = new Map();\n this._queryCount = 0;\n this._totalQueryTime = 0;\n this._lastUpdated = Date.now();\n }\n addEntity(entity) {\n const components = entity.components;\n const componentTypes = new Set();\n for (const component of components) {\n const componentType = component.constructor;\n componentTypes.add(componentType);\n let entities = this._componentToEntities.get(componentType);\n if (!entities) {\n entities = new Set();\n this._componentToEntities.set(componentType, entities);\n }\n entities.add(entity);\n }\n this._entityToComponents.set(entity, componentTypes);\n this._lastUpdated = Date.now();\n }\n removeEntity(entity) {\n const componentTypes = this._entityToComponents.get(entity);\n if (!componentTypes)\n return;\n for (const componentType of componentTypes) {\n const entities = this._componentToEntities.get(componentType);\n if (entities) {\n entities.delete(entity);\n if (entities.size === 0) {\n this._componentToEntities.delete(componentType);\n }\n }\n }\n this._entityToComponents.delete(entity);\n this._lastUpdated = Date.now();\n }\n query(componentType) {\n const startTime = performance.now();\n const result = new Set(this._componentToEntities.get(componentType) || []);\n this._queryCount++;\n this._totalQueryTime += performance.now() - startTime;\n return result;\n }\n queryMultiple(componentTypes, operation) {\n const startTime = performance.now();\n if (componentTypes.length === 0) {\n return new Set();\n }\n if (componentTypes.length === 1) {\n return this.query(componentTypes[0]);\n }\n let result;\n if (operation === 'AND') {\n let smallestSet;\n let smallestSize = Infinity;\n for (const componentType of componentTypes) {\n const entities = this._componentToEntities.get(componentType);\n if (!entities || entities.size === 0) {\n this._queryCount++;\n this._totalQueryTime += performance.now() - startTime;\n return new Set();\n }\n if (entities.size < smallestSize) {\n smallestSize = entities.size;\n smallestSet = entities;\n }\n }\n result = new Set();\n if (smallestSet) {\n for (const entity of smallestSet) {\n let hasAll = true;\n for (const componentType of componentTypes) {\n const entities = this._componentToEntities.get(componentType);\n if (!entities || !entities.has(entity)) {\n hasAll = false;\n break;\n }\n }\n if (hasAll) {\n result.add(entity);\n }\n }\n }\n }\n else {\n result = new Set();\n for (const componentType of componentTypes) {\n const entities = this._componentToEntities.get(componentType);\n if (entities) {\n for (const entity of entities) {\n result.add(entity);\n }\n }\n }\n }\n this._queryCount++;\n this._totalQueryTime += performance.now() - startTime;\n return result;\n }\n clear() {\n this._componentToEntities.clear();\n this._entityToComponents.clear();\n this._lastUpdated = Date.now();\n }\n getStats() {\n let memoryUsage = 0;\n memoryUsage += this._componentToEntities.size * 64;\n memoryUsage += this._entityToComponents.size * 64;\n for (const entities of this._componentToEntities.values()) {\n memoryUsage += entities.size * 8;\n }\n for (const components of this._entityToComponents.values()) {\n memoryUsage += components.size * 8;\n }\n return {\n type: this.type,\n size: this._componentToEntities.size,\n memoryUsage,\n queryCount: this._queryCount,\n avgQueryTime: this._queryCount > 0 ? this._totalQueryTime / this._queryCount : 0,\n lastUpdated: this._lastUpdated\n };\n }\n}\n/**\n * 位图索引实现\n *\n * 使用位操作进行快速集合运算,内存效率高。\n * 适合有限组件类型和大量实体的场景。\n */\nexport class BitmapComponentIndex {\n constructor() {\n this.type = IndexType.BITMAP;\n this._componentTypeToBit = new Map();\n this._entityToBitmap = new Map();\n this._bitToEntities = new Map();\n this._nextBit = 0;\n this._queryCount = 0;\n this._totalQueryTime = 0;\n this._lastUpdated = Date.now();\n }\n addEntity(entity) {\n let bitmap = 0;\n for (const component of entity.components) {\n const componentType = component.constructor;\n let bit = this._componentTypeToBit.get(componentType);\n if (bit === undefined) {\n bit = this._nextBit++;\n this._componentTypeToBit.set(componentType, bit);\n }\n bitmap |= (1 << bit);\n let entities = this._bitToEntities.get(1 << bit);\n if (!entities) {\n entities = new Set();\n this._bitToEntities.set(1 << bit, entities);\n }\n entities.add(entity);\n }\n this._entityToBitmap.set(entity, bitmap);\n this._lastUpdated = Date.now();\n }\n removeEntity(entity) {\n const bitmap = this._entityToBitmap.get(entity);\n if (bitmap === undefined)\n return;\n // 从所有相关的位集合中移除实体\n for (const [bitMask, entities] of this._bitToEntities) {\n if ((bitmap & bitMask) !== 0) {\n entities.delete(entity);\n if (entities.size === 0) {\n this._bitToEntities.delete(bitMask);\n }\n }\n }\n this._entityToBitmap.delete(entity);\n this._lastUpdated = Date.now();\n }\n query(componentType) {\n const startTime = performance.now();\n const bit = this._componentTypeToBit.get(componentType);\n if (bit === undefined) {\n this._queryCount++;\n this._totalQueryTime += performance.now() - startTime;\n return new Set();\n }\n const result = new Set(this._bitToEntities.get(1 << bit) || []);\n this._queryCount++;\n this._totalQueryTime += performance.now() - startTime;\n return result;\n }\n queryMultiple(componentTypes, operation) {\n const startTime = performance.now();\n if (componentTypes.length === 0) {\n return new Set();\n }\n let targetBitmap = 0;\n const validBits = [];\n for (const componentType of componentTypes) {\n const bit = this._componentTypeToBit.get(componentType);\n if (bit !== undefined) {\n targetBitmap |= (1 << bit);\n validBits.push(1 << bit);\n }\n }\n const result = new Set();\n if (operation === 'AND') {\n for (const [entity, entityBitmap] of this._entityToBitmap) {\n if ((entityBitmap & targetBitmap) === targetBitmap) {\n result.add(entity);\n }\n }\n }\n else {\n for (const bitMask of validBits) {\n const entities = this._bitToEntities.get(bitMask);\n if (entities) {\n for (const entity of entities) {\n result.add(entity);\n }\n }\n }\n }\n this._queryCount++;\n this._totalQueryTime += performance.now() - startTime;\n return result;\n }\n clear() {\n this._componentTypeToBit.clear();\n this._entityToBitmap.clear();\n this._bitToEntities.clear();\n this._nextBit = 0;\n this._lastUpdated = Date.now();\n }\n getStats() {\n let memoryUsage = 0;\n memoryUsage += this._componentTypeToBit.size * 12;\n memoryUsage += this._entityToBitmap.size * 12;\n memoryUsage += this._bitToEntities.size * 64;\n for (const entities of this._bitToEntities.values()) {\n memoryUsage += entities.size * 8;\n }\n return {\n type: this.type,\n size: this._componentTypeToBit.size,\n memoryUsage,\n queryCount: this._queryCount,\n avgQueryTime: this._queryCount > 0 ? this._totalQueryTime / this._queryCount : 0,\n lastUpdated: this._lastUpdated\n };\n }\n}\n/**\n * 智能组件索引管理器\n *\n * 根据使用模式自动选择最优的索引策略。\n * 支持动态切换索引类型以获得最佳性能。\n */\nexport class ComponentIndexManager {\n constructor(initialType = IndexType.HASH) {\n this._indexHistory = new Map();\n this._autoOptimize = true;\n this._optimizationThreshold = 1000;\n this._activeIndex = this.createIndex(initialType);\n }\n /**\n * 添加实体到索引\n */\n addEntity(entity) {\n this._activeIndex.addEntity(entity);\n this.checkOptimization();\n }\n /**\n * 从索引中移除实体\n */\n removeEntity(entity) {\n this._activeIndex.removeEntity(entity);\n }\n /**\n * 查询包含指定组件的实体\n */\n query(componentType) {\n return this._activeIndex.query(componentType);\n }\n /**\n * 批量查询多个组件\n */\n queryMultiple(componentTypes, operation) {\n return this._activeIndex.queryMultiple(componentTypes, operation);\n }\n /**\n * 手动切换索引类型\n */\n switchIndexType(type) {\n if (type === this._activeIndex.type)\n return;\n this._indexHistory.set(this._activeIndex.type, this._activeIndex.getStats());\n const oldIndex = this._activeIndex;\n this._activeIndex = this.createIndex(type);\n oldIndex.clear();\n }\n /**\n * 启用/禁用自动优化\n */\n setAutoOptimize(enabled) {\n this._autoOptimize = enabled;\n }\n /**\n * 获取当前索引统计信息\n */\n getStats() {\n return this._activeIndex.getStats();\n }\n /**\n * 获取所有索引类型的历史统计信息\n */\n getAllStats() {\n const current = this._activeIndex.getStats();\n return new Map([\n ...this._indexHistory,\n [current.type, current]\n ]);\n }\n /**\n * 清空索引\n */\n clear() {\n this._activeIndex.clear();\n }\n /**\n * 创建指定类型的索引\n */\n createIndex(type) {\n switch (type) {\n case IndexType.HASH:\n return new HashComponentIndex();\n case IndexType.BITMAP:\n return new BitmapComponentIndex();\n case IndexType.SORTED:\n return new HashComponentIndex();\n default:\n return new HashComponentIndex();\n }\n }\n /**\n * 检查是否需要优化索引\n */\n checkOptimization() {\n if (!this._autoOptimize)\n return;\n const stats = this._activeIndex.getStats();\n if (stats.queryCount < this._optimizationThreshold)\n return;\n if (stats.avgQueryTime > 1.0 && stats.type !== IndexType.HASH) {\n this.switchIndexType(IndexType.HASH);\n }\n else if (stats.memoryUsage > 10 * 1024 * 1024 && stats.type !== IndexType.BITMAP) {\n this.switchIndexType(IndexType.BITMAP);\n }\n }\n}\n//# sourceMappingURL=ComponentIndex.js.map","/**\n * 脏标记类型\n */\nexport var DirtyFlag;\n(function (DirtyFlag) {\n /** 组件数据已修改 */\n DirtyFlag[DirtyFlag[\"COMPONENT_MODIFIED\"] = 1] = \"COMPONENT_MODIFIED\";\n /** 组件已添加 */\n DirtyFlag[DirtyFlag[\"COMPONENT_ADDED\"] = 2] = \"COMPONENT_ADDED\";\n /** 组件已移除 */\n DirtyFlag[DirtyFlag[\"COMPONENT_REMOVED\"] = 4] = \"COMPONENT_REMOVED\";\n /** 实体位置已改变 */\n DirtyFlag[DirtyFlag[\"TRANSFORM_CHANGED\"] = 8] = \"TRANSFORM_CHANGED\";\n /** 实体状态已改变 */\n DirtyFlag[DirtyFlag[\"STATE_CHANGED\"] = 16] = \"STATE_CHANGED\";\n /** 自定义标记1 */\n DirtyFlag[DirtyFlag[\"CUSTOM_1\"] = 256] = \"CUSTOM_1\";\n /** 自定义标记2 */\n DirtyFlag[DirtyFlag[\"CUSTOM_2\"] = 512] = \"CUSTOM_2\";\n /** 自定义标记3 */\n DirtyFlag[DirtyFlag[\"CUSTOM_3\"] = 1024] = \"CUSTOM_3\";\n /** 所有标记 */\n DirtyFlag[DirtyFlag[\"ALL\"] = 4294967295] = \"ALL\";\n})(DirtyFlag || (DirtyFlag = {}));\n/**\n * 脏标记追踪系统\n *\n * 提供高效的组件和实体变更追踪,避免不必要的计算和更新。\n * 支持细粒度的脏标记和批量处理机制。\n *\n * @example\n * ```typescript\n * const dirtySystem = new DirtyTrackingSystem();\n *\n * // 标记实体的位置组件已修改\n * dirtySystem.markDirty(entity, DirtyFlag.TRANSFORM_CHANGED, [PositionComponent]);\n *\n * // 监听位置变化\n * dirtySystem.addListener({\n * flags: DirtyFlag.TRANSFORM_CHANGED,\n * callback: (data) => {\n * console.log('Entity position changed:', data.entity.name);\n * }\n * });\n *\n * // 处理所有脏标记\n * dirtySystem.processDirtyEntities();\n * ```\n */\nexport class DirtyTrackingSystem {\n constructor() {\n /** 脏实体映射表 */\n this._dirtyEntities = new Map();\n /** 脏标记监听器 */\n this._listeners = [];\n /** 性能统计 */\n this._stats = {\n totalMarkings: 0,\n totalCleanups: 0,\n frameCount: 0,\n totalDirtyPerFrame: 0\n };\n /** 当前帧编号 */\n this._currentFrame = 0;\n this._batchSize = 100;\n this._maxProcessingTime = 16;\n /** 延迟处理队列 */\n this._processingQueue = [];\n this._isProcessing = false;\n }\n /**\n * 标记实体为脏状态\n *\n * @param entity 要标记的实体\n * @param flags 脏标记位\n * @param modifiedComponents 修改的组件类型列表\n */\n markDirty(entity, flags, modifiedComponents = []) {\n this._stats.totalMarkings++;\n let dirtyData = this._dirtyEntities.get(entity);\n if (!dirtyData) {\n dirtyData = {\n entity,\n flags: 0,\n modifiedComponents: new Set(),\n timestamp: performance.now(),\n frameNumber: this._currentFrame\n };\n this._dirtyEntities.set(entity, dirtyData);\n }\n dirtyData.flags |= flags;\n dirtyData.timestamp = performance.now();\n dirtyData.frameNumber = this._currentFrame;\n for (const componentType of modifiedComponents) {\n dirtyData.modifiedComponents.add(componentType);\n }\n this.notifyListeners(dirtyData, flags);\n }\n /**\n * 检查实体是否有指定的脏标记\n *\n * @param entity 要检查的实体\n * @param flags 要检查的标记位\n * @returns 是否有指定的脏标记\n */\n isDirty(entity, flags = DirtyFlag.ALL) {\n const dirtyData = this._dirtyEntities.get(entity);\n return dirtyData ? (dirtyData.flags & flags) !== 0 : false;\n }\n /**\n * 清除实体的脏标记\n *\n * @param entity 要清除的实体\n * @param flags 要清除的标记位,默认清除所有\n */\n clearDirty(entity, flags = DirtyFlag.ALL) {\n const dirtyData = this._dirtyEntities.get(entity);\n if (!dirtyData)\n return;\n if (flags === DirtyFlag.ALL) {\n this._dirtyEntities.delete(entity);\n }\n else {\n dirtyData.flags &= ~flags;\n if (dirtyData.flags === 0) {\n this._dirtyEntities.delete(entity);\n }\n }\n this._stats.totalCleanups++;\n }\n /**\n * 获取所有脏实体\n *\n * @param flags 过滤标记位,只返回包含指定标记的实体\n * @returns 脏实体数据数组\n */\n getDirtyEntities(flags = DirtyFlag.ALL) {\n const result = [];\n for (const dirtyData of this._dirtyEntities.values()) {\n if ((dirtyData.flags & flags) !== 0) {\n result.push(dirtyData);\n }\n }\n return result;\n }\n /**\n * 批量处理脏实体\n *\n * 使用时间分片的方式处理脏实体,避免单帧卡顿\n */\n processDirtyEntities() {\n if (this._isProcessing)\n return;\n this._isProcessing = true;\n const startTime = performance.now();\n if (this._processingQueue.length === 0) {\n this._processingQueue.push(...this._dirtyEntities.values());\n }\n let processed = 0;\n while (this._processingQueue.length > 0 && processed < this._batchSize) {\n const elapsed = performance.now() - startTime;\n if (elapsed > this._maxProcessingTime) {\n break;\n }\n const dirtyData = this._processingQueue.shift();\n this.processEntity(dirtyData);\n processed++;\n }\n if (this._processingQueue.length === 0) {\n this._isProcessing = false;\n this.onFrameEnd();\n }\n }\n /**\n * 添加脏标记监听器\n *\n * @param listener 监听器配置\n */\n addListener(listener) {\n this._listeners.push(listener);\n this._listeners.sort((a, b) => (a.priority || 100) - (b.priority || 100));\n }\n /**\n * 移除脏标记监听器\n *\n * @param callback 要移除的回调函数\n */\n removeListener(callback) {\n const index = this._listeners.findIndex(l => l.callback === callback);\n if (index !== -1) {\n this._listeners.splice(index, 1);\n }\n }\n /**\n * 开始新的帧\n */\n beginFrame() {\n this._currentFrame++;\n }\n /**\n * 结束当前帧\n */\n endFrame() {\n if (!this._isProcessing) {\n this.processDirtyEntities();\n }\n }\n /**\n * 获取统计信息\n */\n getStats() {\n return {\n dirtyEntityCount: this._dirtyEntities.size,\n totalMarkings: this._stats.totalMarkings,\n totalCleanups: this._stats.totalCleanups,\n listenerCount: this._listeners.length,\n avgDirtyPerFrame: this._stats.frameCount > 0 ?\n this._stats.totalDirtyPerFrame / this._stats.frameCount : 0,\n estimatedMemoryUsage: this.estimateMemoryUsage()\n };\n }\n /**\n * 清空所有脏标记和统计信息\n */\n clear() {\n this._dirtyEntities.clear();\n this._processingQueue.length = 0;\n this._isProcessing = false;\n this._stats = {\n totalMarkings: 0,\n totalCleanups: 0,\n frameCount: 0,\n totalDirtyPerFrame: 0\n };\n }\n /**\n * 配置批量处理参数\n *\n * @param batchSize 每次处理的最大实体数量\n * @param maxProcessingTime 每帧最大处理时间(毫秒)\n */\n configureBatchProcessing(batchSize, maxProcessingTime) {\n this._batchSize = batchSize;\n this._maxProcessingTime = maxProcessingTime;\n }\n /**\n * 处理单个脏实体\n */\n processEntity(dirtyData) {\n for (const listener of this._listeners) {\n if ((dirtyData.flags & listener.flags) !== 0) {\n try {\n listener.callback(dirtyData);\n }\n catch (error) {\n console.error('Dirty listener error:', error);\n }\n }\n }\n this.clearDirty(dirtyData.entity);\n }\n /**\n * 通知监听器\n */\n notifyListeners(dirtyData, newFlags) {\n for (const listener of this._listeners) {\n if ((newFlags & listener.flags) !== 0) {\n try {\n listener.callback(dirtyData);\n }\n catch (error) {\n console.error('Dirty listener notification error:', error);\n }\n }\n }\n }\n /**\n * 帧结束时的统计更新\n */\n onFrameEnd() {\n this._stats.frameCount++;\n this._stats.totalDirtyPerFrame += this._dirtyEntities.size;\n }\n /**\n * 估算内存使用量\n */\n estimateMemoryUsage() {\n let usage = 0;\n usage += this._dirtyEntities.size * 100;\n usage += this._listeners.length * 50;\n usage += this._processingQueue.length * 8;\n return usage;\n }\n}\n//# sourceMappingURL=DirtyTrackingSystem.js.map","import { ComponentRegistry } from './ComponentStorage';\nimport { ecsCore } from '../../Utils/WasmCore';\nimport { ComponentPoolManager } from './ComponentPool';\nimport { BitMaskOptimizer } from './BitMaskOptimizer';\nimport { IndexUpdateBatcher } from './IndexUpdateBatcher';\nimport { ComponentIndexManager, IndexType } from './ComponentIndex';\nimport { ArchetypeSystem } from './ArchetypeSystem';\nimport { DirtyTrackingSystem, DirtyFlag } from './DirtyTrackingSystem';\n/**\n * 查询条件类型\n */\nexport var QueryConditionType;\n(function (QueryConditionType) {\n /** 必须包含所有指定组件 */\n QueryConditionType[\"ALL\"] = \"all\";\n /** 必须包含任意一个指定组件 */\n QueryConditionType[\"ANY\"] = \"any\";\n /** 不能包含任何指定组件 */\n QueryConditionType[\"NONE\"] = \"none\";\n})(QueryConditionType || (QueryConditionType = {}));\n/**\n * 高性能实体查询系统\n *\n * 提供快速的实体查询功能,支持按组件类型、标签、名称等多种方式查询实体。\n * 系统采用多级索引和智能缓存机制,确保在大量实体场景下的查询性能。\n *\n * 主要特性:\n * - 支持单组件和多组件查询\n * - 自动索引管理和缓存优化\n * - WebAssembly计算加速(如果可用)\n * - 详细的性能统计信息\n *\n * @example\n * ```typescript\n * // 查询所有包含Position和Velocity组件的实体\n * const movingEntities = querySystem.queryAll(PositionComponent, VelocityComponent);\n *\n * // 查询特定标签的实体\n * const playerEntities = querySystem.queryByTag(PLAYER_TAG);\n * ```\n */\nexport class QuerySystem {\n constructor() {\n this.entities = [];\n this.wasmAvailable = false;\n this.indexDirty = true;\n // 查询缓存系统\n this.queryCache = new Map();\n this.cacheMaxSize = 1000;\n this.cacheTimeout = 5000; // 5秒缓存过期\n // 性能统计\n this.queryStats = {\n totalQueries: 0,\n cacheHits: 0,\n indexHits: 0,\n linearScans: 0,\n archetypeHits: 0,\n dirtyChecks: 0\n };\n this.entityIndex = {\n byMask: new Map(),\n byComponentType: new Map(),\n byTag: new Map(),\n byName: new Map()\n };\n // 初始化优化组件\n this.componentPoolManager = ComponentPoolManager.getInstance();\n this.bitMaskOptimizer = BitMaskOptimizer.getInstance();\n this.indexUpdateBatcher = new IndexUpdateBatcher();\n // 初始化新的性能优化系统\n this.componentIndexManager = new ComponentIndexManager(IndexType.HASH);\n this.archetypeSystem = new ArchetypeSystem();\n this.dirtyTrackingSystem = new DirtyTrackingSystem();\n // 设置索引更新批处理器的回调\n this.indexUpdateBatcher.onBatchAdd = (entities) => {\n for (const entity of entities) {\n this.addEntityToIndexes(entity);\n }\n };\n this.indexUpdateBatcher.onBatchRemove = (entities) => {\n for (const entity of entities) {\n this.removeEntityFromIndexes(entity);\n }\n };\n this.indexUpdateBatcher.onBatchUpdate = (updates) => {\n for (const update of updates) {\n this.removeEntityFromIndexes(update.entity);\n this.addEntityToIndexes(update.entity);\n }\n };\n this.initializeWasm();\n }\n /**\n * 初始化WebAssembly支持\n *\n * 自动检测运行环境并启用WebAssembly计算加速。\n * 如果WebAssembly不可用,系统将自动回退到JavaScript实现。\n */\n async initializeWasm() {\n try {\n const wasmLoaded = await ecsCore.initialize();\n this.wasmAvailable = wasmLoaded && ecsCore.isUsingWasm();\n if (this.wasmAvailable) {\n console.log('QuerySystem: WebAssembly计算加速已启用');\n }\n else {\n console.log('QuerySystem: 使用JavaScript实现');\n }\n }\n catch (error) {\n console.warn('QuerySystem: WebAssembly初始化失败,使用JavaScript实现:', error);\n this.wasmAvailable = false;\n }\n }\n /**\n * 设置实体列表并重建索引\n *\n * 当实体集合发生大规模变化时调用此方法。\n * 系统将重新构建所有索引以确保查询性能。\n *\n * @param entities 新的实体列表\n */\n setEntities(entities) {\n this.entities = entities;\n this.clearQueryCache();\n this.rebuildIndexes();\n }\n /**\n * 添加单个实体到查询系统\n *\n * 将新实体添加到查询系统中,并自动更新相关索引。\n * 为了提高批量添加性能,可以延迟缓存清理。\n *\n * @param entity 要添加的实体\n * @param deferCacheClear 是否延迟缓存清理(用于批量操作)\n */\n addEntity(entity, deferCacheClear = false) {\n if (!this.entities.includes(entity)) {\n this.entities.push(entity);\n this.addEntityToIndexes(entity);\n this.componentIndexManager.addEntity(entity);\n this.archetypeSystem.addEntity(entity);\n this.dirtyTrackingSystem.markDirty(entity, DirtyFlag.COMPONENT_ADDED);\n // 只有在非延迟模式下才立即清理缓存\n if (!deferCacheClear) {\n this.clearQueryCache();\n }\n }\n }\n /**\n * 批量添加实体\n *\n * 高效地批量添加多个实体,减少缓存清理次数。\n * 使用Set来避免O(n)的重复检查。\n *\n * @param entities 要添加的实体列表\n */\n addEntities(entities) {\n if (entities.length === 0)\n return;\n // 使用Set来快速检查重复\n const existingIds = new Set(this.entities.map(e => e.id));\n let addedCount = 0;\n for (const entity of entities) {\n if (!existingIds.has(entity.id)) {\n this.entities.push(entity);\n this.addEntityToIndexes(entity);\n existingIds.add(entity.id);\n addedCount++;\n }\n }\n // 只在有实体被添加时才清理缓存\n if (addedCount > 0) {\n this.clearQueryCache();\n }\n }\n /**\n * 批量添加实体(无重复检查版本)\n *\n * 假设所有实体都是新的,跳过重复检查以获得最大性能。\n * 仅在确保没有重复实体时使用。\n *\n * @param entities 要添加的实体列表\n */\n addEntitiesUnchecked(entities) {\n if (entities.length === 0)\n return;\n // 避免调用栈溢出,分批添加\n for (const entity of entities) {\n this.entities.push(entity);\n }\n // 批量更新索引\n for (const entity of entities) {\n this.addEntityToIndexes(entity);\n }\n // 清理缓存\n this.clearQueryCache();\n }\n /**\n * 从查询系统移除实体\n *\n * 从查询系统中移除指定实体,并清理相关索引。\n *\n * @param entity 要移除的实体\n */\n removeEntity(entity) {\n const index = this.entities.indexOf(entity);\n if (index !== -1) {\n this.entities.splice(index, 1);\n this.removeEntityFromIndexes(entity);\n this.componentIndexManager.removeEntity(entity);\n this.archetypeSystem.removeEntity(entity);\n this.dirtyTrackingSystem.markDirty(entity, DirtyFlag.COMPONENT_REMOVED);\n this.clearQueryCache();\n }\n }\n /**\n * 将实体添加到各种索引中(优化版本)\n */\n addEntityToIndexes(entity) {\n const mask = entity.componentMask;\n // 组件掩码索引 - 优化Map操作\n let maskSet = this.entityIndex.byMask.get(mask);\n if (!maskSet) {\n maskSet = new Set();\n this.entityIndex.byMask.set(mask, maskSet);\n }\n maskSet.add(entity);\n // 组件类型索引 - 批量处理\n const components = entity.components;\n for (let i = 0; i < components.length; i++) {\n const componentType = components[i].constructor;\n let typeSet = this.entityIndex.byComponentType.get(componentType);\n if (!typeSet) {\n typeSet = new Set();\n this.entityIndex.byComponentType.set(componentType, typeSet);\n }\n typeSet.add(entity);\n }\n // 标签索引 - 只在有标签时处理\n const tag = entity.tag;\n if (tag !== undefined) {\n let tagSet = this.entityIndex.byTag.get(tag);\n if (!tagSet) {\n tagSet = new Set();\n this.entityIndex.byTag.set(tag, tagSet);\n }\n tagSet.add(entity);\n }\n // 名称索引 - 只在有名称时处理\n const name = entity.name;\n if (name) {\n let nameSet = this.entityIndex.byName.get(name);\n if (!nameSet) {\n nameSet = new Set();\n this.entityIndex.byName.set(name, nameSet);\n }\n nameSet.add(entity);\n }\n }\n /**\n * 从各种索引中移除实体\n */\n removeEntityFromIndexes(entity) {\n const mask = entity.componentMask;\n // 从组件掩码索引移除\n const maskSet = this.entityIndex.byMask.get(mask);\n if (maskSet) {\n maskSet.delete(entity);\n if (maskSet.size === 0) {\n this.entityIndex.byMask.delete(mask);\n }\n }\n // 从组件类型索引移除\n for (const component of entity.components) {\n const componentType = component.constructor;\n const typeSet = this.entityIndex.byComponentType.get(componentType);\n if (typeSet) {\n typeSet.delete(entity);\n if (typeSet.size === 0) {\n this.entityIndex.byComponentType.delete(componentType);\n }\n }\n }\n // 从标签索引移除\n if (entity.tag !== undefined) {\n const tagSet = this.entityIndex.byTag.get(entity.tag);\n if (tagSet) {\n tagSet.delete(entity);\n if (tagSet.size === 0) {\n this.entityIndex.byTag.delete(entity.tag);\n }\n }\n }\n // 从名称索引移除\n if (entity.name) {\n const nameSet = this.entityIndex.byName.get(entity.name);\n if (nameSet) {\n nameSet.delete(entity);\n if (nameSet.size === 0) {\n this.entityIndex.byName.delete(entity.name);\n }\n }\n }\n }\n /**\n * 重建所有索引\n *\n * 清空并重新构建所有查询索引。\n * 通常在大量实体变更后调用以确保索引一致性。\n */\n rebuildIndexes() {\n this.entityIndex.byMask.clear();\n this.entityIndex.byComponentType.clear();\n this.entityIndex.byTag.clear();\n this.entityIndex.byName.clear();\n for (const entity of this.entities) {\n this.addEntityToIndexes(entity);\n }\n this.indexDirty = false;\n }\n /**\n * 查询包含所有指定组件的实体\n *\n * 返回同时包含所有指定组件类型的实体列表。\n * 系统会自动选择最高效的查询策略,包括索引查找和缓存机制。\n *\n * @param componentTypes 要查询的组件类型列表\n * @returns 查询结果,包含匹配的实体和性能信息\n *\n * @example\n * ```typescript\n * // 查询同时具有位置和速度组件的实体\n * const result = querySystem.queryAll(PositionComponent, VelocityComponent);\n * console.log(`找到 ${result.count} 个移动实体`);\n * ```\n */\n queryAll(...componentTypes) {\n const startTime = performance.now();\n this.queryStats.totalQueries++;\n // 生成缓存键\n const cacheKey = `all:${componentTypes.map(t => t.name).sort().join(',')}`;\n // 检查缓存\n const cached = this.getFromCache(cacheKey);\n if (cached) {\n this.queryStats.cacheHits++;\n return {\n entities: cached,\n count: cached.length,\n executionTime: performance.now() - startTime,\n fromCache: true\n };\n }\n let entities;\n const archetypeResult = this.archetypeSystem.queryArchetypes(componentTypes, 'AND');\n if (archetypeResult.archetypes.length > 0) {\n this.queryStats.archetypeHits++;\n entities = [];\n for (const archetype of archetypeResult.archetypes) {\n entities.push(...archetype.entities);\n }\n }\n else if (componentTypes.length === 1) {\n this.queryStats.indexHits++;\n const indexResult = this.componentIndexManager.query(componentTypes[0]);\n entities = Array.from(indexResult);\n }\n else {\n const indexResult = this.componentIndexManager.queryMultiple(componentTypes, 'AND');\n entities = Array.from(indexResult);\n }\n // 缓存结果\n this.addToCache(cacheKey, entities);\n return {\n entities,\n count: entities.length,\n executionTime: performance.now() - startTime,\n fromCache: false\n };\n }\n /**\n * 多组件查询算法\n *\n * 针对多组件查询场景的高效算法实现。\n * 通过选择最小的组件集合作为起点,减少需要检查的实体数量。\n *\n * @param componentTypes 组件类型列表\n * @returns 匹配的实体列表\n */\n queryMultipleComponents(componentTypes) {\n // 找到最小的组件集合作为起点\n let smallestSet = null;\n let smallestSize = Infinity;\n for (const componentType of componentTypes) {\n const set = this.entityIndex.byComponentType.get(componentType);\n if (!set || set.size === 0) {\n return []; // 如果任何组件没有实体,直接返回空结果\n }\n if (set.size < smallestSize) {\n smallestSize = set.size;\n smallestSet = set;\n }\n }\n if (!smallestSet) {\n this.queryStats.linearScans++;\n return this.queryByLinearScan(componentTypes);\n }\n // 从最小集合开始,逐步过滤\n const mask = this.createComponentMask(componentTypes);\n const result = [];\n for (const entity of smallestSet) {\n if ((entity.componentMask & mask) === mask) {\n result.push(entity);\n }\n }\n return result;\n }\n /**\n * 线性扫描查询\n *\n * 当索引不可用时的备用查询方法。\n * 遍历所有实体进行组件匹配检查。\n *\n * @param componentTypes 组件类型列表\n * @returns 匹配的实体列表\n */\n queryByLinearScan(componentTypes) {\n const mask = this.createComponentMask(componentTypes);\n return this.entities.filter(entity => (entity.componentMask & mask) === mask);\n }\n /**\n * 查询包含任意指定组件的实体\n *\n * 返回包含任意一个指定组件类型的实体列表。\n * 使用集合合并算法确保高效的查询性能。\n *\n * @param componentTypes 要查询的组件类型列表\n * @returns 查询结果,包含匹配的实体和性能信息\n *\n * @example\n * ```typescript\n * // 查询具有武器或护甲组件的实体\n * const result = querySystem.queryAny(WeaponComponent, ArmorComponent);\n * console.log(`找到 ${result.count} 个装备实体`);\n * ```\n */\n queryAny(...componentTypes) {\n const startTime = performance.now();\n this.queryStats.totalQueries++;\n const cacheKey = `any:${componentTypes.map(t => t.name).sort().join(',')}`;\n // 检查缓存\n const cached = this.getFromCache(cacheKey);\n if (cached) {\n this.queryStats.cacheHits++;\n return {\n entities: cached,\n count: cached.length,\n executionTime: performance.now() - startTime,\n fromCache: true\n };\n }\n const archetypeResult = this.archetypeSystem.queryArchetypes(componentTypes, 'OR');\n let entities;\n if (archetypeResult.archetypes.length > 0) {\n this.queryStats.archetypeHits++;\n entities = [];\n for (const archetype of archetypeResult.archetypes) {\n entities.push(...archetype.entities);\n }\n }\n else {\n const indexResult = this.componentIndexManager.queryMultiple(componentTypes, 'OR');\n entities = Array.from(indexResult);\n }\n this.addToCache(cacheKey, entities);\n return {\n entities,\n count: entities.length,\n executionTime: performance.now() - startTime,\n fromCache: false\n };\n }\n /**\n * 查询不包含任何指定组件的实体\n *\n * 返回不包含任何指定组件类型的实体列表。\n * 适用于排除特定类型实体的查询场景。\n *\n * @param componentTypes 要排除的组件类型列表\n * @returns 查询结果,包含匹配的实体和性能信息\n *\n * @example\n * ```typescript\n * // 查询不具有AI和玩家控制组件的实体(如静态物体)\n * const result = querySystem.queryNone(AIComponent, PlayerControlComponent);\n * console.log(`找到 ${result.count} 个静态实体`);\n * ```\n */\n queryNone(...componentTypes) {\n const startTime = performance.now();\n this.queryStats.totalQueries++;\n const cacheKey = `none:${componentTypes.map(t => t.name).sort().join(',')}`;\n // 检查缓存\n const cached = this.getFromCache(cacheKey);\n if (cached) {\n this.queryStats.cacheHits++;\n return {\n entities: cached,\n count: cached.length,\n executionTime: performance.now() - startTime,\n fromCache: true\n };\n }\n const mask = this.createComponentMask(componentTypes);\n const entities = this.entities.filter(entity => (entity.componentMask & mask) === BigInt(0));\n this.addToCache(cacheKey, entities);\n return {\n entities,\n count: entities.length,\n executionTime: performance.now() - startTime,\n fromCache: false\n };\n }\n /**\n * 按标签查询实体\n *\n * 返回具有指定标签的所有实体。\n * 标签查询使用专用索引,具有很高的查询性能。\n *\n * @param tag 要查询的标签值\n * @returns 查询结果,包含匹配的实体和性能信息\n *\n * @example\n * ```typescript\n * // 查询所有玩家实体\n * const players = querySystem.queryByTag(PLAYER_TAG);\n * ```\n */\n queryByTag(tag) {\n const startTime = performance.now();\n this.queryStats.totalQueries++;\n const cacheKey = `tag:${tag}`;\n // 检查缓存\n const cached = this.getFromCache(cacheKey);\n if (cached) {\n this.queryStats.cacheHits++;\n return {\n entities: cached,\n count: cached.length,\n executionTime: performance.now() - startTime,\n fromCache: true\n };\n }\n // 使用索引查询\n this.queryStats.indexHits++;\n const entities = Array.from(this.entityIndex.byTag.get(tag) || []);\n // 缓存结果\n this.addToCache(cacheKey, entities);\n return {\n entities,\n count: entities.length,\n executionTime: performance.now() - startTime,\n fromCache: false\n };\n }\n /**\n * 按名称查询实体\n *\n * 返回具有指定名称的所有实体。\n * 名称查询使用专用索引,适用于查找特定的命名实体。\n *\n * @param name 要查询的实体名称\n * @returns 查询结果,包含匹配的实体和性能信息\n *\n * @example\n * ```typescript\n * // 查找名为\"Player\"的实体\n * const player = querySystem.queryByName(\"Player\");\n * ```\n */\n queryByName(name) {\n const startTime = performance.now();\n this.queryStats.totalQueries++;\n const cacheKey = `name:${name}`;\n // 检查缓存\n const cached = this.getFromCache(cacheKey);\n if (cached) {\n this.queryStats.cacheHits++;\n return {\n entities: cached,\n count: cached.length,\n executionTime: performance.now() - startTime,\n fromCache: true\n };\n }\n // 使用索引查询\n this.queryStats.indexHits++;\n const entities = Array.from(this.entityIndex.byName.get(name) || []);\n // 缓存结果\n this.addToCache(cacheKey, entities);\n return {\n entities,\n count: entities.length,\n executionTime: performance.now() - startTime,\n fromCache: false\n };\n }\n /**\n * 按单个组件类型查询实体\n *\n * 返回包含指定组件类型的所有实体。\n * 这是最基础的查询方法,具有最高的查询性能。\n *\n * @param componentType 要查询的组件类型\n * @returns 查询结果,包含匹配的实体和性能信息\n *\n * @example\n * ```typescript\n * // 查询所有具有位置组件的实体\n * const entitiesWithPosition = querySystem.queryByComponent(PositionComponent);\n * ```\n */\n queryByComponent(componentType) {\n const startTime = performance.now();\n this.queryStats.totalQueries++;\n const cacheKey = `component:${componentType.name}`;\n // 检查缓存\n const cached = this.getFromCache(cacheKey);\n if (cached) {\n this.queryStats.cacheHits++;\n return {\n entities: cached,\n count: cached.length,\n executionTime: performance.now() - startTime,\n fromCache: true\n };\n }\n // 使用索引查询\n this.queryStats.indexHits++;\n const entities = Array.from(this.entityIndex.byComponentType.get(componentType) || []);\n // 缓存结果\n this.addToCache(cacheKey, entities);\n return {\n entities,\n count: entities.length,\n executionTime: performance.now() - startTime,\n fromCache: false\n };\n }\n /**\n * 从缓存获取查询结果\n */\n getFromCache(cacheKey) {\n const entry = this.queryCache.get(cacheKey);\n if (!entry)\n return null;\n // 检查缓存是否过期\n if (Date.now() - entry.timestamp > this.cacheTimeout) {\n this.queryCache.delete(cacheKey);\n return null;\n }\n entry.hitCount++;\n return entry.entities;\n }\n /**\n * 添加查询结果到缓存\n */\n addToCache(cacheKey, entities) {\n // 如果缓存已满,清理最少使用的条目\n if (this.queryCache.size >= this.cacheMaxSize) {\n this.cleanupCache();\n }\n this.queryCache.set(cacheKey, {\n entities: [...entities], // 复制数组避免引用问题\n timestamp: Date.now(),\n hitCount: 0\n });\n }\n /**\n * 清理缓存\n */\n cleanupCache() {\n // 移除过期的缓存条目\n const now = Date.now();\n for (const [key, entry] of this.queryCache.entries()) {\n if (now - entry.timestamp > this.cacheTimeout) {\n this.queryCache.delete(key);\n }\n }\n // 如果还是太满,移除最少使用的条目\n if (this.queryCache.size >= this.cacheMaxSize) {\n const entries = Array.from(this.queryCache.entries());\n entries.sort((a, b) => a[1].hitCount - b[1].hitCount);\n const toRemove = Math.floor(this.cacheMaxSize * 0.2); // 移除20%\n for (let i = 0; i < toRemove && i < entries.length; i++) {\n this.queryCache.delete(entries[i][0]);\n }\n }\n }\n /**\n * 清除所有查询缓存\n */\n clearQueryCache() {\n this.queryCache.clear();\n }\n /**\n * 公共方法:清理查询缓存\n *\n * 用于外部调用清理缓存,通常在批量操作后使用。\n */\n clearCache() {\n this.clearQueryCache();\n }\n /**\n * 批量更新实体组件\n *\n * 对大量实体进行批量组件更新操作。\n * 当更新数量超过阈值时,系统会自动使用WebAssembly加速。\n *\n * @param updates 更新操作列表,包含实体ID和新的组件掩码\n *\n * @example\n * ```typescript\n * // 批量更新实体的组件配置\n * const updates = [\n * { entityId: 1, componentMask: BigInt(0b1011) },\n * { entityId: 2, componentMask: BigInt(0b1101) }\n * ];\n * querySystem.batchUpdateComponents(updates);\n * ```\n */\n batchUpdateComponents(updates) {\n if (this.wasmAvailable && updates.length > 100) {\n try {\n const entityIds = updates.map(u => u.entityId);\n const masks = updates.map(u => u.componentMask);\n ecsCore.batchUpdateMasks(entityIds, masks);\n console.log(`WebAssembly加速批量更新 ${updates.length} 个实体`);\n }\n catch (error) {\n console.warn('WebAssembly批量更新失败,回退到JavaScript实现:', error);\n this.batchUpdateComponentsJS(updates);\n }\n }\n else {\n this.batchUpdateComponentsJS(updates);\n }\n // 批量更新后清除缓存\n this.clearQueryCache();\n }\n /**\n * JavaScript实现的批量更新\n */\n batchUpdateComponentsJS(updates) {\n for (const update of updates) {\n const entity = this.entities.find(e => e.id === update.entityId);\n if (entity) {\n // 注意:componentMask是只读属性,实际应用中需要通过添加/移除组件来更新\n console.log(`更新实体 ${update.entityId} 的组件掩码: ${update.componentMask}`);\n }\n }\n this.rebuildIndexes();\n }\n /**\n * 获取加速状态信息\n *\n * 返回当前查询系统的加速状态和性能信息。\n * 包括WebAssembly可用性、缓存统计等详细信息。\n *\n * @returns 加速状态信息对象\n */\n getAccelerationStatus() {\n return {\n wasmEnabled: this.wasmAvailable,\n currentProvider: this.wasmAvailable ? 'hybrid' : 'javascript',\n availableProviders: ['javascript', 'hybrid'],\n performanceInfo: {\n entityCount: this.entities.length,\n wasmEnabled: this.wasmAvailable,\n cacheStats: {\n size: this.queryCache.size,\n hitRate: this.queryStats.totalQueries > 0 ?\n (this.queryStats.cacheHits / this.queryStats.totalQueries * 100).toFixed(2) + '%' : '0%'\n }\n }\n };\n }\n /**\n * 切换加速提供者\n *\n * 兼容性接口,保持向后兼容。\n * 系统会自动选择最佳的实现方式。\n *\n * @param providerName 提供者名称\n * @returns 是否切换成功\n */\n async switchAccelerationProvider(providerName) {\n return true;\n }\n /**\n * 创建组件掩码\n *\n * 根据组件类型列表生成对应的位掩码。\n * 使用位掩码优化器进行缓存和预计算。\n *\n * @param componentTypes 组件类型列表\n * @returns 生成的位掩码\n */\n createComponentMask(componentTypes) {\n // 使用位掩码优化器创建掩码\n const componentNames = componentTypes.map(type => type.name);\n // 确保组件类型已注册到优化器\n for (const name of componentNames) {\n this.bitMaskOptimizer.registerComponentType(name);\n }\n return this.bitMaskOptimizer.createCombinedMask(componentNames);\n }\n /**\n * 获取系统统计信息\n *\n * 返回查询系统的详细统计信息,包括实体数量、索引状态、\n * 查询性能统计等,用于性能监控和调试。\n *\n * @returns 系统统计信息对象\n */\n getStats() {\n return {\n entityCount: this.entities.length,\n indexStats: {\n maskIndexSize: this.entityIndex.byMask.size,\n componentIndexSize: this.entityIndex.byComponentType.size,\n tagIndexSize: this.entityIndex.byTag.size,\n nameIndexSize: this.entityIndex.byName.size\n },\n accelerationStatus: this.getAccelerationStatus(),\n queryStats: {\n ...this.queryStats,\n cacheHitRate: this.queryStats.totalQueries > 0 ?\n (this.queryStats.cacheHits / this.queryStats.totalQueries * 100).toFixed(2) + '%' : '0%'\n },\n optimizationStats: {\n componentIndex: this.componentIndexManager.getStats(),\n archetypeSystem: this.archetypeSystem.getAllArchetypes().map(a => ({\n id: a.id,\n componentTypes: a.componentTypes.map(t => t.name),\n entityCount: a.entities.length\n })),\n dirtyTracking: this.dirtyTrackingSystem.getStats()\n }\n };\n }\n /**\n * 切换组件索引类型\n *\n * @param indexType 新的索引类型\n */\n switchComponentIndexType(indexType) {\n this.componentIndexManager.switchIndexType(indexType);\n }\n /**\n * 配置脏标记系统\n *\n * @param batchSize 批处理大小\n * @param maxProcessingTime 最大处理时间\n */\n configureDirtyTracking(batchSize, maxProcessingTime) {\n this.dirtyTrackingSystem.configureBatchProcessing(batchSize, maxProcessingTime);\n }\n /**\n * 手动触发性能优化\n */\n optimizePerformance() {\n this.dirtyTrackingSystem.processDirtyEntities();\n this.cleanupCache();\n const stats = this.componentIndexManager.getStats();\n if (stats.avgQueryTime > 2.0 && stats.type !== IndexType.HASH) {\n this.switchComponentIndexType(IndexType.HASH);\n }\n else if (stats.memoryUsage > 50 * 1024 * 1024 && stats.type !== IndexType.BITMAP) {\n this.switchComponentIndexType(IndexType.BITMAP);\n }\n }\n /**\n * 开始新的帧\n */\n beginFrame() {\n this.dirtyTrackingSystem.beginFrame();\n }\n /**\n * 结束当前帧\n */\n endFrame() {\n this.dirtyTrackingSystem.endFrame();\n }\n /**\n * 标记实体组件已修改(用于脏标记追踪)\n *\n * @param entity 修改的实体\n * @param componentTypes 修改的组件类型\n */\n markEntityDirty(entity, componentTypes) {\n this.queryStats.dirtyChecks++;\n this.dirtyTrackingSystem.markDirty(entity, DirtyFlag.COMPONENT_MODIFIED, componentTypes);\n this.clearQueryCache();\n }\n /**\n * 获取实体所属的原型信息\n *\n * @param entity 要查询的实体\n */\n getEntityArchetype(entity) {\n return this.archetypeSystem.getEntityArchetype(entity);\n }\n}\n/**\n * 查询构建器\n *\n * 提供链式API来构建复杂的实体查询条件。\n * 支持组合多种查询条件,创建灵活的查询表达式。\n *\n * @example\n * ```typescript\n * const result = new QueryBuilder(querySystem)\n * .withAll(PositionComponent, VelocityComponent)\n * .without(DeadComponent)\n * .execute();\n * ```\n */\nexport class QueryBuilder {\n constructor(querySystem) {\n this.conditions = [];\n this.querySystem = querySystem;\n }\n /**\n * 添加\"必须包含所有组件\"条件\n *\n * @param componentTypes 必须包含的组件类型\n * @returns 查询构建器实例,支持链式调用\n */\n withAll(...componentTypes) {\n this.conditions.push({\n type: QueryConditionType.ALL,\n componentTypes,\n mask: this.createComponentMask(componentTypes)\n });\n return this;\n }\n /**\n * 添加\"必须包含任意组件\"条件\n *\n * @param componentTypes 必须包含其中任意一个的组件类型\n * @returns 查询构建器实例,支持链式调用\n */\n withAny(...componentTypes) {\n this.conditions.push({\n type: QueryConditionType.ANY,\n componentTypes,\n mask: this.createComponentMask(componentTypes)\n });\n return this;\n }\n /**\n * 添加\"不能包含任何组件\"条件\n *\n * @param componentTypes 不能包含的组件类型\n * @returns 查询构建器实例,支持链式调用\n */\n without(...componentTypes) {\n this.conditions.push({\n type: QueryConditionType.NONE,\n componentTypes,\n mask: this.createComponentMask(componentTypes)\n });\n return this;\n }\n /**\n * 执行查询并返回结果\n *\n * 根据已添加的查询条件执行实体查询。\n *\n * @returns 查询结果,包含匹配的实体和性能信息\n */\n execute() {\n const startTime = performance.now();\n // 简化实现:目前只支持单一条件\n if (this.conditions.length === 1) {\n const condition = this.conditions[0];\n switch (condition.type) {\n case QueryConditionType.ALL:\n return this.querySystem.queryAll(...condition.componentTypes);\n case QueryConditionType.ANY:\n return this.querySystem.queryAny(...condition.componentTypes);\n case QueryConditionType.NONE:\n return this.querySystem.queryNone(...condition.componentTypes);\n }\n }\n // 多条件查询的复杂实现留待后续扩展\n return {\n entities: [],\n count: 0,\n executionTime: performance.now() - startTime,\n fromCache: false\n };\n }\n /**\n * 创建组件掩码\n */\n createComponentMask(componentTypes) {\n let mask = BigInt(0);\n for (const type of componentTypes) {\n try {\n const bitMask = ComponentRegistry.getBitMask(type);\n mask |= bitMask;\n }\n catch (error) {\n console.warn(`组件类型 ${type.name} 未注册,跳过`);\n }\n }\n return mask;\n }\n /**\n * 重置查询构建器\n *\n * 清除所有已添加的查询条件,重新开始构建查询。\n *\n * @returns 查询构建器实例,支持链式调用\n */\n reset() {\n this.conditions = [];\n return this;\n }\n}\n//# sourceMappingURL=QuerySystem.js.map","/**\n * 框架核心类型定义\n */\n/** 日志类型枚举 */\nexport var LogType;\n(function (LogType) {\n LogType[LogType[\"Error\"] = 0] = \"Error\";\n LogType[LogType[\"Assert\"] = 1] = \"Assert\";\n LogType[LogType[\"Warning\"] = 2] = \"Warning\";\n LogType[LogType[\"Log\"] = 3] = \"Log\";\n LogType[LogType[\"Exception\"] = 4] = \"Exception\";\n})(LogType || (LogType = {}));\n/** 组件变换类型枚举 */\nexport var ComponentTransform;\n(function (ComponentTransform) {\n ComponentTransform[ComponentTransform[\"Position\"] = 1] = \"Position\";\n ComponentTransform[ComponentTransform[\"Scale\"] = 2] = \"Scale\";\n ComponentTransform[ComponentTransform[\"Rotation\"] = 4] = \"Rotation\";\n})(ComponentTransform || (ComponentTransform = {}));\n//# sourceMappingURL=index.js.map","/**\n * Archetype系统\n *\n * 根据实体的组件组合将实体分组到不同的原型中,提供高效的查询性能。\n */\nexport class ArchetypeSystem {\n constructor() {\n /** 所有原型的映射表 */\n this._archetypes = new Map();\n /** 实体到原型的映射 */\n this._entityToArchetype = new Map();\n /** 组件类型到原型的映射 */\n this._componentToArchetypes = new Map();\n /** 查询缓存 */\n this._queryCache = new Map();\n this._cacheTimeout = 5000;\n this._maxCacheSize = 100;\n }\n /**\n * 添加实体到原型系统\n */\n addEntity(entity) {\n const componentTypes = this.getEntityComponentTypes(entity);\n const archetypeId = this.generateArchetypeId(componentTypes);\n let archetype = this._archetypes.get(archetypeId);\n if (!archetype) {\n archetype = this.createArchetype(componentTypes);\n }\n archetype.entities.push(entity);\n archetype.updatedAt = Date.now();\n this._entityToArchetype.set(entity, archetype);\n this.updateComponentIndexes(archetype, componentTypes, true);\n this.invalidateQueryCache();\n }\n /**\n * 从原型系统中移除实体\n */\n removeEntity(entity) {\n const archetype = this._entityToArchetype.get(entity);\n if (!archetype)\n return;\n const index = archetype.entities.indexOf(entity);\n if (index !== -1) {\n archetype.entities.splice(index, 1);\n archetype.updatedAt = Date.now();\n }\n this._entityToArchetype.delete(entity);\n this.invalidateQueryCache();\n }\n /**\n * 查询包含指定组件组合的原型\n */\n queryArchetypes(componentTypes, operation = 'AND') {\n const startTime = performance.now();\n const cacheKey = `${operation}:${componentTypes.map(t => t.name).sort().join(',')}`;\n // 检查缓存\n const cached = this._queryCache.get(cacheKey);\n if (cached && (Date.now() - cached.timestamp < this._cacheTimeout)) {\n return {\n ...cached.result,\n executionTime: performance.now() - startTime,\n fromCache: true\n };\n }\n const matchingArchetypes = [];\n let totalEntities = 0;\n if (operation === 'AND') {\n for (const archetype of this._archetypes.values()) {\n if (this.archetypeContainsAllComponents(archetype, componentTypes)) {\n matchingArchetypes.push(archetype);\n totalEntities += archetype.entities.length;\n }\n }\n }\n else {\n const foundArchetypes = new Set();\n for (const componentType of componentTypes) {\n const archetypes = this._componentToArchetypes.get(componentType);\n if (archetypes) {\n for (const archetype of archetypes) {\n foundArchetypes.add(archetype);\n }\n }\n }\n for (const archetype of foundArchetypes) {\n matchingArchetypes.push(archetype);\n totalEntities += archetype.entities.length;\n }\n }\n const result = {\n archetypes: matchingArchetypes,\n totalEntities,\n executionTime: performance.now() - startTime,\n fromCache: false\n };\n // 缓存结果\n this._queryCache.set(cacheKey, {\n result,\n timestamp: Date.now()\n });\n return result;\n }\n /**\n * 获取实体所属的原型\n */\n getEntityArchetype(entity) {\n return this._entityToArchetype.get(entity);\n }\n /**\n * 获取所有原型\n */\n getAllArchetypes() {\n return Array.from(this._archetypes.values());\n }\n /**\n * 清空所有数据\n */\n clear() {\n this._archetypes.clear();\n this._entityToArchetype.clear();\n this._componentToArchetypes.clear();\n this._queryCache.clear();\n }\n /**\n * 获取实体的组件类型列表\n */\n getEntityComponentTypes(entity) {\n return entity.components.map(component => component.constructor);\n }\n /**\n * 生成原型ID\n */\n generateArchetypeId(componentTypes) {\n return componentTypes\n .map(type => type.name)\n .sort()\n .join('|');\n }\n /**\n * 创建新原型\n */\n createArchetype(componentTypes) {\n const id = this.generateArchetypeId(componentTypes);\n const archetype = {\n id,\n componentTypes: [...componentTypes],\n entities: [],\n createdAt: Date.now(),\n updatedAt: Date.now()\n };\n this._archetypes.set(id, archetype);\n return archetype;\n }\n /**\n * 检查原型是否包含所有指定组件\n */\n archetypeContainsAllComponents(archetype, componentTypes) {\n for (const componentType of componentTypes) {\n if (!archetype.componentTypes.includes(componentType)) {\n return false;\n }\n }\n return true;\n }\n /**\n * 更新组件索引\n */\n updateComponentIndexes(archetype, componentTypes, add) {\n for (const componentType of componentTypes) {\n let archetypes = this._componentToArchetypes.get(componentType);\n if (!archetypes) {\n archetypes = new Set();\n this._componentToArchetypes.set(componentType, archetypes);\n }\n if (add) {\n archetypes.add(archetype);\n }\n else {\n archetypes.delete(archetype);\n if (archetypes.size === 0) {\n this._componentToArchetypes.delete(componentType);\n }\n }\n }\n }\n /**\n * 使查询缓存失效\n */\n invalidateQueryCache() {\n this._queryCache.clear();\n }\n}\n//# sourceMappingURL=ArchetypeSystem.js.map","/**\n * 类型安全的高性能事件系统\n * 支持同步/异步事件、优先级、批处理等功能\n */\nexport class TypeSafeEventSystem {\n constructor() {\n this.listeners = new Map();\n this.stats = new Map();\n this.batchQueue = new Map();\n this.batchTimers = new Map();\n this.batchConfigs = new Map();\n this.nextListenerId = 0;\n this.isEnabled = true;\n this.maxListeners = 100; // 每个事件类型的最大监听器数量\n }\n /**\n * 添加事件监听器\n * @param eventType 事件类型\n * @param handler 事件处理器\n * @param config 监听器配置\n * @returns 监听器ID(用于移除)\n */\n on(eventType, handler, config = {}) {\n return this.addListener(eventType, handler, config);\n }\n /**\n * 添加一次性事件监听器\n * @param eventType 事件类型\n * @param handler 事件处理器\n * @param config 监听器配置\n * @returns 监听器ID\n */\n once(eventType, handler, config = {}) {\n return this.addListener(eventType, handler, { ...config, once: true });\n }\n /**\n * 添加异步事件监听器\n * @param eventType 事件类型\n * @param handler 异步事件处理器\n * @param config 监听器配置\n * @returns 监听器ID\n */\n onAsync(eventType, handler, config = {}) {\n return this.addListener(eventType, handler, { ...config, async: true });\n }\n /**\n * 移除事件监听器\n * @param eventType 事件类型\n * @param listenerId 监听器ID\n * @returns 是否成功移除\n */\n off(eventType, listenerId) {\n const listeners = this.listeners.get(eventType);\n if (!listeners)\n return false;\n const index = listeners.findIndex(l => l.id === listenerId);\n if (index === -1)\n return false;\n listeners.splice(index, 1);\n // 如果没有监听器了,清理相关数据\n if (listeners.length === 0) {\n this.listeners.delete(eventType);\n this.stats.delete(eventType);\n }\n return true;\n }\n /**\n * 移除指定事件类型的所有监听器\n * @param eventType 事件类型\n */\n offAll(eventType) {\n this.listeners.delete(eventType);\n this.stats.delete(eventType);\n this.clearBatch(eventType);\n }\n /**\n * 触发事件\n * @param eventType 事件类型\n * @param event 事件数据\n * @returns Promise(如果有异步监听器)\n */\n async emit(eventType, event) {\n if (!this.isEnabled)\n return;\n // 检查是否启用了批处理\n const batchConfig = this.batchConfigs.get(eventType);\n if (batchConfig?.enabled) {\n this.addToBatch(eventType, event);\n return;\n }\n await this.executeEvent(eventType, event);\n }\n /**\n * 同步触发事件(忽略异步监听器)\n * @param eventType 事件类型\n * @param event 事件数据\n */\n emitSync(eventType, event) {\n if (!this.isEnabled)\n return;\n const listeners = this.listeners.get(eventType);\n if (!listeners || listeners.length === 0)\n return;\n const startTime = performance.now();\n const toRemove = [];\n // 按优先级排序\n const sortedListeners = this.sortListenersByPriority(listeners);\n for (const listener of sortedListeners) {\n if (listener.config.async)\n continue; // 跳过异步监听器\n try {\n if (listener.config.context) {\n listener.handler.call(listener.config.context, event);\n }\n else {\n listener.handler(event);\n }\n if (listener.config.once) {\n toRemove.push(listener.id);\n }\n }\n catch (error) {\n console.error(`Error in event handler for ${eventType}:`, error);\n }\n }\n // 移除一次性监听器\n this.removeListeners(eventType, toRemove);\n // 更新统计信息\n this.updateStats(eventType, performance.now() - startTime);\n }\n /**\n * 设置事件批处理配置\n * @param eventType 事件类型\n * @param config 批处理配置\n */\n setBatchConfig(eventType, config) {\n this.batchConfigs.set(eventType, config);\n }\n /**\n * 立即处理指定事件类型的批处理队列\n * @param eventType 事件类型\n */\n flushBatch(eventType) {\n const batch = this.batchQueue.get(eventType);\n if (!batch || batch.length === 0)\n return;\n // 清除定时器\n const timer = this.batchTimers.get(eventType);\n if (timer) {\n clearTimeout(timer);\n this.batchTimers.delete(eventType);\n }\n // 处理批处理事件\n this.processBatch(eventType, batch);\n // 清空队列\n this.batchQueue.delete(eventType);\n }\n /**\n * 获取事件统计信息\n * @param eventType 事件类型(可选)\n * @returns 统计信息\n */\n getStats(eventType) {\n if (eventType) {\n return this.stats.get(eventType) || this.createEmptyStats(eventType);\n }\n return new Map(this.stats);\n }\n /**\n * 重置统计信息\n * @param eventType 事件类型(可选,不指定则重置所有)\n */\n resetStats(eventType) {\n if (eventType) {\n this.stats.delete(eventType);\n }\n else {\n this.stats.clear();\n }\n }\n /**\n * 启用/禁用事件系统\n * @param enabled 是否启用\n */\n setEnabled(enabled) {\n this.isEnabled = enabled;\n }\n /**\n * 检查是否有指定事件类型的监听器\n * @param eventType 事件类型\n * @returns 是否有监听器\n */\n hasListeners(eventType) {\n const listeners = this.listeners.get(eventType);\n return listeners ? listeners.length > 0 : false;\n }\n /**\n * 获取指定事件类型的监听器数量\n * @param eventType 事件类型\n * @returns 监听器数量\n */\n getListenerCount(eventType) {\n const listeners = this.listeners.get(eventType);\n return listeners ? listeners.length : 0;\n }\n /**\n * 清空所有事件监听器和数据\n */\n clear() {\n this.listeners.clear();\n this.stats.clear();\n this.clearAllBatches();\n }\n /**\n * 设置每个事件类型的最大监听器数量\n * @param max 最大数量\n */\n setMaxListeners(max) {\n this.maxListeners = max;\n }\n /**\n * 添加监听器的内部实现\n * @param eventType 事件类型\n * @param handler 事件处理器\n * @param config 配置\n * @returns 监听器ID\n */\n addListener(eventType, handler, config) {\n let listeners = this.listeners.get(eventType);\n if (!listeners) {\n listeners = [];\n this.listeners.set(eventType, listeners);\n }\n // 检查监听器数量限制\n if (listeners.length >= this.maxListeners) {\n console.warn(`Maximum listeners (${this.maxListeners}) exceeded for event type: ${eventType}`);\n return '';\n }\n const listenerId = `listener_${this.nextListenerId++}`;\n const listener = {\n handler,\n config: {\n priority: 0,\n ...config\n },\n id: listenerId\n };\n listeners.push(listener);\n // 初始化统计信息\n if (!this.stats.has(eventType)) {\n this.stats.set(eventType, this.createEmptyStats(eventType));\n }\n return listenerId;\n }\n /**\n * 执行事件的内部实现\n * @param eventType 事件类型\n * @param event 事件数据\n */\n async executeEvent(eventType, event) {\n const listeners = this.listeners.get(eventType);\n if (!listeners || listeners.length === 0)\n return;\n const startTime = performance.now();\n const toRemove = [];\n // 按优先级排序\n const sortedListeners = this.sortListenersByPriority(listeners);\n // 分离同步和异步监听器\n const syncListeners = sortedListeners.filter(l => !l.config.async);\n const asyncListeners = sortedListeners.filter(l => l.config.async);\n // 执行同步监听器\n for (const listener of syncListeners) {\n try {\n if (listener.config.context) {\n listener.handler.call(listener.config.context, event);\n }\n else {\n listener.handler(event);\n }\n if (listener.config.once) {\n toRemove.push(listener.id);\n }\n }\n catch (error) {\n console.error(`Error in sync event handler for ${eventType}:`, error);\n }\n }\n // 执行异步监听器\n const asyncPromises = asyncListeners.map(async (listener) => {\n try {\n if (listener.config.context) {\n await listener.handler.call(listener.config.context, event);\n }\n else {\n await listener.handler(event);\n }\n if (listener.config.once) {\n toRemove.push(listener.id);\n }\n }\n catch (error) {\n console.error(`Error in async event handler for ${eventType}:`, error);\n }\n });\n // 等待所有异步监听器完成\n await Promise.all(asyncPromises);\n // 移除一次性监听器\n this.removeListeners(eventType, toRemove);\n // 更新统计信息\n this.updateStats(eventType, performance.now() - startTime);\n }\n /**\n * 按优先级排序监听器\n * @param listeners 监听器数组\n * @returns 排序后的监听器数组\n */\n sortListenersByPriority(listeners) {\n return listeners.slice().sort((a, b) => (b.config.priority || 0) - (a.config.priority || 0));\n }\n /**\n * 移除指定的监听器\n * @param eventType 事件类型\n * @param listenerIds 要移除的监听器ID数组\n */\n removeListeners(eventType, listenerIds) {\n if (listenerIds.length === 0)\n return;\n const listeners = this.listeners.get(eventType);\n if (!listeners)\n return;\n for (const id of listenerIds) {\n const index = listeners.findIndex(l => l.id === id);\n if (index !== -1) {\n listeners.splice(index, 1);\n }\n }\n // 如果没有监听器了,清理相关数据\n if (listeners.length === 0) {\n this.listeners.delete(eventType);\n this.stats.delete(eventType);\n }\n }\n /**\n * 添加事件到批处理队列\n * @param eventType 事件类型\n * @param event 事件数据\n */\n addToBatch(eventType, event) {\n let batch = this.batchQueue.get(eventType);\n if (!batch) {\n batch = [];\n this.batchQueue.set(eventType, batch);\n }\n batch.push(event);\n const config = this.batchConfigs.get(eventType);\n // 如果达到批处理大小,立即处理\n if (batch.length >= config.batchSize) {\n this.flushBatch(eventType);\n return;\n }\n // 设置延迟处理定时器\n if (!this.batchTimers.has(eventType)) {\n const timer = setTimeout(() => {\n this.flushBatch(eventType);\n }, config.delay);\n this.batchTimers.set(eventType, timer);\n }\n }\n /**\n * 处理批处理事件\n * @param eventType 事件类型\n * @param batch 批处理事件数组\n */\n async processBatch(eventType, batch) {\n // 创建批处理事件对象\n const batchEvent = {\n type: eventType,\n events: batch,\n count: batch.length,\n timestamp: Date.now()\n };\n // 触发批处理事件\n await this.executeEvent(`${eventType}:batch`, batchEvent);\n }\n /**\n * 清除指定事件类型的批处理\n * @param eventType 事件类型\n */\n clearBatch(eventType) {\n this.batchQueue.delete(eventType);\n const timer = this.batchTimers.get(eventType);\n if (timer) {\n clearTimeout(timer);\n this.batchTimers.delete(eventType);\n }\n }\n /**\n * 清除所有批处理\n */\n clearAllBatches() {\n this.batchQueue.clear();\n for (const timer of this.batchTimers.values()) {\n clearTimeout(timer);\n }\n this.batchTimers.clear();\n this.batchConfigs.clear();\n }\n /**\n * 更新事件统计信息\n * @param eventType 事件类型\n * @param executionTime 执行时间\n */\n updateStats(eventType, executionTime) {\n let stats = this.stats.get(eventType);\n if (!stats) {\n stats = this.createEmptyStats(eventType);\n this.stats.set(eventType, stats);\n }\n stats.triggerCount++;\n stats.totalExecutionTime += executionTime;\n stats.averageExecutionTime = stats.totalExecutionTime / stats.triggerCount;\n stats.lastTriggerTime = Date.now();\n stats.listenerCount = this.getListenerCount(eventType);\n }\n /**\n * 创建空的统计信息\n * @param eventType 事件类型\n * @returns 空的统计信息\n */\n createEmptyStats(eventType) {\n return {\n eventType,\n listenerCount: 0,\n triggerCount: 0,\n totalExecutionTime: 0,\n averageExecutionTime: 0,\n lastTriggerTime: 0\n };\n }\n}\n/**\n * 全局事件系统实例\n */\nexport const GlobalEventSystem = new TypeSafeEventSystem();\n/**\n * 事件装饰器 - 用于自动注册事件监听器\n * @param eventType 事件类型\n * @param config 监听器配置\n */\nexport function EventListener(eventType, config = {}) {\n return function (target, propertyKey, descriptor) {\n const originalMethod = descriptor.value;\n // 在类实例化时自动注册监听器\n const initMethod = target.constructor.prototype.initEventListeners || function () { };\n target.constructor.prototype.initEventListeners = function () {\n initMethod.call(this);\n GlobalEventSystem.on(eventType, originalMethod.bind(this), config);\n };\n };\n}\n/**\n * 异步事件装饰器\n * @param eventType 事件类型\n * @param config 监听器配置\n */\nexport function AsyncEventListener(eventType, config = {}) {\n return function (target, propertyKey, descriptor) {\n const originalMethod = descriptor.value;\n const initMethod = target.constructor.prototype.initEventListeners || function () { };\n target.constructor.prototype.initEventListeners = function () {\n initMethod.call(this);\n GlobalEventSystem.onAsync(eventType, originalMethod.bind(this), config);\n };\n };\n}\n//# sourceMappingURL=EventSystem.js.map","import { Entity } from './Entity';\nimport { EntityList } from './Utils/EntityList';\nimport { EntityProcessorList } from './Utils/EntityProcessorList';\nimport { IdentifierPool } from './Utils/IdentifierPool';\nimport { ComponentStorageManager } from './Core/ComponentStorage';\nimport { QuerySystem } from './Core/QuerySystem';\nimport { TypeSafeEventSystem } from './Core/EventSystem';\n/**\n * 游戏场景类\n *\n * 管理游戏场景中的所有实体和系统,提供场景生命周期管理。\n * 场景是游戏世界的容器,负责协调实体和系统的运行。\n *\n * @example\n * ```typescript\n * class GameScene extends Scene {\n * public initialize(): void {\n * // 创建游戏实体\n * const player = this.createEntity(\"Player\");\n *\n * // 添加系统\n * this.addEntityProcessor(new MovementSystem());\n * }\n * }\n * ```\n */\nexport class Scene {\n /**\n * 获取系统列表(兼容性属性)\n */\n get systems() {\n return this.entityProcessors.processors;\n }\n /**\n * 创建场景实例\n * @param enableWasmAcceleration 是否启用WebAssembly加速,默认为true\n */\n constructor(enableWasmAcceleration = true) {\n /**\n * 场景名称\n *\n * 用于标识和调试的友好名称。\n */\n this.name = \"\";\n /**\n * 场景是否已开始运行\n */\n this._didSceneBegin = false;\n this.entities = new EntityList(this);\n this.entityProcessors = new EntityProcessorList();\n this.identifierPool = new IdentifierPool();\n this.componentStorageManager = new ComponentStorageManager();\n this.querySystem = new QuerySystem();\n this.eventSystem = new TypeSafeEventSystem();\n this.initialize();\n }\n /**\n * 初始化场景\n *\n * 在场景创建时调用,子类可以重写此方法来设置初始实体和组件。\n */\n initialize() {\n }\n /**\n * 场景开始运行时的回调\n *\n * 在场景开始运行时调用,可以在此方法中执行场景启动逻辑。\n */\n onStart() {\n }\n /**\n * 场景卸载时的回调\n *\n * 在场景被销毁时调用,可以在此方法中执行清理工作。\n */\n unload() {\n }\n /**\n * 开始场景,启动实体处理器等\n *\n * 这个方法会启动场景。它将启动实体处理器等,并调用onStart方法。\n */\n begin() {\n // 启动实体处理器\n if (this.entityProcessors != null)\n this.entityProcessors.begin();\n // 标记场景已开始运行并调用onStart方法\n this._didSceneBegin = true;\n this.onStart();\n }\n /**\n * 结束场景,清除实体、实体处理器等\n *\n * 这个方法会结束场景。它将移除所有实体,结束实体处理器等,并调用unload方法。\n */\n end() {\n // 标记场景已结束运行\n this._didSceneBegin = false;\n // 移除所有实体\n this.entities.removeAllEntities();\n // 清空组件存储\n this.componentStorageManager.clear();\n // 结束实体处理器\n if (this.entityProcessors)\n this.entityProcessors.end();\n // 调用卸载方法\n this.unload();\n }\n /**\n * 更新场景,更新实体组件、实体处理器等\n */\n update() {\n // 更新实体列表\n this.entities.updateLists();\n // 更新实体处理器\n if (this.entityProcessors != null)\n this.entityProcessors.update();\n // 更新实体组\n this.entities.update();\n // 更新实体处理器的后处理方法\n if (this.entityProcessors != null)\n this.entityProcessors.lateUpdate();\n }\n /**\n * 将实体添加到此场景,并返回它\n * @param name 实体名称\n */\n createEntity(name) {\n let entity = new Entity(name, this.identifierPool.checkOut());\n return this.addEntity(entity);\n }\n /**\n * 在场景的实体列表中添加一个实体\n * @param entity 要添加的实体\n * @param deferCacheClear 是否延迟缓存清理(用于批量操作)\n */\n addEntity(entity, deferCacheClear = false) {\n this.entities.add(entity);\n entity.scene = this;\n // 将实体添加到查询系统(可延迟缓存清理)\n this.querySystem.addEntity(entity, deferCacheClear);\n // 触发实体添加事件\n this.eventSystem.emitSync('entity:added', { entity, scene: this });\n return entity;\n }\n /**\n * 批量创建实体(高性能版本)\n * @param count 要创建的实体数量\n * @param namePrefix 实体名称前缀\n * @returns 创建的实体列表\n */\n createEntities(count, namePrefix = \"Entity\") {\n const entities = [];\n // 批量创建实体对象,不立即添加到系统\n for (let i = 0; i < count; i++) {\n const entity = new Entity(`${namePrefix}_${i}`, this.identifierPool.checkOut());\n entity.scene = this;\n entities.push(entity);\n }\n // 批量添加到实体列表\n for (const entity of entities) {\n this.entities.add(entity);\n }\n // 批量添加到查询系统(无重复检查,性能最优)\n this.querySystem.addEntitiesUnchecked(entities);\n // 批量触发事件(可选,减少事件开销)\n this.eventSystem.emitSync('entities:batch_added', { entities, scene: this, count });\n return entities;\n }\n /**\n * 批量创建实体\n * @param count 要创建的实体数量\n * @param namePrefix 实体名称前缀\n * @returns 创建的实体列表\n */\n createEntitiesOld(count, namePrefix = \"Entity\") {\n const entities = [];\n // 批量创建实体,延迟缓存清理\n for (let i = 0; i < count; i++) {\n const entity = new Entity(`${namePrefix}_${i}`, this.identifierPool.checkOut());\n entities.push(entity);\n this.addEntity(entity, true); // 延迟缓存清理\n }\n // 最后统一清理缓存\n this.querySystem.clearCache();\n return entities;\n }\n /**\n * 从场景中删除所有实体\n */\n destroyAllEntities() {\n for (let i = 0; i < this.entities.count; i++) {\n this.entities.buffer[i].destroy();\n }\n }\n /**\n * 搜索并返回第一个具有名称的实体\n * @param name 实体名称\n */\n findEntity(name) {\n return this.entities.findEntity(name);\n }\n /**\n * 根据ID查找实体\n * @param id 实体ID\n */\n findEntityById(id) {\n return this.entities.findEntityById(id);\n }\n /**\n * 根据标签查找实体\n * @param tag 实体标签\n */\n findEntitiesByTag(tag) {\n const result = [];\n for (const entity of this.entities.buffer) {\n if (entity.tag === tag) {\n result.push(entity);\n }\n }\n return result;\n }\n /**\n * 根据名称查找实体(别名方法)\n * @param name 实体名称\n */\n getEntityByName(name) {\n return this.findEntity(name);\n }\n /**\n * 根据标签查找实体(别名方法)\n * @param tag 实体标签\n */\n getEntitiesByTag(tag) {\n return this.findEntitiesByTag(tag);\n }\n /**\n * 在场景中添加一个EntitySystem处理器\n * @param processor 处理器\n */\n addEntityProcessor(processor) {\n processor.scene = this;\n this.entityProcessors.add(processor);\n processor.setUpdateOrder(this.entityProcessors.count - 1);\n return processor;\n }\n /**\n * 添加系统到场景(addEntityProcessor的别名)\n * @param system 系统\n */\n addSystem(system) {\n return this.addEntityProcessor(system);\n }\n /**\n * 从场景中删除EntitySystem处理器\n * @param processor 要删除的处理器\n */\n removeEntityProcessor(processor) {\n this.entityProcessors.remove(processor);\n }\n /**\n * 获取指定类型的EntitySystem处理器\n * @param type 处理器类型\n */\n getEntityProcessor(type) {\n return this.entityProcessors.getProcessor(type);\n }\n /**\n * 获取场景统计信息\n */\n getStats() {\n return {\n entityCount: this.entities.count,\n processorCount: this.entityProcessors.count,\n componentStorageStats: this.componentStorageManager.getAllStats()\n };\n }\n /**\n * 压缩组件存储(清理碎片)\n */\n compactComponentStorage() {\n this.componentStorageManager.compactAll();\n }\n /**\n * 获取场景的调试信息\n */\n getDebugInfo() {\n return {\n name: this.constructor.name,\n entityCount: this.entities.count,\n processorCount: this.entityProcessors.count,\n isRunning: this._didSceneBegin,\n entities: this.entities.buffer.map(entity => ({\n name: entity.name,\n id: entity.id,\n componentCount: entity.components.length,\n componentTypes: entity.components.map(c => c.constructor.name)\n })),\n processors: this.entityProcessors.processors.map(processor => ({\n name: processor.constructor.name,\n updateOrder: processor.updateOrder,\n entityCount: processor._entities?.length || 0\n })),\n componentStats: this.componentStorageManager.getAllStats()\n };\n }\n}\n//# sourceMappingURL=Scene.js.map","import { Entity } from '../Entity';\nimport { Scene } from '../Scene';\nimport { QueryBuilder } from './QuerySystem';\n/**\n * 实体构建器 - 提供流式API创建和配置实体\n */\nexport class EntityBuilder {\n constructor(scene, storageManager) {\n this.scene = scene;\n this.storageManager = storageManager;\n this.entity = new Entity(\"\", scene.identifierPool.checkOut());\n }\n /**\n * 设置实体名称\n * @param name 实体名称\n * @returns 实体构建器\n */\n named(name) {\n this.entity.name = name;\n return this;\n }\n /**\n * 设置实体标签\n * @param tag 标签\n * @returns 实体构建器\n */\n tagged(tag) {\n this.entity.tag = tag;\n return this;\n }\n /**\n * 添加组件\n * @param component 组件实例\n * @returns 实体构建器\n */\n with(component) {\n this.entity.addComponent(component);\n return this;\n }\n /**\n * 添加多个组件\n * @param components 组件数组\n * @returns 实体构建器\n */\n withComponents(...components) {\n for (const component of components) {\n this.entity.addComponent(component);\n }\n return this;\n }\n /**\n * 条件性添加组件\n * @param condition 条件\n * @param component 组件实例\n * @returns 实体构建器\n */\n withIf(condition, component) {\n if (condition) {\n this.entity.addComponent(component);\n }\n return this;\n }\n /**\n * 使用工厂函数创建并添加组件\n * @param factory 组件工厂函数\n * @returns 实体构建器\n */\n withFactory(factory) {\n const component = factory();\n this.entity.addComponent(component);\n return this;\n }\n /**\n * 配置组件属性\n * @param componentType 组件类型\n * @param configurator 配置函数\n * @returns 实体构建器\n */\n configure(componentType, configurator) {\n const component = this.entity.getComponent(componentType);\n if (component) {\n configurator(component);\n }\n return this;\n }\n /**\n * 设置实体为启用状态\n * @param enabled 是否启用\n * @returns 实体构建器\n */\n enabled(enabled = true) {\n this.entity.enabled = enabled;\n return this;\n }\n /**\n * 设置实体为活跃状态\n * @param active 是否活跃\n * @returns 实体构建器\n */\n active(active = true) {\n this.entity.active = active;\n return this;\n }\n /**\n * 添加子实体\n * @param childBuilder 子实体构建器\n * @returns 实体构建器\n */\n withChild(childBuilder) {\n const child = childBuilder.build();\n this.entity.addChild(child);\n return this;\n }\n /**\n * 批量添加子实体\n * @param childBuilders 子实体构建器数组\n * @returns 实体构建器\n */\n withChildren(...childBuilders) {\n for (const childBuilder of childBuilders) {\n const child = childBuilder.build();\n this.entity.addChild(child);\n }\n return this;\n }\n /**\n * 使用工厂函数创建子实体\n * @param childFactory 子实体工厂函数\n * @returns 实体构建器\n */\n withChildFactory(childFactory) {\n const childBuilder = childFactory(this.entity);\n const child = childBuilder.build();\n this.entity.addChild(child);\n return this;\n }\n /**\n * 条件性添加子实体\n * @param condition 条件\n * @param childBuilder 子实体构建器\n * @returns 实体构建器\n */\n withChildIf(condition, childBuilder) {\n if (condition) {\n const child = childBuilder.build();\n this.entity.addChild(child);\n }\n return this;\n }\n /**\n * 构建并返回实体\n * @returns 构建的实体\n */\n build() {\n return this.entity;\n }\n /**\n * 构建实体并添加到场景\n * @returns 构建的实体\n */\n spawn() {\n this.scene.addEntity(this.entity);\n return this.entity;\n }\n /**\n * 克隆当前构建器\n * @returns 新的实体构建器\n */\n clone() {\n const newBuilder = new EntityBuilder(this.scene, this.storageManager);\n // 这里需要深度克隆实体,简化实现\n newBuilder.entity = this.entity; // 实际应该是深度克隆\n return newBuilder;\n }\n}\n/**\n * 场景构建器 - 提供流式API创建和配置场景\n */\nexport class SceneBuilder {\n constructor() {\n this.scene = new Scene();\n }\n /**\n * 设置场景名称\n * @param name 场景名称\n * @returns 场景构建器\n */\n named(name) {\n this.scene.name = name;\n return this;\n }\n /**\n * 添加实体\n * @param entity 实体\n * @returns 场景构建器\n */\n withEntity(entity) {\n this.scene.addEntity(entity);\n return this;\n }\n /**\n * 使用实体构建器添加实体\n * @param builderFn 实体构建器函数\n * @returns 场景构建器\n */\n withEntityBuilder(builderFn) {\n const builder = new EntityBuilder(this.scene, this.scene.componentStorageManager);\n const configuredBuilder = builderFn(builder);\n const entity = configuredBuilder.build();\n this.scene.addEntity(entity);\n return this;\n }\n /**\n * 批量添加实体\n * @param entities 实体数组\n * @returns 场景构建器\n */\n withEntities(...entities) {\n for (const entity of entities) {\n this.scene.addEntity(entity);\n }\n return this;\n }\n /**\n * 添加系统\n * @param system 系统实例\n * @returns 场景构建器\n */\n withSystem(system) {\n this.scene.addSystem(system);\n return this;\n }\n /**\n * 批量添加系统\n * @param systems 系统数组\n * @returns 场景构建器\n */\n withSystems(...systems) {\n for (const system of systems) {\n this.scene.addSystem(system);\n }\n return this;\n }\n /**\n * 构建并返回场景\n * @returns 构建的场景\n */\n build() {\n return this.scene;\n }\n}\n/**\n * 组件构建器 - 提供流式API创建组件\n */\nexport class ComponentBuilder {\n constructor(componentClass, ...args) {\n this.component = new componentClass(...args);\n }\n /**\n * 设置组件属性\n * @param property 属性名\n * @param value 属性值\n * @returns 组件构建器\n */\n set(property, value) {\n this.component[property] = value;\n return this;\n }\n /**\n * 使用配置函数设置组件\n * @param configurator 配置函数\n * @returns 组件构建器\n */\n configure(configurator) {\n configurator(this.component);\n return this;\n }\n /**\n * 条件性设置属性\n * @param condition 条件\n * @param property 属性名\n * @param value 属性值\n * @returns 组件构建器\n */\n setIf(condition, property, value) {\n if (condition) {\n this.component[property] = value;\n }\n return this;\n }\n /**\n * 构建并返回组件\n * @returns 构建的组件\n */\n build() {\n return this.component;\n }\n}\n/**\n * ECS流式API主入口\n * 提供统一的流式接口\n */\nexport class ECSFluentAPI {\n constructor(scene, querySystem, eventSystem) {\n this.scene = scene;\n this.querySystem = querySystem;\n this.eventSystem = eventSystem;\n }\n /**\n * 创建实体构建器\n * @returns 实体构建器\n */\n createEntity() {\n return new EntityBuilder(this.scene, this.scene.componentStorageManager);\n }\n /**\n * 创建场景构建器\n * @returns 场景构建器\n */\n createScene() {\n return new SceneBuilder();\n }\n /**\n * 创建组件构建器\n * @param componentClass 组件类\n * @param args 构造参数\n * @returns 组件构建器\n */\n createComponent(componentClass, ...args) {\n return new ComponentBuilder(componentClass, ...args);\n }\n /**\n * 创建查询构建器\n * @returns 查询构建器\n */\n query() {\n return new QueryBuilder(this.querySystem);\n }\n /**\n * 查找实体(简化版)\n * @param componentTypes 组件类型\n * @returns 实体数组\n */\n find(...componentTypes) {\n return this.querySystem.queryAll(...componentTypes).entities;\n }\n /**\n * 查找第一个匹配的实体\n * @param componentTypes 组件类型\n * @returns 实体或null\n */\n findFirst(...componentTypes) {\n const result = this.querySystem.queryAll(...componentTypes);\n return result.entities.length > 0 ? result.entities[0] : null;\n }\n /**\n * 按名称查找实体\n * @param name 实体名称\n * @returns 实体或null\n */\n findByName(name) {\n return this.scene.getEntityByName(name);\n }\n /**\n * 按标签查找实体\n * @param tag 标签\n * @returns 实体数组\n */\n findByTag(tag) {\n return this.scene.getEntitiesByTag(tag);\n }\n /**\n * 触发事件\n * @param eventType 事件类型\n * @param event 事件数据\n */\n emit(eventType, event) {\n this.eventSystem.emitSync(eventType, event);\n }\n /**\n * 异步触发事件\n * @param eventType 事件类型\n * @param event 事件数据\n */\n async emitAsync(eventType, event) {\n await this.eventSystem.emit(eventType, event);\n }\n /**\n * 监听事件\n * @param eventType 事件类型\n * @param handler 事件处理器\n * @returns 监听器ID\n */\n on(eventType, handler) {\n return this.eventSystem.on(eventType, handler);\n }\n /**\n * 一次性监听事件\n * @param eventType 事件类型\n * @param handler 事件处理器\n * @returns 监听器ID\n */\n once(eventType, handler) {\n return this.eventSystem.once(eventType, handler);\n }\n /**\n * 移除事件监听器\n * @param eventType 事件类型\n * @param listenerId 监听器ID\n */\n off(eventType, listenerId) {\n this.eventSystem.off(eventType, listenerId);\n }\n /**\n * 批量操作实体\n * @param entities 实体数组\n * @returns 批量操作器\n */\n batch(entities) {\n return new EntityBatchOperator(entities);\n }\n /**\n * 获取场景统计信息\n * @returns 统计信息\n */\n getStats() {\n return {\n entityCount: this.scene.entities.count,\n systemCount: this.scene.systems.length,\n componentStats: this.scene.componentStorageManager.getAllStats(),\n queryStats: this.querySystem.getStats(),\n eventStats: this.eventSystem.getStats()\n };\n }\n}\n/**\n * 实体批量操作器\n * 提供对多个实体的批量操作\n */\nexport class EntityBatchOperator {\n constructor(entities) {\n this.entities = entities;\n }\n /**\n * 批量添加组件\n * @param component 组件实例\n * @returns 批量操作器\n */\n addComponent(component) {\n for (const entity of this.entities) {\n entity.addComponent(component);\n }\n return this;\n }\n /**\n * 批量移除组件\n * @param componentType 组件类型\n * @returns 批量操作器\n */\n removeComponent(componentType) {\n for (const entity of this.entities) {\n entity.removeComponentByType(componentType);\n }\n return this;\n }\n /**\n * 批量设置活跃状态\n * @param active 是否活跃\n * @returns 批量操作器\n */\n setActive(active) {\n for (const entity of this.entities) {\n entity.active = active;\n }\n return this;\n }\n /**\n * 批量设置标签\n * @param tag 标签\n * @returns 批量操作器\n */\n setTag(tag) {\n for (const entity of this.entities) {\n entity.tag = tag;\n }\n return this;\n }\n /**\n * 批量执行操作\n * @param operation 操作函数\n * @returns 批量操作器\n */\n forEach(operation) {\n this.entities.forEach(operation);\n return this;\n }\n /**\n * 过滤实体\n * @param predicate 过滤条件\n * @returns 新的批量操作器\n */\n filter(predicate) {\n return new EntityBatchOperator(this.entities.filter(predicate));\n }\n /**\n * 获取实体数组\n * @returns 实体数组\n */\n toArray() {\n return this.entities.slice();\n }\n /**\n * 获取实体数量\n * @returns 实体数量\n */\n count() {\n return this.entities.length;\n }\n}\n/**\n * 创建ECS流式API实例\n * @param scene 场景\n * @param querySystem 查询系统\n * @param eventSystem 事件系统\n * @returns ECS流式API实例\n */\nexport function createECSAPI(scene, querySystem, eventSystem) {\n return new ECSFluentAPI(scene, querySystem, eventSystem);\n}\n/**\n * 全局ECS流式API实例(需要在使用前初始化)\n */\nexport let ECS;\n/**\n * 初始化全局ECS API\n * @param scene 场景\n * @param querySystem 查询系统\n * @param eventSystem 事件系统\n */\nexport function initializeECS(scene, querySystem, eventSystem) {\n ECS = createECSAPI(scene, querySystem, eventSystem);\n}\n//# sourceMappingURL=FluentAPI.js.map","import { Emitter } from './Utils/Emitter';\nimport { CoreEvents } from './ECS/CoreEvents';\nimport { TimerManager } from './Utils/Timers/TimerManager';\nimport { Time } from './Utils/Time';\nimport { PerformanceMonitor } from './Utils/PerformanceMonitor';\nimport { PoolManager } from './Utils/Pool';\nimport { createECSAPI } from './ECS/Core/FluentAPI';\n/**\n * 游戏引擎核心类\n *\n * 负责管理游戏的生命周期、场景切换、全局管理器和定时器系统。\n * 提供统一的游戏循环和事件分发机制。\n *\n * @example\n * ```typescript\n * // 创建核心实例\n * const core = Core.create(true);\n *\n * // 设置场景\n * Core.scene = new MyScene();\n *\n * // 调度定时器\n * Core.schedule(1.0, false, null, (timer) => {\n * console.log(\"1秒后执行\");\n * });\n * ```\n */\nexport class Core {\n /**\n * 创建核心实例\n *\n * @param debug - 是否启用调试模式,默认为true\n * @param enableEntitySystems - 是否启用实体系统,默认为true\n */\n constructor(debug = true, enableEntitySystems = true) {\n /**\n * 待切换的场景\n *\n * 存储下一帧要切换到的场景实例。\n */\n this._nextScene = null;\n /**\n * 全局管理器集合\n *\n * 存储所有注册的全局管理器实例。\n */\n this._globalManagers = [];\n Core._instance = this;\n Core.emitter = new Emitter();\n Core.emitter.addObserver(CoreEvents.frameUpdated, this.update, this);\n // 初始化管理器\n this._timerManager = new TimerManager();\n Core.registerGlobalManager(this._timerManager);\n // 初始化性能监控器\n this._performanceMonitor = PerformanceMonitor.instance;\n // 初始化对象池管理器\n this._poolManager = PoolManager.getInstance();\n Core.entitySystemsEnabled = enableEntitySystems;\n this.debug = debug;\n this.initialize();\n }\n /**\n * 获取核心实例\n *\n * @returns 全局核心实例\n */\n static get Instance() {\n return this._instance;\n }\n /**\n * 获取当前活动的场景\n *\n * @returns 当前场景实例,如果没有则返回null\n */\n static get scene() {\n if (!this._instance)\n return null;\n return this._instance._scene || null;\n }\n /**\n * 设置当前活动的场景\n *\n * 如果当前没有场景,会立即切换;否则会在下一帧切换。\n *\n * @param value - 要设置的场景实例\n * @throws {Error} 当场景为空时抛出错误\n */\n static set scene(value) {\n if (!value)\n return;\n if (!value) {\n throw new Error(\"场景不能为空\");\n }\n if (this._instance._scene == null) {\n this._instance._scene = value;\n this._instance.onSceneChanged();\n this._instance._scene.begin();\n }\n else {\n this._instance._nextScene = value;\n }\n }\n /**\n * 创建Core实例\n *\n * 如果实例已存在,则返回现有实例。\n *\n * @param debug - 是否为调试模式,默认为true\n * @returns Core实例\n */\n static create(debug = true) {\n if (this._instance == null) {\n this._instance = new Core(debug);\n }\n return this._instance;\n }\n /**\n * 注册全局管理器\n *\n * 将管理器添加到全局管理器列表中,并启用它。\n *\n * @param manager - 要注册的全局管理器\n */\n static registerGlobalManager(manager) {\n this._instance._globalManagers.push(manager);\n manager.enabled = true;\n }\n /**\n * 注销全局管理器\n *\n * 从全局管理器列表中移除管理器,并禁用它。\n *\n * @param manager - 要注销的全局管理器\n */\n static unregisterGlobalManager(manager) {\n this._instance._globalManagers.splice(this._instance._globalManagers.indexOf(manager), 1);\n manager.enabled = false;\n }\n /**\n * 获取指定类型的全局管理器\n *\n * @param type - 管理器类型构造函数\n * @returns 管理器实例,如果未找到则返回null\n */\n static getGlobalManager(type) {\n for (const manager of this._instance._globalManagers) {\n if (manager instanceof type)\n return manager;\n }\n return null;\n }\n /**\n * 调度定时器\n *\n * 创建一个定时器,在指定时间后执行回调函数。\n *\n * @param timeInSeconds - 延迟时间(秒)\n * @param repeats - 是否重复执行,默认为false\n * @param context - 回调函数的上下文,默认为null\n * @param onTime - 定时器触发时的回调函数\n * @returns 创建的定时器实例\n */\n static schedule(timeInSeconds, repeats = false, context = null, onTime) {\n return this._instance._timerManager.schedule(timeInSeconds, repeats, context, onTime);\n }\n /**\n * 获取ECS流式API\n *\n * @returns ECS API实例,如果未初始化则返回null\n */\n static get ecsAPI() {\n return this._instance?._ecsAPI || null;\n }\n /**\n * 场景切换回调\n *\n * 在场景切换时调用,用于重置时间系统等。\n */\n onSceneChanged() {\n Time.sceneChanged();\n // 初始化ECS API(如果场景支持)\n if (this._scene && typeof this._scene.querySystem !== 'undefined') {\n const scene = this._scene;\n this._ecsAPI = createECSAPI(scene, scene.querySystem, scene.eventSystem);\n }\n }\n /**\n * 初始化核心系统\n *\n * 执行核心系统的初始化逻辑。\n */\n initialize() {\n // 核心系统初始化\n }\n /**\n * 游戏主循环更新\n *\n * 每帧调用,负责更新时间系统、全局管理器和当前场景。\n *\n * @param currentTime - 当前时间戳,默认为-1(使用系统时间)\n */\n update(currentTime = -1) {\n if (Core.paused)\n return;\n // 开始性能监控\n const frameStartTime = this._performanceMonitor.startMonitoring('Core.update');\n Time.update(currentTime);\n // 更新FPS监控(如果性能监控器支持)\n if (typeof this._performanceMonitor.updateFPS === 'function') {\n this._performanceMonitor.updateFPS(Time.deltaTime);\n }\n // 更新全局管理器\n const managersStartTime = this._performanceMonitor.startMonitoring('GlobalManagers.update');\n for (const globalManager of this._globalManagers) {\n if (globalManager.enabled)\n globalManager.update();\n }\n this._performanceMonitor.endMonitoring('GlobalManagers.update', managersStartTime, this._globalManagers.length);\n // 更新对象池管理器\n this._poolManager.update();\n // 处理场景切换\n if (this._nextScene != null) {\n if (this._scene != null)\n this._scene.end();\n this._scene = this._nextScene;\n this._nextScene = null;\n this.onSceneChanged();\n this._scene.begin();\n }\n // 更新当前场景\n if (this._scene != null && this._scene.update) {\n const sceneStartTime = this._performanceMonitor.startMonitoring('Scene.update');\n this._scene.update();\n const entityCount = this._scene.entities?.count || 0;\n this._performanceMonitor.endMonitoring('Scene.update', sceneStartTime, entityCount);\n }\n // 结束性能监控\n this._performanceMonitor.endMonitoring('Core.update', frameStartTime);\n }\n}\n/**\n * 游戏暂停状态\n *\n * 当设置为true时,游戏循环将暂停执行。\n */\nCore.paused = false;\n//# sourceMappingURL=Core.js.map","/**\n * 游戏组件基类\n *\n * ECS架构中的组件(Component),用于实现具体的游戏功能。\n * 组件包含数据和行为,可以被添加到实体上以扩展实体的功能。\n *\n * @example\n * ```typescript\n * class HealthComponent extends Component {\n * public health: number = 100;\n *\n * public takeDamage(damage: number): void {\n * this.health -= damage;\n * if (this.health <= 0) {\n * this.entity.destroy();\n * }\n * }\n * }\n * ```\n */\nexport class Component {\n /**\n * 创建组件实例\n *\n * 自动分配唯一ID给组件。\n */\n constructor() {\n /**\n * 组件启用状态\n *\n * 控制组件是否参与更新循环。\n */\n this._enabled = true;\n /**\n * 更新顺序\n *\n * 决定组件在更新循环中的执行顺序。\n */\n this._updateOrder = 0;\n this.id = Component._idGenerator++;\n }\n /**\n * 获取组件启用状态\n *\n * 组件的实际启用状态取决于自身状态和所属实体的状态。\n *\n * @returns 如果组件和所属实体都启用则返回true\n */\n get enabled() {\n return this.entity ? this.entity.enabled && this._enabled : this._enabled;\n }\n /**\n * 设置组件启用状态\n *\n * 当状态改变时会触发相应的生命周期回调。\n *\n * @param value - 新的启用状态\n */\n set enabled(value) {\n if (this._enabled !== value) {\n this._enabled = value;\n if (this._enabled) {\n this.onEnabled();\n }\n else {\n this.onDisabled();\n }\n }\n }\n /**\n * 获取更新顺序\n *\n * @returns 组件的更新顺序值\n */\n get updateOrder() {\n return this._updateOrder;\n }\n /**\n * 设置更新顺序\n *\n * @param value - 新的更新顺序值\n */\n set updateOrder(value) {\n this._updateOrder = value;\n }\n /**\n * 组件添加到实体时的回调\n *\n * 当组件被添加到实体时调用,可以在此方法中进行初始化操作。\n */\n onAddedToEntity() {\n }\n /**\n * 组件从实体移除时的回调\n *\n * 当组件从实体中移除时调用,可以在此方法中进行清理操作。\n */\n onRemovedFromEntity() {\n }\n /**\n * 组件启用时的回调\n *\n * 当组件被启用时调用。\n */\n onEnabled() {\n }\n /**\n * 组件禁用时的回调\n *\n * 当组件被禁用时调用。\n */\n onDisabled() {\n }\n /**\n * 更新组件\n *\n * 每帧调用,用于更新组件的逻辑。\n * 子类应该重写此方法来实现具体的更新逻辑。\n */\n update() {\n }\n}\n/**\n * 组件ID生成器\n *\n * 用于为每个组件分配唯一的ID。\n */\nComponent._idGenerator = 0;\n//# sourceMappingURL=Component.js.map","/**\n * 高性能位操作类\n * 用于快速操作位数组,支持组件匹配等场景\n */\nexport class Bits {\n constructor() {\n this._words = [];\n this._words = [];\n }\n /**\n * 设置指定位置的位为1\n * @param index 位置索引\n */\n set(index) {\n const wordIndex = Math.floor(index / Bits.WORD_SIZE);\n const bitIndex = index % Bits.WORD_SIZE;\n // 确保数组足够大\n while (this._words.length <= wordIndex) {\n this._words.push(0);\n }\n this._words[wordIndex] |= (1 << bitIndex);\n }\n /**\n * 清除指定位置的位(设为0)\n * @param index 位置索引\n */\n clear(index) {\n const wordIndex = Math.floor(index / Bits.WORD_SIZE);\n const bitIndex = index % Bits.WORD_SIZE;\n if (wordIndex < this._words.length) {\n this._words[wordIndex] &= ~(1 << bitIndex);\n }\n }\n /**\n * 获取指定位置的位值\n * @param index 位置索引\n * @returns 位值(true或false)\n */\n get(index) {\n const wordIndex = Math.floor(index / Bits.WORD_SIZE);\n const bitIndex = index % Bits.WORD_SIZE;\n if (wordIndex >= this._words.length) {\n return false;\n }\n return (this._words[wordIndex] & (1 << bitIndex)) !== 0;\n }\n /**\n * 检查是否包含所有指定的位\n * @param other 另一个Bits对象\n * @returns 如果包含所有位则返回true\n */\n containsAll(other) {\n const maxLength = Math.max(this._words.length, other._words.length);\n for (let i = 0; i < maxLength; i++) {\n const thisWord = i < this._words.length ? this._words[i] : 0;\n const otherWord = i < other._words.length ? other._words[i] : 0;\n if ((thisWord & otherWord) !== otherWord) {\n return false;\n }\n }\n return true;\n }\n /**\n * 检查是否包含任意一个指定的位\n * @param other 另一个Bits对象\n * @returns 如果包含任意位则返回true\n */\n intersects(other) {\n const minLength = Math.min(this._words.length, other._words.length);\n for (let i = 0; i < minLength; i++) {\n if ((this._words[i] & other._words[i]) !== 0) {\n return true;\n }\n }\n return false;\n }\n /**\n * 检查是否不包含任何指定的位\n * @param other 另一个Bits对象\n * @returns 如果不包含任何位则返回true\n */\n excludes(other) {\n return !this.intersects(other);\n }\n /**\n * 清空所有位\n */\n clearAll() {\n this._words.length = 0;\n }\n /**\n * 检查是否为空(没有设置任何位)\n * @returns 如果为空则返回true\n */\n isEmpty() {\n for (const word of this._words) {\n if (word !== 0) {\n return false;\n }\n }\n return true;\n }\n /**\n * 获取设置的位数量\n * @returns 设置的位数量\n */\n cardinality() {\n let count = 0;\n for (const word of this._words) {\n count += this.popCount(word);\n }\n return count;\n }\n /**\n * 计算一个32位整数中设置的位数量\n * @param n 32位整数\n * @returns 设置的位数量\n */\n popCount(n) {\n n = n - ((n >>> 1) & 0x55555555);\n n = (n & 0x33333333) + ((n >>> 2) & 0x33333333);\n return (((n + (n >>> 4)) & 0xF0F0F0F) * 0x1010101) >>> 24;\n }\n /**\n * 复制另一个Bits对象\n * @param other 要复制的Bits对象\n */\n copyFrom(other) {\n this._words = [...other._words];\n }\n /**\n * 创建当前Bits的副本\n * @returns 新的Bits对象\n */\n clone() {\n const newBits = new Bits();\n newBits.copyFrom(this);\n return newBits;\n }\n}\nBits.WORD_SIZE = 32;\n//# sourceMappingURL=Bits.js.map","import { Bits } from './Bits';\n/**\n * 组件类型管理器\n * 负责管理组件类型的注册和ID分配\n */\nexport class ComponentTypeManager {\n /**\n * 获取单例实例\n */\n static get instance() {\n if (!ComponentTypeManager._instance) {\n ComponentTypeManager._instance = new ComponentTypeManager();\n }\n return ComponentTypeManager._instance;\n }\n constructor() {\n this._componentTypes = new Map();\n this._typeNames = new Map();\n this._nextTypeId = 0;\n }\n /**\n * 获取组件类型的ID\n * @param componentType 组件类型构造函数\n * @returns 组件类型ID\n */\n getTypeId(componentType) {\n let typeId = this._componentTypes.get(componentType);\n if (typeId === undefined) {\n typeId = this._nextTypeId++;\n this._componentTypes.set(componentType, typeId);\n this._typeNames.set(typeId, componentType.name);\n }\n return typeId;\n }\n /**\n * 获取组件类型名称\n * @param typeId 组件类型ID\n * @returns 组件类型名称\n */\n getTypeName(typeId) {\n return this._typeNames.get(typeId) || 'Unknown';\n }\n /**\n * 创建包含指定组件类型的Bits对象\n * @param componentTypes 组件类型构造函数数组\n * @returns Bits对象\n */\n createBits(...componentTypes) {\n const bits = new Bits();\n for (const componentType of componentTypes) {\n const typeId = this.getTypeId(componentType);\n bits.set(typeId);\n }\n return bits;\n }\n /**\n * 获取实体的组件位掩码\n * @param components 组件数组\n * @returns Bits对象\n */\n getEntityBits(components) {\n const bits = new Bits();\n for (const component of components) {\n const typeId = this.getTypeId(component.constructor);\n bits.set(typeId);\n }\n return bits;\n }\n /**\n * 重置管理器(主要用于测试)\n */\n reset() {\n this._componentTypes.clear();\n this._typeNames.clear();\n this._nextTypeId = 0;\n }\n /**\n * 获取已注册的组件类型数量\n */\n get registeredTypeCount() {\n return this._componentTypes.size;\n }\n}\n//# sourceMappingURL=ComponentTypeManager.js.map","import { ComponentTypeManager } from './ComponentTypeManager';\n/**\n * 高性能实体匹配器\n * 用于快速匹配符合条件的实体\n */\nexport class Matcher {\n constructor() {\n this.allSet = [];\n this.exclusionSet = [];\n this.oneSet = [];\n this._isDirty = true;\n }\n static empty() {\n return new Matcher();\n }\n getAllSet() {\n return this.allSet;\n }\n getExclusionSet() {\n return this.exclusionSet;\n }\n getOneSet() {\n return this.oneSet;\n }\n /**\n * 检查实体是否匹配条件\n * @param entity 要检查的实体\n * @returns 是否匹配\n */\n isInterestedEntity(entity) {\n const entityBits = this.getEntityBits(entity);\n return this.isInterested(entityBits);\n }\n /**\n * 检查组件位掩码是否匹配条件\n * @param componentBits 组件位掩码\n * @returns 是否匹配\n */\n isInterested(componentBits) {\n this.updateBitsIfDirty();\n // 检查必须包含的组件\n if (this._allBits && !componentBits.containsAll(this._allBits)) {\n return false;\n }\n // 检查排除的组件\n if (this._exclusionBits && componentBits.intersects(this._exclusionBits)) {\n return false;\n }\n // 检查至少包含其中之一的组件\n if (this._oneBits && !componentBits.intersects(this._oneBits)) {\n return false;\n }\n return true;\n }\n /**\n * 添加所有包含的组件类型\n * @param types 所有包含的组件类型列表\n */\n all(...types) {\n this.allSet.push(...types);\n this._isDirty = true;\n return this;\n }\n /**\n * 添加排除包含的组件类型\n * @param types 排除包含的组件类型列表\n */\n exclude(...types) {\n this.exclusionSet.push(...types);\n this._isDirty = true;\n return this;\n }\n /**\n * 添加至少包含其中之一的组件类型\n * @param types 至少包含其中之一的组件类型列表\n */\n one(...types) {\n this.oneSet.push(...types);\n this._isDirty = true;\n return this;\n }\n /**\n * 获取实体的组件位掩码\n * @param entity 实体\n * @returns 组件位掩码\n */\n getEntityBits(entity) {\n const components = entity.components;\n return ComponentTypeManager.instance.getEntityBits(components);\n }\n /**\n * 如果位掩码已过期,则更新它们\n */\n updateBitsIfDirty() {\n if (!this._isDirty) {\n return;\n }\n const typeManager = ComponentTypeManager.instance;\n // 更新必须包含的组件位掩码\n if (this.allSet.length > 0) {\n this._allBits = typeManager.createBits(...this.allSet);\n }\n else {\n this._allBits = undefined;\n }\n // 更新排除的组件位掩码\n if (this.exclusionSet.length > 0) {\n this._exclusionBits = typeManager.createBits(...this.exclusionSet);\n }\n else {\n this._exclusionBits = undefined;\n }\n // 更新至少包含其中之一的组件位掩码\n if (this.oneSet.length > 0) {\n this._oneBits = typeManager.createBits(...this.oneSet);\n }\n else {\n this._oneBits = undefined;\n }\n this._isDirty = false;\n }\n /**\n * 创建匹配器的字符串表示(用于调试)\n * @returns 字符串表示\n */\n toString() {\n const parts = [];\n if (this.allSet.length > 0) {\n parts.push(`all: [${this.allSet.map(t => t.name).join(', ')}]`);\n }\n if (this.exclusionSet.length > 0) {\n parts.push(`exclude: [${this.exclusionSet.map(t => t.name).join(', ')}]`);\n }\n if (this.oneSet.length > 0) {\n parts.push(`one: [${this.oneSet.map(t => t.name).join(', ')}]`);\n }\n return `Matcher(${parts.join(', ')})`;\n }\n}\n//# sourceMappingURL=Matcher.js.map","import { Matcher } from '../Utils/Matcher';\nimport { PerformanceMonitor } from '../../Utils/PerformanceMonitor';\n/**\n * 实体系统的基类\n *\n * 用于处理一组符合特定条件的实体。系统是ECS架构中的逻辑处理单元,\n * 负责对拥有特定组件组合的实体执行业务逻辑。\n *\n * @example\n * ```typescript\n * class MovementSystem extends EntitySystem {\n * constructor() {\n * super(Matcher.empty().all(Transform, Velocity));\n * }\n *\n * protected process(entities: Entity[]): void {\n * for (const entity of entities) {\n * const transform = entity.getComponent(Transform);\n * const velocity = entity.getComponent(Velocity);\n * transform.position.add(velocity.value);\n * }\n * }\n * }\n * ```\n */\nexport class EntitySystem {\n /**\n * 获取系统处理的实体列表\n */\n get entities() {\n return this._entities;\n }\n /**\n * 获取系统的更新时序\n */\n get updateOrder() {\n return this._updateOrder;\n }\n set updateOrder(value) {\n this.setUpdateOrder(value);\n }\n /**\n * 获取系统的启用状态\n */\n get enabled() {\n return this._enabled;\n }\n /**\n * 设置系统的启用状态\n */\n set enabled(value) {\n this._enabled = value;\n }\n /**\n * 获取系统名称\n */\n get systemName() {\n return this._systemName;\n }\n constructor(matcher) {\n this._entities = [];\n this._updateOrder = 0;\n this._enabled = true;\n this._performanceMonitor = PerformanceMonitor.instance;\n this._matcher = matcher ? matcher : Matcher.empty();\n this._systemName = this.constructor.name;\n this.initialize();\n }\n /**\n * 这个系统所属的场景\n */\n get scene() {\n return this._scene;\n }\n set scene(value) {\n this._scene = value;\n this._entities = [];\n }\n /**\n * 获取实体匹配器\n */\n get matcher() {\n return this._matcher;\n }\n /**\n * 设置更新时序\n * @param order 更新时序\n */\n setUpdateOrder(order) {\n this._updateOrder = order;\n this.scene.entityProcessors.setDirty();\n }\n /**\n * 系统初始化\n *\n * 在系统创建时调用,子类可以重写此方法进行初始化操作。\n */\n initialize() {\n // 子类可以重写此方法\n }\n /**\n * 当实体的组件发生变化时调用\n *\n * 检查实体是否仍然符合系统的匹配条件,并相应地添加或移除实体。\n *\n * @param entity 发生变化的实体\n */\n onChanged(entity) {\n const contains = this._entities.includes(entity);\n const interest = this._matcher.isInterestedEntity(entity);\n if (interest && !contains) {\n this.add(entity);\n }\n else if (!interest && contains) {\n this.remove(entity);\n }\n }\n /**\n * 添加实体到系统\n *\n * @param entity 要添加的实体\n */\n add(entity) {\n if (!this._entities.includes(entity)) {\n this._entities.push(entity);\n this.onAdded(entity);\n }\n }\n /**\n * 当实体被添加到系统时调用\n *\n * 子类可以重写此方法来处理实体添加事件。\n *\n * @param entity 被添加的实体\n */\n onAdded(entity) {\n // 子类可以重写此方法\n }\n /**\n * 从系统中移除实体\n *\n * @param entity 要移除的实体\n */\n remove(entity) {\n const index = this._entities.indexOf(entity);\n if (index !== -1) {\n this._entities.splice(index, 1);\n this.onRemoved(entity);\n }\n }\n /**\n * 当实体从系统中移除时调用\n *\n * 子类可以重写此方法来处理实体移除事件。\n *\n * @param entity 被移除的实体\n */\n onRemoved(entity) {\n // 子类可以重写此方法\n }\n /**\n * 更新系统\n *\n * 在每帧调用,处理系统的主要逻辑。\n */\n update() {\n if (!this._enabled || !this.checkProcessing()) {\n return;\n }\n const startTime = this._performanceMonitor.startMonitoring(this._systemName);\n try {\n this.begin();\n this.process(this._entities);\n }\n finally {\n this._performanceMonitor.endMonitoring(this._systemName, startTime, this._entities.length);\n }\n }\n /**\n * 后期更新系统\n *\n * 在所有系统的update方法执行完毕后调用。\n */\n lateUpdate() {\n if (!this._enabled || !this.checkProcessing()) {\n return;\n }\n const startTime = this._performanceMonitor.startMonitoring(`${this._systemName}_Late`);\n try {\n this.lateProcess(this._entities);\n this.end();\n }\n finally {\n this._performanceMonitor.endMonitoring(`${this._systemName}_Late`, startTime, this._entities.length);\n }\n }\n /**\n * 在系统处理开始前调用\n *\n * 子类可以重写此方法进行预处理操作。\n */\n begin() {\n // 子类可以重写此方法\n }\n /**\n * 处理实体列表\n *\n * 系统的核心逻辑,子类必须实现此方法来定义具体的处理逻辑。\n *\n * @param entities 要处理的实体列表\n */\n process(entities) {\n // 子类必须实现此方法\n }\n /**\n * 后期处理实体列表\n *\n * 在主要处理逻辑之后执行,子类可以重写此方法。\n *\n * @param entities 要处理的实体列表\n */\n lateProcess(entities) {\n // 子类可以重写此方法\n }\n /**\n * 系统处理完毕后调用\n *\n * 子类可以重写此方法进行后处理操作。\n */\n end() {\n // 子类可以重写此方法\n }\n /**\n * 检查系统是否需要处理\n *\n * 在启用系统时有用,但仅偶尔需要处理。\n * 这只影响处理,不影响事件或订阅列表。\n *\n * @returns 如果系统应该处理,则为true,如果不处理则为false\n */\n checkProcessing() {\n return true;\n }\n /**\n * 获取系统的性能数据\n *\n * @returns 性能数据或undefined\n */\n getPerformanceData() {\n return this._performanceMonitor.getSystemData(this._systemName);\n }\n /**\n * 获取系统的性能统计\n *\n * @returns 性能统计或undefined\n */\n getPerformanceStats() {\n return this._performanceMonitor.getSystemStats(this._systemName);\n }\n /**\n * 重置系统的性能数据\n */\n resetPerformanceData() {\n this._performanceMonitor.resetSystem(this._systemName);\n }\n /**\n * 获取系统信息的字符串表示\n *\n * @returns 系统信息字符串\n */\n toString() {\n const entityCount = this._entities.length;\n const perfData = this.getPerformanceData();\n const perfInfo = perfData ? ` (${perfData.executionTime.toFixed(2)}ms)` : '';\n return `${this._systemName}[${entityCount} entities]${perfInfo}`;\n }\n}\n//# sourceMappingURL=EntitySystem.js.map","import { EntitySystem } from './EntitySystem';\n/**\n * 处理系统抽象类\n * 定义一个处理实体的抽象类,继承自EntitySystem类\n * 子类需要实现processSystem方法,用于实现具体的处理逻辑\n */\nexport class ProcessingSystem extends EntitySystem {\n /**\n * 当实体发生变化时,不进行任何操作\n * @param entity 发生变化的实体\n */\n onChanged(entity) { }\n /**\n * 处理实体,每帧调用processSystem方法进行处理\n * @param entities 实体数组,未被使用\n */\n process(entities) {\n // 调用子类实现的processSystem方法进行实体处理\n this.processSystem();\n }\n}\n//# sourceMappingURL=ProcessingSystem.js.map","import { EntitySystem } from './EntitySystem';\n/**\n * 被动实体系统\n * 定义一个被动的实体系统,继承自EntitySystem类\n * 被动的实体系统不会对实体进行任何修改,只会被动地接收实体的变化事件\n */\nexport class PassiveSystem extends EntitySystem {\n /**\n * 当实体发生变化时,不进行任何操作\n * @param entity 发生变化的实体\n */\n onChanged(entity) { }\n /**\n * 不进行任何处理\n * @param entities 实体数组,未被使用\n */\n process(entities) {\n // 被动系统不进行任何处理\n }\n}\n//# sourceMappingURL=PassiveSystem.js.map","import { EntitySystem } from './EntitySystem';\nimport { Time } from '../../Utils/Time';\n/**\n * 间隔系统抽象类\n * 定义一个按时间间隔处理的抽象类,继承自EntitySystem类\n * 子类需要实现process方法,用于实现具体的处理逻辑\n */\nexport class IntervalSystem extends EntitySystem {\n /**\n * 构造函数,初始化时间间隔\n * @param matcher 实体匹配器\n * @param interval 时间间隔\n */\n constructor(matcher, interval) {\n super(matcher);\n /** 累积增量以跟踪间隔 */\n this.acc = 0;\n /** 时间间隔的余数,用于计算下一次需要等待的时间 */\n this.intervalRemainder = 0;\n this.interval = interval;\n }\n /**\n * 判断是否需要进行处理\n * 如果需要进行处理,则更新累积增量和时间间隔余数,返回true\n * 否则返回false\n */\n checkProcessing() {\n // 更新累积增量\n this.acc += Time.deltaTime;\n // 如果累积增量超过时间间隔,则进行处理\n if (this.acc >= this.interval) {\n // 更新时间间隔余数\n this.intervalRemainder = this.acc - this.interval;\n // 重置累积增量\n this.acc = 0;\n // 返回true,表示需要进行处理\n return true;\n }\n // 返回false,表示不需要进行处理\n return false;\n }\n /**\n * 获取本系统上次处理后的实际delta值\n * 实际delta值等于时间间隔加上时间间隔余数\n */\n getIntervalDelta() {\n return this.interval + this.intervalRemainder;\n }\n}\n//# sourceMappingURL=IntervalSystem.js.map","import { TypeSafeEventSystem } from './EventSystem';\nimport { ECSEventType, EventPriority, EVENT_TYPES, EventTypeValidator } from '../CoreEvents';\n/**\n * 增强的事件总线实现\n * 基于TypeSafeEventSystem,提供类型安全的事件发布订阅机制\n */\nexport class EventBus {\n constructor(debugMode = false) {\n this.eventIdCounter = 0;\n this.isDebugMode = false;\n this.eventSystem = new TypeSafeEventSystem();\n this.isDebugMode = debugMode;\n }\n /**\n * 发射事件\n * @param eventType 事件类型\n * @param data 事件数据\n */\n emit(eventType, data) {\n this.validateEventType(eventType);\n // 增强事件数据\n const enhancedData = this.enhanceEventData(eventType, data);\n if (this.isDebugMode) {\n console.log(`[EventBus] Emitting event: ${eventType}`, enhancedData);\n }\n this.eventSystem.emitSync(eventType, enhancedData);\n }\n /**\n * 异步发射事件\n * @param eventType 事件类型\n * @param data 事件数据\n */\n async emitAsync(eventType, data) {\n this.validateEventType(eventType);\n // 增强事件数据\n const enhancedData = this.enhanceEventData(eventType, data);\n if (this.isDebugMode) {\n console.log(`[EventBus] Emitting async event: ${eventType}`, enhancedData);\n }\n await this.eventSystem.emit(eventType, enhancedData);\n }\n /**\n * 监听事件\n * @param eventType 事件类型\n * @param handler 事件处理器\n * @param config 监听器配置\n * @returns 监听器ID\n */\n on(eventType, handler, config = {}) {\n this.validateEventType(eventType);\n const eventConfig = {\n once: config.once || false,\n priority: config.priority || EventPriority.NORMAL,\n async: config.async || false,\n context: config.context\n };\n if (this.isDebugMode) {\n console.log(`[EventBus] Adding listener for: ${eventType}`, eventConfig);\n }\n return this.eventSystem.on(eventType, handler, eventConfig);\n }\n /**\n * 监听事件(一次性)\n * @param eventType 事件类型\n * @param handler 事件处理器\n * @param config 监听器配置\n * @returns 监听器ID\n */\n once(eventType, handler, config = {}) {\n return this.on(eventType, handler, { ...config, once: true });\n }\n /**\n * 异步监听事件\n * @param eventType 事件类型\n * @param handler 异步事件处理器\n * @param config 监听器配置\n * @returns 监听器ID\n */\n onAsync(eventType, handler, config = {}) {\n return this.on(eventType, handler, { ...config, async: true });\n }\n /**\n * 移除事件监听器\n * @param eventType 事件类型\n * @param listenerId 监听器ID\n */\n off(eventType, listenerId) {\n if (this.isDebugMode) {\n console.log(`[EventBus] Removing listener: ${listenerId} for event: ${eventType}`);\n }\n return this.eventSystem.off(eventType, listenerId);\n }\n /**\n * 移除指定事件类型的所有监听器\n * @param eventType 事件类型\n */\n offAll(eventType) {\n if (this.isDebugMode) {\n console.log(`[EventBus] Removing all listeners for event: ${eventType}`);\n }\n this.eventSystem.offAll(eventType);\n }\n /**\n * 检查是否有指定事件的监听器\n * @param eventType 事件类型\n */\n hasListeners(eventType) {\n return this.eventSystem.hasListeners(eventType);\n }\n /**\n * 获取事件统计信息\n * @param eventType 事件类型(可选)\n */\n getStats(eventType) {\n const stats = this.eventSystem.getStats(eventType);\n if (stats instanceof Map) {\n // 转换Map中的每个EventStats为IEventStats\n const result = new Map();\n stats.forEach((stat, key) => {\n result.set(key, this.convertEventStats(stat));\n });\n return result;\n }\n else {\n return this.convertEventStats(stats);\n }\n }\n /**\n * 清空所有监听器\n */\n clear() {\n if (this.isDebugMode) {\n console.log('[EventBus] Clearing all listeners');\n }\n this.eventSystem.clear();\n }\n /**\n * 启用或禁用事件系统\n * @param enabled 是否启用\n */\n setEnabled(enabled) {\n this.eventSystem.setEnabled(enabled);\n }\n /**\n * 设置调试模式\n * @param debug 是否启用调试\n */\n setDebugMode(debug) {\n this.isDebugMode = debug;\n }\n /**\n * 设置最大监听器数量\n * @param max 最大数量\n */\n setMaxListeners(max) {\n this.eventSystem.setMaxListeners(max);\n }\n /**\n * 获取监听器数量\n * @param eventType 事件类型\n */\n getListenerCount(eventType) {\n return this.eventSystem.getListenerCount(eventType);\n }\n /**\n * 设置事件批处理配置\n * @param eventType 事件类型\n * @param batchSize 批处理大小\n * @param delay 延迟时间(毫秒)\n */\n setBatchConfig(eventType, batchSize, delay) {\n this.eventSystem.setBatchConfig(eventType, {\n batchSize,\n delay,\n enabled: true\n });\n }\n /**\n * 刷新指定事件的批处理队列\n * @param eventType 事件类型\n */\n flushBatch(eventType) {\n this.eventSystem.flushBatch(eventType);\n }\n /**\n * 重置事件统计\n * @param eventType 事件类型(可选)\n */\n resetStats(eventType) {\n this.eventSystem.resetStats(eventType);\n }\n // 便捷方法:发射预定义的ECS事件\n /**\n * 发射实体创建事件\n * @param entityData 实体事件数据\n */\n emitEntityCreated(entityData) {\n this.emit(ECSEventType.ENTITY_CREATED, entityData);\n }\n /**\n * 发射实体销毁事件\n * @param entityData 实体事件数据\n */\n emitEntityDestroyed(entityData) {\n this.emit(ECSEventType.ENTITY_DESTROYED, entityData);\n }\n /**\n * 发射组件添加事件\n * @param componentData 组件事件数据\n */\n emitComponentAdded(componentData) {\n this.emit(ECSEventType.COMPONENT_ADDED, componentData);\n }\n /**\n * 发射组件移除事件\n * @param componentData 组件事件数据\n */\n emitComponentRemoved(componentData) {\n this.emit(ECSEventType.COMPONENT_REMOVED, componentData);\n }\n /**\n * 发射系统添加事件\n * @param systemData 系统事件数据\n */\n emitSystemAdded(systemData) {\n this.emit(ECSEventType.SYSTEM_ADDED, systemData);\n }\n /**\n * 发射系统移除事件\n * @param systemData 系统事件数据\n */\n emitSystemRemoved(systemData) {\n this.emit(ECSEventType.SYSTEM_REMOVED, systemData);\n }\n /**\n * 发射场景变化事件\n * @param sceneData 场景事件数据\n */\n emitSceneChanged(sceneData) {\n this.emit(EVENT_TYPES.CORE.SCENE_CHANGED, sceneData);\n }\n /**\n * 发射性能警告事件\n * @param performanceData 性能事件数据\n */\n emitPerformanceWarning(performanceData) {\n this.emit(ECSEventType.PERFORMANCE_WARNING, performanceData);\n }\n // 便捷方法:监听预定义的ECS事件\n /**\n * 监听实体创建事件\n * @param handler 事件处理器\n * @param config 监听器配置\n */\n onEntityCreated(handler, config) {\n return this.on(ECSEventType.ENTITY_CREATED, handler, config);\n }\n /**\n * 监听组件添加事件\n * @param handler 事件处理器\n * @param config 监听器配置\n */\n onComponentAdded(handler, config) {\n return this.on(ECSEventType.COMPONENT_ADDED, handler, config);\n }\n /**\n * 监听系统错误事件\n * @param handler 事件处理器\n * @param config 监听器配置\n */\n onSystemError(handler, config) {\n return this.on(ECSEventType.SYSTEM_ERROR, handler, config);\n }\n /**\n * 监听性能警告事件\n * @param handler 事件处理器\n * @param config 监听器配置\n */\n onPerformanceWarning(handler, config) {\n return this.on(ECSEventType.PERFORMANCE_WARNING, handler, config);\n }\n // 私有方法\n /**\n * 验证事件类型\n * @param eventType 事件类型\n */\n validateEventType(eventType) {\n if (!EventTypeValidator.isValid(eventType)) {\n if (this.isDebugMode) {\n console.warn(`[EventBus] Unknown event type: ${eventType}`);\n }\n // 在调试模式下添加自定义事件类型\n if (this.isDebugMode) {\n EventTypeValidator.addCustomType(eventType);\n }\n }\n }\n /**\n * 增强事件数据\n * @param eventType 事件类型\n * @param data 原始数据\n */\n enhanceEventData(eventType, data) {\n const enhanced = data;\n // 如果数据还没有基础事件属性,添加它们\n if (!enhanced.timestamp) {\n enhanced.timestamp = Date.now();\n }\n if (!enhanced.eventId) {\n enhanced.eventId = `${eventType}_${++this.eventIdCounter}`;\n }\n if (!enhanced.source) {\n enhanced.source = 'EventBus';\n }\n return enhanced;\n }\n /**\n * 转换EventStats为IEventStats\n * @param stats EventStats实例\n */\n convertEventStats(stats) {\n return {\n eventType: stats.eventType,\n listenerCount: stats.listenerCount,\n triggerCount: stats.triggerCount,\n totalExecutionTime: stats.totalExecutionTime,\n averageExecutionTime: stats.averageExecutionTime,\n lastTriggerTime: stats.lastTriggerTime\n };\n }\n}\n/**\n * 全局事件总线实例\n * 提供全局访问的事件总线\n */\nexport class GlobalEventBus {\n /**\n * 获取全局事件总线实例\n * @param debugMode 是否启用调试模式\n */\n static getInstance(debugMode = false) {\n if (!this.instance) {\n this.instance = new EventBus(debugMode);\n }\n return this.instance;\n }\n /**\n * 重置全局事件总线实例\n * @param debugMode 是否启用调试模式\n */\n static reset(debugMode = false) {\n if (this.instance) {\n this.instance.clear();\n }\n this.instance = new EventBus(debugMode);\n return this.instance;\n }\n}\n/**\n * 事件装饰器工厂\n * 用于自动注册事件监听器\n */\nexport function EventHandler(eventType, config = {}) {\n return function (target, propertyKey, descriptor) {\n const originalMethod = descriptor.value;\n // 在类实例化时自动注册监听器\n const initMethod = target.constructor.prototype.initEventListeners || function () { };\n target.constructor.prototype.initEventListeners = function () {\n initMethod.call(this);\n const eventBus = GlobalEventBus.getInstance();\n eventBus.on(eventType, originalMethod.bind(this), config);\n };\n return descriptor;\n };\n}\n/**\n * 异步事件装饰器工厂\n * 用于自动注册异步事件监听器\n */\nexport function AsyncEventHandler(eventType, config = {}) {\n return function (target, propertyKey, descriptor) {\n const originalMethod = descriptor.value;\n const initMethod = target.constructor.prototype.initEventListeners || function () { };\n target.constructor.prototype.initEventListeners = function () {\n initMethod.call(this);\n const eventBus = GlobalEventBus.getInstance();\n eventBus.onAsync(eventType, originalMethod.bind(this), config);\n };\n return descriptor;\n };\n}\n//# sourceMappingURL=EventBus.js.map","import { Entity } from '../Entity';\nimport { IdentifierPool } from '../Utils/IdentifierPool';\nimport { ComponentIndexManager, IndexType } from './ComponentIndex';\nimport { ArchetypeSystem } from './ArchetypeSystem';\nimport { DirtyTrackingSystem, DirtyFlag } from './DirtyTrackingSystem';\nimport { EventBus } from './EventBus';\n/**\n * 实体查询构建器\n *\n * 提供流式API来构建复杂的实体查询条件。支持组件过滤、标签过滤、状态过滤和自定义条件。\n *\n * @example\n * ```typescript\n * const results = entityManager.query()\n * .withAll(PositionComponent, HealthComponent)\n * .without(VelocityComponent)\n * .withTag(1)\n * .active()\n * .where(entity => entity.name.startsWith(\"Player\"))\n * .execute();\n * ```\n */\nexport class EntityQueryBuilder {\n /**\n * 创建查询构建器实例\n * @param entityManager 实体管理器实例\n */\n constructor(entityManager) {\n this.entityManager = entityManager;\n /** 必须包含的组件类型 */\n this._allComponents = [];\n /** 至少包含一个的组件类型 */\n this._anyComponents = [];\n /** 不能包含的组件类型 */\n this._withoutComponents = [];\n /** 必须包含的标签 */\n this._withTags = [];\n /** 不能包含的标签 */\n this._withoutTags = [];\n /** 是否只查询激活状态的实体 */\n this._activeOnly = false;\n /** 是否只查询启用状态的实体 */\n this._enabledOnly = false;\n /** 自定义过滤条件 */\n this._customPredicates = [];\n }\n /**\n * 添加必须包含的组件条件\n *\n * 返回的实体必须包含所有指定的组件类型。\n *\n * @param componentTypes 组件类型列表\n * @returns 查询构建器实例,支持链式调用\n */\n withAll(...componentTypes) {\n this._allComponents.push(...componentTypes);\n return this;\n }\n /**\n * 添加至少包含一个的组件条件\n *\n * 返回的实体必须至少包含其中一个指定的组件类型。\n *\n * @param componentTypes 组件类型列表\n * @returns 查询构建器实例,支持链式调用\n */\n withAny(...componentTypes) {\n this._anyComponents.push(...componentTypes);\n return this;\n }\n /**\n * 添加不能包含的组件条件\n *\n * 返回的实体不能包含任何指定的组件类型。\n *\n * @param componentTypes 组件类型列表\n * @returns 查询构建器实例,支持链式调用\n */\n without(...componentTypes) {\n this._withoutComponents.push(...componentTypes);\n return this;\n }\n /**\n * 添加必须包含的标签条件\n *\n * 返回的实体必须具有指定的标签。\n *\n * @param tag 标签值\n * @returns 查询构建器实例,支持链式调用\n */\n withTag(tag) {\n this._withTags.push(tag);\n return this;\n }\n /**\n * 添加不能包含的标签条件\n *\n * 返回的实体不能具有指定的标签。\n *\n * @param tag 标签值\n * @returns 查询构建器实例,支持链式调用\n */\n withoutTag(tag) {\n this._withoutTags.push(tag);\n return this;\n }\n /**\n * 添加激活状态过滤条件\n *\n * 返回的实体必须处于激活状态(active = true)。\n *\n * @returns 查询构建器实例,支持链式调用\n */\n active() {\n this._activeOnly = true;\n return this;\n }\n /**\n * 添加启用状态过滤条件\n *\n * 返回的实体必须处于启用状态(enabled = true)。\n *\n * @returns 查询构建器实例,支持链式调用\n */\n enabled() {\n this._enabledOnly = true;\n return this;\n }\n /**\n * 添加自定义过滤条件\n *\n * 允许用户定义复杂的过滤逻辑。\n *\n * @param predicate 自定义过滤函数,接收实体作为参数,返回布尔值\n * @returns 查询构建器实例,支持链式调用\n *\n * @example\n * ```typescript\n * .where(entity => entity.name.startsWith(\"Player\"))\n * .where(entity => entity.components.length > 5)\n * ```\n */\n where(predicate) {\n this._customPredicates.push(predicate);\n return this;\n }\n /**\n * 执行查询并返回所有匹配的实体\n *\n * @returns 符合所有查询条件的实体数组\n */\n execute() {\n let candidates = [];\n if (this._allComponents.length > 0) {\n const indexResult = this.entityManager.queryWithComponentIndex(this._allComponents, 'AND');\n candidates = Array.from(indexResult);\n }\n else if (this._anyComponents.length > 0) {\n const indexResult = this.entityManager.queryWithComponentIndex(this._anyComponents, 'OR');\n candidates = Array.from(indexResult);\n }\n else {\n candidates = this.entityManager.getAllEntities();\n }\n return candidates.filter(entity => this.matchesEntity(entity));\n }\n /**\n * 执行查询并返回第一个匹配的实体\n *\n * @returns 第一个符合查询条件的实体,如果没有找到则返回null\n */\n first() {\n const entities = this.entityManager.getAllEntities();\n return entities.find(entity => this.matchesEntity(entity)) || null;\n }\n /**\n * 执行查询并返回匹配实体的数量\n *\n * @returns 符合查询条件的实体数量\n */\n count() {\n const entities = this.entityManager.getAllEntities();\n return entities.filter(entity => this.matchesEntity(entity)).length;\n }\n /**\n * 对所有匹配的实体执行指定操作\n *\n * @param action 要执行的操作函数,接收匹配的实体作为参数\n */\n forEach(action) {\n const entities = this.entityManager.getAllEntities();\n entities.forEach(entity => {\n if (this.matchesEntity(entity)) {\n action(entity);\n }\n });\n }\n /**\n * 检查实体是否匹配所有查询条件\n *\n * 按优先级顺序检查各种过滤条件,一旦发现不匹配立即返回false。\n *\n * @param entity 要检查的实体\n * @returns 实体是否匹配所有查询条件\n */\n matchesEntity(entity) {\n // 检查激活状态\n if (this._activeOnly && !entity.active) {\n return false;\n }\n // 检查启用状态\n if (this._enabledOnly && !entity.enabled) {\n return false;\n }\n // 检查必须包含的组件\n if (this._allComponents.length > 0) {\n for (const componentType of this._allComponents) {\n if (!entity.hasComponent(componentType)) {\n return false;\n }\n }\n }\n // 检查至少包含一个的组件\n if (this._anyComponents.length > 0) {\n let hasAny = false;\n for (const componentType of this._anyComponents) {\n if (entity.hasComponent(componentType)) {\n hasAny = true;\n break;\n }\n }\n if (!hasAny) {\n return false;\n }\n }\n // 检查不能包含的组件\n if (this._withoutComponents.length > 0) {\n for (const componentType of this._withoutComponents) {\n if (entity.hasComponent(componentType)) {\n return false;\n }\n }\n }\n // 检查必须包含的标签\n if (this._withTags.length > 0) {\n if (!this._withTags.includes(entity.tag)) {\n return false;\n }\n }\n // 检查不能包含的标签\n if (this._withoutTags.length > 0) {\n if (this._withoutTags.includes(entity.tag)) {\n return false;\n }\n }\n // 检查自定义条件\n if (this._customPredicates.length > 0) {\n for (const predicate of this._customPredicates) {\n if (!predicate(entity)) {\n return false;\n }\n }\n }\n return true;\n }\n}\n/**\n * 实体管理器\n *\n * 提供统一的实体管理和查询机制,支持高效的实体操作。\n * 包括实体的创建、销毁、查询和索引管理功能。\n *\n * @example\n * ```typescript\n * const entityManager = new EntityManager();\n *\n * // 创建实体\n * const player = entityManager.createEntity(\"Player\");\n *\n * // 查询实体\n * const playerEntity = entityManager.getEntityByName(\"Player\");\n *\n * // 复杂查询\n * const results = entityManager.query()\n * .withAll(HealthComponent, PositionComponent)\n * .active()\n * .execute();\n * ```\n */\nexport class EntityManager {\n /**\n * 创建实体管理器实例\n *\n * 初始化内部数据结构和ID分配器。\n */\n constructor() {\n /** 主要实体存储,使用ID作为键 */\n this._entities = new Map();\n /** 按名称索引的实体映射 */\n this._entitiesByName = new Map();\n /** 按标签索引的实体映射 */\n this._entitiesByTag = new Map();\n /** 已销毁实体的ID集合 */\n this._destroyedEntities = new Set();\n this._identifierPool = new IdentifierPool();\n // 初始化性能优化系统\n this._componentIndexManager = new ComponentIndexManager(IndexType.HASH);\n this._archetypeSystem = new ArchetypeSystem();\n this._dirtyTrackingSystem = new DirtyTrackingSystem();\n this._eventBus = new EventBus(false);\n // 设置Entity的静态事件总线引用\n Entity.eventBus = this._eventBus;\n }\n /**\n * 获取实体总数\n *\n * @returns 当前管理的实体总数量\n */\n get entityCount() {\n return this._entities.size;\n }\n /**\n * 获取激活状态的实体数量\n *\n * 只计算同时满足激活状态且未被销毁的实体。\n *\n * @returns 激活状态的实体数量\n */\n get activeEntityCount() {\n let count = 0;\n for (const entity of this._entities.values()) {\n if (entity.active && !entity.isDestroyed) {\n count++;\n }\n }\n return count;\n }\n /**\n * 创建新实体\n *\n * 分配唯一ID并将实体添加到管理系统中,同时更新相关索引。\n *\n * @param name 实体名称,如果未指定则使用时间戳生成默认名称\n * @returns 创建的实体实例\n *\n * @example\n * ```typescript\n * const player = entityManager.createEntity(\"Player\");\n * const enemy = entityManager.createEntity(); // 使用默认名称\n * ```\n */\n createEntity(name = `Entity_${Date.now()}`) {\n const id = this._identifierPool.checkOut();\n const entity = new Entity(name, id);\n this._entities.set(id, entity);\n this.updateNameIndex(entity, true);\n this.updateTagIndex(entity, true);\n this._componentIndexManager.addEntity(entity);\n this._archetypeSystem.addEntity(entity);\n this._dirtyTrackingSystem.markDirty(entity, DirtyFlag.COMPONENT_ADDED);\n // 发射实体创建事件\n this._eventBus.emitEntityCreated({\n timestamp: Date.now(),\n source: 'EntityManager',\n entityId: entity.id,\n entityName: entity.name,\n entityTag: entity.tag?.toString()\n });\n return entity;\n }\n /**\n * 销毁实体\n *\n * 支持通过实体对象、名称或ID来销毁实体。\n * 会清理所有相关索引并回收ID。\n *\n * @param entityOrId 要销毁的实体,可以是实体对象、名称字符串或ID数字\n * @returns 是否成功销毁实体\n *\n * @example\n * ```typescript\n * // 通过实体对象销毁\n * entityManager.destroyEntity(player);\n *\n * // 通过名称销毁\n * entityManager.destroyEntity(\"Enemy_1\");\n *\n * // 通过ID销毁\n * entityManager.destroyEntity(123);\n * ```\n */\n destroyEntity(entityOrId) {\n let entity = null;\n if (typeof entityOrId === 'string') {\n entity = this.getEntityByName(entityOrId);\n }\n else if (typeof entityOrId === 'number') {\n entity = this._entities.get(entityOrId) || null;\n }\n else {\n entity = this._entities.get(entityOrId.id) || null;\n }\n if (!entity) {\n return false;\n }\n this._destroyedEntities.add(entity.id);\n this.updateNameIndex(entity, false);\n this.updateTagIndex(entity, false);\n this._componentIndexManager.removeEntity(entity);\n this._archetypeSystem.removeEntity(entity);\n this._dirtyTrackingSystem.markDirty(entity, DirtyFlag.COMPONENT_REMOVED);\n // 发射实体销毁事件\n this._eventBus.emitEntityDestroyed({\n timestamp: Date.now(),\n source: 'EntityManager',\n entityId: entity.id,\n entityName: entity.name,\n entityTag: entity.tag?.toString()\n });\n entity.destroy();\n this._entities.delete(entity.id);\n this._identifierPool.checkIn(entity.id);\n return true;\n }\n /**\n * 获取所有实体\n *\n * 返回当前管理的所有实体的副本数组。\n *\n * @returns 所有实体的数组\n */\n getAllEntities() {\n return Array.from(this._entities.values());\n }\n /**\n * 根据ID获取实体\n *\n * 支持字符串和数字类型的ID。\n *\n * @param id 实体ID,可以是字符串或数字\n * @returns 对应的实体,如果不存在则返回null\n */\n getEntity(id) {\n const numId = typeof id === 'string' ? parseInt(id) : id;\n return this._entities.get(numId) || null;\n }\n /**\n * 根据名称获取实体\n *\n * 如果存在多个同名实体,返回第一个找到的实体。\n *\n * @param name 实体名称\n * @returns 匹配的实体,如果不存在则返回null\n */\n getEntityByName(name) {\n const entities = this._entitiesByName.get(name);\n return entities && entities.length > 0 ? entities[0] : null;\n }\n /**\n * 根据标签获取实体列表\n *\n * 返回所有具有指定标签的实体。\n *\n * @param tag 标签值\n * @returns 具有指定标签的实体数组\n */\n getEntitiesByTag(tag) {\n return [...(this._entitiesByTag.get(tag) || [])];\n }\n /**\n * 获取包含指定组件的所有实体\n *\n * 遍历所有实体,查找包含指定组件类型的实体。\n *\n * @param componentType 组件类型\n * @returns 包含指定组件的实体数组\n *\n * @example\n * ```typescript\n * const entitiesWithHealth = entityManager.getEntitiesWithComponent(HealthComponent);\n * ```\n */\n getEntitiesWithComponent(componentType) {\n const indexResult = this._componentIndexManager.query(componentType);\n return Array.from(indexResult);\n }\n /**\n * 创建查询构建器\n *\n * 返回一个新的查询构建器实例,用于构建复杂的实体查询。\n *\n * @returns 新的查询构建器实例\n *\n * @example\n * ```typescript\n * const results = entityManager.query()\n * .withAll(PositionComponent, HealthComponent)\n * .without(VelocityComponent)\n * .active()\n * .execute();\n * ```\n */\n query() {\n return new EntityQueryBuilder(this);\n }\n /**\n * 使用组件索引进行多组件查询\n *\n * @param componentTypes 组件类型数组\n * @param operation 查询操作:'AND' 或 'OR'\n * @returns 匹配的实体集合\n */\n queryWithComponentIndex(componentTypes, operation) {\n return this._componentIndexManager.queryMultiple(componentTypes, operation);\n }\n /**\n * 标记实体组件已修改\n *\n * @param entity 修改的实体\n * @param componentTypes 修改的组件类型\n */\n markEntityDirty(entity, componentTypes) {\n this._dirtyTrackingSystem.markDirty(entity, DirtyFlag.COMPONENT_MODIFIED, componentTypes);\n }\n /**\n * 获取性能优化统计信息\n */\n getOptimizationStats() {\n return {\n componentIndex: this._componentIndexManager.getStats(),\n archetypeSystem: this._archetypeSystem.getAllArchetypes().map(a => ({\n id: a.id,\n componentTypes: a.componentTypes.map(t => t.name),\n entityCount: a.entities.length\n })),\n dirtyTracking: this._dirtyTrackingSystem.getStats()\n };\n }\n /**\n * 获取事件总线实例\n *\n * 允许外部代码监听和发射ECS相关事件。\n *\n * @returns 事件总线实例\n */\n get eventBus() {\n return this._eventBus;\n }\n /**\n * 更新名称索引\n *\n * 维护按名称查找实体的索引结构。支持添加和移除操作。\n *\n * @param entity 要更新索引的实体\n * @param isAdd true表示添加到索引,false表示从索引中移除\n */\n updateNameIndex(entity, isAdd) {\n if (!entity.name) {\n return;\n }\n if (isAdd) {\n let entities = this._entitiesByName.get(entity.name);\n if (!entities) {\n entities = [];\n this._entitiesByName.set(entity.name, entities);\n }\n entities.push(entity);\n }\n else {\n const entities = this._entitiesByName.get(entity.name);\n if (entities) {\n const index = entities.indexOf(entity);\n if (index !== -1) {\n entities.splice(index, 1);\n if (entities.length === 0) {\n this._entitiesByName.delete(entity.name);\n }\n }\n }\n }\n }\n /**\n * 更新标签索引\n *\n * 维护按标签查找实体的索引结构。支持添加和移除操作。\n *\n * @param entity 要更新索引的实体\n * @param isAdd true表示添加到索引,false表示从索引中移除\n */\n updateTagIndex(entity, isAdd) {\n if (isAdd) {\n let entities = this._entitiesByTag.get(entity.tag);\n if (!entities) {\n entities = [];\n this._entitiesByTag.set(entity.tag, entities);\n }\n entities.push(entity);\n }\n else {\n const entities = this._entitiesByTag.get(entity.tag);\n if (entities) {\n const index = entities.indexOf(entity);\n if (index !== -1) {\n entities.splice(index, 1);\n if (entities.length === 0) {\n this._entitiesByTag.delete(entity.tag);\n }\n }\n }\n }\n }\n}\n//# sourceMappingURL=EntityManager.js.map","/**\n * 类型工具类\n * 提供类型相关的实用方法\n */\nexport class TypeUtils {\n /**\n * 获取对象的类型\n * @param obj 对象\n * @returns 对象的构造函数\n */\n static getType(obj) {\n return obj.constructor;\n }\n}\n//# sourceMappingURL=TypeUtils.js.map","/**\n * 数字扩展工具类\n * 提供数字转换的实用方法\n */\nexport class NumberExtension {\n /**\n * 将值转换为数字\n * @param value 要转换的值\n * @returns 转换后的数字,如果值为undefined则返回0\n */\n static toNumber(value) {\n if (value == undefined)\n return 0;\n return Number(value);\n }\n}\n//# sourceMappingURL=NumberExtension.js.map"],"names":["FuncPack","constructor","func","context","this","Emitter","_messageTable","Map","addObserver","eventType","handler","list","get","set","hasObserver","push","removeObserver","messageData","index","findIndex","data","splice","emit","observer","call","some","CoreEvents","ECSEventType","EventPriority","EVENT_TYPES","CORE","SCENE_CHANGED","FRAME_UPDATED","RENDER_CHANGED","ENTITY","CREATED","ENTITY_CREATED","DESTROYED","ENTITY_DESTROYED","ENABLED","ENTITY_ENABLED","DISABLED","ENTITY_DISABLED","TAG_ADDED","ENTITY_TAG_ADDED","TAG_REMOVED","ENTITY_TAG_REMOVED","NAME_CHANGED","ENTITY_NAME_CHANGED","COMPONENT","ADDED","COMPONENT_ADDED","REMOVED","COMPONENT_REMOVED","MODIFIED","COMPONENT_MODIFIED","COMPONENT_ENABLED","COMPONENT_DISABLED","SYSTEM","SYSTEM_ADDED","SYSTEM_REMOVED","SYSTEM_ENABLED","SYSTEM_DISABLED","PROCESSING_START","SYSTEM_PROCESSING_START","PROCESSING_END","SYSTEM_PROCESSING_END","ERROR","SYSTEM_ERROR","PERFORMANCE","WARNING","PERFORMANCE_WARNING","CRITICAL","PERFORMANCE_CRITICAL","MEMORY_HIGH","MEMORY_USAGE_HIGH","FRAME_DROP","FRAME_RATE_DROP","EventTypeValidator","isValid","validTypes","has","getAllValidTypes","Array","from","addCustomType","add","removeCustomType","delete","Set","Object","values","map","e","toString","GlobalManager","_enabled","enabled","value","setEnabled","isEnabled","onEnabled","onDisabled","update","Time","currentTime","Date","now","_isFirstUpdate","_lastTime","unscaledDeltaTime","deltaTime","timeScale","unscaledTotalTime","totalTime","frameCount","sceneChanged","checkEvery","interval","lastTime","Timer","_timeInSeconds","_repeats","_isDone","_elapsedTime","getContext","reset","stop","tick","_onTime","initialize","timeInsSeconds","repeats","onTime","bind","unload","TimerManager","super","arguments","_timers","i","length","schedule","timeInSeconds","timer","PerformanceWarningType","PerformanceMonitor","instance","_instance","_systemData","_systemStats","_warnings","_isEnabled","_maxRecentSamples","_maxWarnings","_thresholds","executionTime","warning","critical","memoryUsage","cpuUsage","fps","entityCount","_fpsHistory","_lastFrameTime","_frameCount","_fpsUpdateInterval","_lastFpsUpdate","_currentFps","_memoryCheckInterval","_lastMemoryCheck","_memoryHistory","_gcCount","_lastGcCheck","_gcCheckInterval","enable","disable","startMonitoring","systemName","performance","endMonitoring","startTime","endTime","name","averageTimePerEntity","lastUpdateTime","updateStats","stats","averageTime","minTime","Number","MAX_VALUE","maxTime","executionCount","recentTimes","standardDeviation","percentile95","percentile99","Math","min","max","shift","calculateAdvancedStats","mean","reduce","a","b","variance","acc","time","pow","sqrt","sortedTimes","sort","len","floor","getSystemData","getSystemStats","getAllSystemData","getAllSystemStats","getPerformanceReport","lines","sortedSystems","entries","toFixed","totalCurrentTime","sum","size","join","clear","resetSystem","getPerformanceWarnings","thresholdMs","warnings","setMaxRecentSamples","maxSamples","Pool","createFn","maxSize","estimatedObjectSize","_objects","_createFn","_maxSize","_objectSize","_stats","totalCreated","totalObtained","totalReleased","hitRate","estimatedMemoryUsage","getPool","type","pool","_pools","obtain","obj","pop","_updateHitRate","_updateMemoryUsage","free","warmUp","count","targetSize","getStats","resetStats","hits","clearPool","clearAllPools","getTotalMemoryUsage","total","typeName","stat","TieredObjectPool","resetFn","tierSizes","pools","release","totalCount","remaining","warmUpCount","totalSize","totalMaxSize","totalMemoryUsage","tierStats","getTotalCreated","PoolManager","autoCompactInterval","lastCompactTime","getInstance","registerPool","compactAllPools","getAllStats","generateReport","totalMemory","ComponentRegistry","register","componentType","componentTypes","nextBitIndex","maxComponents","Error","bitIndex","getBitMask","undefined","BigInt","getBitIndex","isRegistered","getAllRegisteredTypes","ComponentStorage","components","entityToIndex","indexToEntity","freeIndices","_size","addComponent","entityId","component","getComponent","hasComponent","removeComponent","forEach","callback","getDenseArray","entityIds","compact","newComponents","newIndexToEntity","newEntityToIndex","newIndex","totalSlots","usedSlots","freeSlots","fragmentation","ComponentStorageManager","storages","getStorage","storage","removeAllComponents","getComponentMask","mask","compactAll","EntityComparer","compare","self","other","updateOrder","id","ComponentCache","config","ttl","enableLRU","cache","accessOrder","entry","lastAccessed","removeFromAccessOrder","accessCount","updateAccessOrder","evictLeastRecentlyUsed","deleted","lruType","indexOf","totalAccess","totalHits","averageAccessCount","Entity","updateInterval","_isDestroyed","_parent","_children","_active","_tag","_updateOrder","_componentMask","_componentTypeToIndex","_componentAccessStats","_componentCache","isDestroyed","parent","children","childCount","active","onActiveChanged","activeInHierarchy","tag","componentMask","createComponent","args","addComponentInternal","entity","cacheHits","cacheMisses","scene","componentStorageManager","onAddedToEntity","eventBus","emitComponentAdded","timestamp","source","entityName","entityTag","entityProcessors","processor","processors","onChanged","updateComponentAccessStats","recordCacheMiss","cachedComponent","recordCacheHit","rebuildComponentIndex","getOrCreateComponent","onRemovedFromEntity","emitComponentRemoved","removeComponentByType","componentsToRemove","addComponents","addedComponents","error","console","warn","removeComponentsByTypes","removedComponents","getComponentCacheStats","accessStats","cacheStats","indexMappingSize","totalComponents","warmUpComponentCache","cleanupComponentCache","getComponents","result","addChild","child","removeChild","addEntity","removeAllChildren","childrenToRemove","findChild","recursive","found","findChildrenByTag","getRoot","root","isAncestorOf","current","isDescendantOf","getDepth","depth","forEachChild","eventSystem","emitSync","destroy","childrenToDestroy","entities","remove","compareTo","prototype","getDebugInfo","accessStatsArray","toISOString","destroyed","componentCount","c","parentId","childIds","componentCache","componentAccessStats","entityComparer","EntityList","buffer","_idToEntity","_nameToEntities","_entitiesToAdd","_entitiesToRemove","_isUpdating","_scene","addImmediate","updateNameIndex","removeImmediate","removeAllEntities","updateLists","findEntity","findEntitiesByName","findEntityById","findEntitiesByTag","findEntitiesWithComponent","action","forEachWhere","predicate","isAdd","activeCount","totalEntities","activeEntities","pendingAdd","pendingRemove","nameIndexSize","EntityProcessorList","_processors","_isDirty","setDirty","getProcessor","begin","sortProcessors","end","lateUpdate","IdentifierPool","_nextAvailableId","_ids","checkOut","checkIn","WasmLoader","wasmModule","wasmCore","silent","setSilent","loadWasmModule","wasmPath","import","initializeWasmModule","EcsCore","require","fs","path","currentDir","dirname","__filename","resolve","existsSync","wasmBytes","readFileSync","initSync","default","module_or_path","getWasmCore","getWasmModule","cleanup","JavaScriptFallback","jsEntityMasks","jsNextEntityId","jsQueryCount","jsUpdateCount","createEntity","destroyEntity","updateEntityMask","batchUpdateMasks","masks","queryEntities","maxResults","results","entityMask","Uint32Array","queryCached","queryMultipleComponents","matches","queryWithExclusion","includeMask","excludeMask","getEntityMask","entityExists","createComponentMask","componentIds","maskContainsComponent","componentId","getPerformanceStats","indexCount","queryCount","updateCount","wasmEnabled","getEntityCount","WasmEcsCore","initialized","usingWasm","wasmLoader","jsFallback","log","ensureInitialized","create_entity","destroy_entity","update_entity_mask","entityIdArray","maskArray","BigUint64Array","batch_update_masks","resultPtr","query_entities","get_query_result_count","memory","query_cached","get_cached_query_count","query_multiple_components","query_with_exclusion","get_entity_mask","entity_exists","componentIdArray","create_component_mask","mask_contains_component","get_performance_stats","isUsingWasm","isInitialized","ecsCore","async","initializeEcs","ComponentPool","acquire","prewarm","getAvailableCount","getMaxSize","ComponentPoolManager","componentName","acquireComponent","releaseComponent","prewarmAll","clearAll","getPoolStats","available","BitMaskOptimizer","maskCache","componentTypeMap","nextComponentId","registerComponentType","getComponentTypeId","createSingleComponentMask","cacheKey","createCombinedMask","componentNames","maskContainsAllComponents","requiredMask","maskContainsAnyComponent","addComponentToMask","removeComponentFromMask","precomputeCommonMasks","commonCombinations","combination","getCacheStats","clearCache","maskToComponentNames","getComponentCount","tempMask","IndexUpdateType","IndexType","DirtyFlag","QueryConditionType","LogType","ComponentTransform","IndexUpdateBatcher","pendingOperations","isProcessing","batchSize","flushTimeout","flushDelay","addOperation","operation","flush","scheduleFlush","addEntities","ADD_ENTITY","removeEntities","REMOVE_ENTITY","updateEntities","updates","UPDATE_ENTITY","oldMask","newMask","setTimeout","clearTimeout","processBatch","operations","addOperations","removeOperations","updateOperations","processBatchAdd","processBatchRemove","processBatchUpdate","onBatchAdd","onBatchRemove","onBatchUpdate","setBatchSize","setFlushDelay","delay","getPendingCount","hasPendingOperations","HashComponentIndex","HASH","_componentToEntities","_entityToComponents","_queryCount","_totalQueryTime","_lastUpdated","removeEntity","query","queryMultiple","smallestSet","smallestSize","Infinity","hasAll","avgQueryTime","lastUpdated","BitmapComponentIndex","BITMAP","_componentTypeToBit","_entityToBitmap","_bitToEntities","_nextBit","bitmap","bit","bitMask","targetBitmap","validBits","entityBitmap","ComponentIndexManager","initialType","_indexHistory","_autoOptimize","_optimizationThreshold","_activeIndex","createIndex","checkOptimization","switchIndexType","oldIndex","setAutoOptimize","SORTED","ArchetypeSystem","_archetypes","_entityToArchetype","_componentToArchetypes","_queryCache","_cacheTimeout","_maxCacheSize","getEntityComponentTypes","archetypeId","generateArchetypeId","archetype","createArchetype","updatedAt","updateComponentIndexes","invalidateQueryCache","queryArchetypes","t","cached","fromCache","matchingArchetypes","archetypeContainsAllComponents","foundArchetypes","archetypes","getEntityArchetype","getAllArchetypes","createdAt","includes","DirtyTrackingSystem","_dirtyEntities","_listeners","totalMarkings","totalCleanups","totalDirtyPerFrame","_currentFrame","_batchSize","_maxProcessingTime","_processingQueue","_isProcessing","markDirty","flags","modifiedComponents","dirtyData","frameNumber","notifyListeners","isDirty","ALL","clearDirty","getDirtyEntities","processDirtyEntities","processed","processEntity","onFrameEnd","addListener","listener","priority","removeListener","l","beginFrame","endFrame","dirtyEntityCount","listenerCount","avgDirtyPerFrame","estimateMemoryUsage","configureBatchProcessing","maxProcessingTime","newFlags","usage","QuerySystem","wasmAvailable","indexDirty","queryCache","cacheMaxSize","cacheTimeout","queryStats","totalQueries","indexHits","linearScans","archetypeHits","dirtyChecks","entityIndex","byMask","byComponentType","byTag","byName","componentPoolManager","bitMaskOptimizer","indexUpdateBatcher","componentIndexManager","archetypeSystem","dirtyTrackingSystem","addEntityToIndexes","removeEntityFromIndexes","initializeWasm","wasmLoaded","setEntities","clearQueryCache","rebuildIndexes","deferCacheClear","existingIds","addedCount","addEntitiesUnchecked","maskSet","typeSet","tagSet","nameSet","queryAll","getFromCache","archetypeResult","indexResult","addToCache","queryByLinearScan","filter","queryAny","queryNone","queryByTag","queryByName","queryByComponent","hitCount","cleanupCache","key","toRemove","batchUpdateComponents","u","batchUpdateComponentsJS","find","getAccelerationStatus","currentProvider","availableProviders","performanceInfo","switchAccelerationProvider","providerName","indexStats","maskIndexSize","componentIndexSize","tagIndexSize","accelerationStatus","cacheHitRate","optimizationStats","componentIndex","dirtyTracking","switchComponentIndexType","indexType","configureDirtyTracking","optimizePerformance","markEntityDirty","QueryBuilder","querySystem","conditions","withAll","withAny","ANY","without","NONE","execute","condition","TypeSafeEventSystem","listeners","batchQueue","batchTimers","batchConfigs","nextListenerId","maxListeners","on","once","onAsync","off","listenerId","offAll","clearBatch","event","batchConfig","addToBatch","executeEvent","sortedListeners","sortListenersByPriority","removeListeners","setBatchConfig","flushBatch","batch","createEmptyStats","hasListeners","getListenerCount","clearAllBatches","setMaxListeners","syncListeners","asyncListeners","asyncPromises","Promise","all","slice","listenerIds","batchEvent","events","triggerCount","totalExecutionTime","averageExecutionTime","lastTriggerTime","Scene","systems","enableWasmAcceleration","_didSceneBegin","identifierPool","onStart","createEntities","namePrefix","createEntitiesOld","destroyAllEntities","getEntityByName","getEntitiesByTag","addEntityProcessor","setUpdateOrder","addSystem","system","removeEntityProcessor","getEntityProcessor","processorCount","componentStorageStats","compactComponentStorage","isRunning","_entities","componentStats","EntityBuilder","storageManager","named","tagged","withComponents","withIf","withFactory","factory","configure","configurator","withChild","childBuilder","build","withChildren","childBuilders","withChildFactory","childFactory","withChildIf","spawn","clone","newBuilder","SceneBuilder","withEntity","withEntityBuilder","builderFn","withEntities","withSystem","withSystems","ComponentBuilder","componentClass","property","setIf","ECSFluentAPI","createScene","findFirst","findByName","findByTag","emitAsync","EntityBatchOperator","systemCount","eventStats","setActive","setTag","toArray","createECSAPI","Core","debug","enableEntitySystems","_nextScene","_globalManagers","emitter","frameUpdated","_timerManager","registerGlobalManager","_performanceMonitor","_poolManager","entitySystemsEnabled","Instance","onSceneChanged","create","manager","unregisterGlobalManager","getGlobalManager","ecsAPI","_ecsAPI","paused","frameStartTime","updateFPS","managersStartTime","globalManager","sceneStartTime","Component","_idGenerator","Bits","_words","wordIndex","WORD_SIZE","containsAll","maxLength","thisWord","otherWord","intersects","minLength","excludes","isEmpty","word","cardinality","popCount","n","copyFrom","newBits","ComponentTypeManager","_componentTypes","_typeNames","_nextTypeId","getTypeId","typeId","getTypeName","createBits","bits","getEntityBits","registeredTypeCount","Matcher","allSet","exclusionSet","oneSet","empty","getAllSet","getExclusionSet","getOneSet","isInterestedEntity","entityBits","isInterested","componentBits","updateBitsIfDirty","_allBits","_exclusionBits","_oneBits","types","exclude","one","typeManager","parts","EntitySystem","_systemName","matcher","_matcher","order","contains","interest","onAdded","onRemoved","checkProcessing","process","lateProcess","getPerformanceData","resetPerformanceData","perfData","perfInfo","ProcessingSystem","processSystem","PassiveSystem","IntervalSystem","intervalRemainder","getIntervalDelta","EventBus","debugMode","eventIdCounter","isDebugMode","validateEventType","enhancedData","enhanceEventData","eventConfig","NORMAL","convertEventStats","setDebugMode","emitEntityCreated","entityData","emitEntityDestroyed","componentData","emitSystemAdded","systemData","emitSystemRemoved","emitSceneChanged","sceneData","emitPerformanceWarning","performanceData","onEntityCreated","onComponentAdded","onSystemError","onPerformanceWarning","enhanced","eventId","GlobalEventBus","EventHandler","target","propertyKey","descriptor","originalMethod","initMethod","initEventListeners","AsyncEventHandler","EntityQueryBuilder","entityManager","_allComponents","_anyComponents","_withoutComponents","_withTags","_withoutTags","_activeOnly","_enabledOnly","_customPredicates","withTag","withoutTag","where","candidates","queryWithComponentIndex","getAllEntities","matchesEntity","first","hasAny","EntityManager","_entitiesByName","_entitiesByTag","_destroyedEntities","_identifierPool","_componentIndexManager","_archetypeSystem","_dirtyTrackingSystem","_eventBus","activeEntityCount","updateTagIndex","entityOrId","getEntity","numId","parseInt","getEntitiesWithComponent","getOptimizationStats","TypeUtils","getType","NumberExtension","toNumber"],"mappings":"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"}