UNPKG

@esengine/ecs-framework

Version:

用于Laya、Cocos Creator等JavaScript游戏引擎的高性能ECS框架

1 lines 694 kB
{"version":3,"file":"index.cjs","sources":["../bin/Utils/GlobalManager.js","../bin/Utils/Time.js","../bin/Utils/Timers/Timer.js","../bin/Utils/PerformanceMonitor.js","../bin/Utils/Timers/TimerManager.js","../bin/Utils/Pool/Pool.js","../bin/Utils/Pool/PoolManager.js","../bin/Utils/Logger.js","../bin/ECS/Utils/BigIntCompatibility.js","../bin/ECS/Core/SoAStorage.js","../bin/ECS/Decorators/TypeDecorators.js","../bin/ECS/Core/ComponentStorage/ComponentRegistry.js","../bin/ECS/Core/ComponentStorage.js","../bin/ECS/Entity.js","../bin/ECS/Core/FluentAPI/EntityBuilder.js","../bin/ECS/Utils/EntityList.js","../bin/ECS/Utils/EntityProcessorList.js","../bin/ECS/Utils/IdentifierPool.js","../bin/ECS/Core/ComponentPool.js","../bin/ECS/Utils/SparseSet.js","../bin/ECS/Utils/ComponentSparseSet.js","../bin/ECS/Core/ComponentIndex.js","../bin/ECS/Core/DirtyTrackingSystem.js","../bin/ECS/Core/ArchetypeSystem.js","../bin/ECS/Core/QuerySystem.js","../bin/ECS/CoreEvents.js","../bin/ECS/Core/EventSystem.js","../bin/ECS/Core/EventBus.js","../bin/ECS/Scene.js","../bin/ECS/Core/FluentAPI/SceneBuilder.js","../bin/ECS/Core/FluentAPI/ComponentBuilder.js","../bin/ECS/Core/FluentAPI/EntityBatchOperator.js","../bin/ECS/Core/FluentAPI/ECSFluentAPI.js","../bin/ECS/World.js","../bin/ECS/WorldManager.js","../bin/ECS/Utils/Bits.js","../bin/ECS/Utils/ComponentTypeManager.js","../bin/Utils/Debug/EntityDataCollector.js","../bin/Utils/Debug/SystemDataCollector.js","../bin/Utils/Debug/PerformanceDataCollector.js","../bin/Utils/Debug/ComponentDataCollector.js","../bin/Utils/Debug/SceneDataCollector.js","../bin/Utils/Debug/WebSocketManager.js","../bin/Utils/Debug/DebugManager.js","../bin/Core.js","../bin/Utils/Emitter.js","../bin/ECS/Component.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/EntityManager.js","../bin/Utils/Extensions/TypeUtils.js","../bin/Utils/Extensions/NumberExtension.js"],"sourcesContent":["/**\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 * 使用外部引擎提供的deltaTime更新时间信息\n * @param deltaTime 外部引擎提供的帧时间间隔(秒)\n */\n static update(deltaTime) {\n // 设置未缩放的帧时间\n this.unscaledDeltaTime = deltaTime;\n this.deltaTime = deltaTime * this.timeScale;\n // 更新总时间\n this.unscaledTotalTime += this.unscaledDeltaTime;\n this.totalTime += this.deltaTime;\n // 更新帧数\n this.frameCount++;\n }\n /**\n * 场景改变时重置时间\n */\n static sceneChanged() {\n this.frameCount = 0;\n this.totalTime = 0;\n this.unscaledTotalTime = 0;\n this.deltaTime = 0;\n this.unscaledDeltaTime = 0;\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//# 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 /**\n * 定时器是否已完成\n */\n get isDone() {\n return this._isDone;\n }\n /**\n * 定时器已运行的时间\n */\n get elapsedTime() {\n return this._elapsedTime;\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","/**\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","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 * 支持任意类型的对象池化,包含详细的统计信息\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 this._stats.totalCreated++;\n this._updateHitRate();\n return this._createFn();\n }\n /**\n * 释放对象回池中\n * @param obj 要释放的对象\n */\n release(obj) {\n if (!obj)\n return;\n this._stats.totalReleased++;\n // 如果池未满,将对象放回池中\n if (this._stats.size < this._maxSize) {\n // 重置对象状态\n obj.reset();\n this._objects.push(obj);\n this._stats.size++;\n this._updateMemoryUsage();\n }\n // 如果池已满,让对象被垃圾回收\n }\n /**\n * 获取池统计信息\n * @returns 统计信息对象\n */\n getStats() {\n return { ...this._stats };\n }\n /**\n * 清空池\n */\n clear() {\n // 重置所有对象\n for (const obj of this._objects) {\n obj.reset();\n }\n this._objects.length = 0;\n this._stats.size = 0;\n this._updateMemoryUsage();\n }\n /**\n * 压缩池(移除多余的对象)\n * @param targetSize 目标大小,默认为当前大小的一半\n */\n compact(targetSize) {\n const target = targetSize ?? Math.floor(this._objects.length / 2);\n while (this._objects.length > target) {\n const obj = this._objects.pop();\n if (obj) {\n obj.reset();\n this._stats.size--;\n }\n }\n this._updateMemoryUsage();\n }\n /**\n * 预填充池\n * @param count 预填充的对象数量\n */\n prewarm(count) {\n const actualCount = Math.min(count, this._maxSize - this._objects.length);\n for (let i = 0; i < actualCount; i++) {\n const obj = this._createFn();\n obj.reset();\n this._objects.push(obj);\n this._stats.totalCreated++;\n this._stats.size++;\n }\n this._updateMemoryUsage();\n }\n /**\n * 设置最大池大小\n * @param maxSize 新的最大大小\n */\n setMaxSize(maxSize) {\n this._maxSize = maxSize;\n this._stats.maxSize = maxSize;\n // 如果当前池大小超过新的最大值,进行压缩\n if (this._objects.length > maxSize) {\n this.compact(maxSize);\n }\n }\n /**\n * 获取池中可用对象数量\n * @returns 可用对象数量\n */\n getAvailableCount() {\n return this._objects.length;\n }\n /**\n * 检查池是否为空\n * @returns 如果池为空返回true\n */\n isEmpty() {\n return this._objects.length === 0;\n }\n /**\n * 检查池是否已满\n * @returns 如果池已满返回true\n */\n isFull() {\n return this._objects.length >= this._maxSize;\n }\n /**\n * 获取所有已注册的池类型\n * @returns 所有池类型的数组\n */\n static getAllPoolTypes() {\n return Array.from(this._pools.keys());\n }\n /**\n * 获取所有池的统计信息\n * @returns 包含所有池统计信息的对象\n */\n static getAllPoolStats() {\n const stats = {};\n for (const [type, pool] of this._pools) {\n const typeName = type.name || type.toString();\n stats[typeName] = pool.getStats();\n }\n return stats;\n }\n /**\n * 压缩所有池\n */\n static compactAllPools() {\n for (const pool of this._pools.values()) {\n pool.compact();\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 getGlobalStatsString() {\n const stats = this.getAllPoolStats();\n const lines = ['=== Object Pool Global Statistics ===', ''];\n if (Object.keys(stats).length === 0) {\n lines.push('No pools registered');\n return lines.join('\\n');\n }\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 /**\n * 更新命中率\n */\n _updateHitRate() {\n if (this._stats.totalObtained === 0) {\n this._stats.hitRate = 0;\n }\n else {\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}\nPool._pools = new Map();\n//# sourceMappingURL=Pool.js.map","import { Pool } from './Pool';\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 * @param name 池名称\n * @param createFn 创建函数\n * @param maxSize 最大大小\n * @param estimatedObjectSize 估算对象大小\n * @returns 池实例\n */\n createPool(name, createFn, maxSize = 100, estimatedObjectSize = 1024) {\n let pool = this.pools.get(name);\n if (!pool) {\n pool = new Pool(createFn, maxSize, estimatedObjectSize);\n this.pools.set(name, pool);\n }\n return pool;\n }\n /**\n * 移除池\n * @param name 池名称\n * @returns 是否成功移除\n */\n removePool(name) {\n const pool = this.pools.get(name);\n if (pool) {\n pool.clear();\n this.pools.delete(name);\n return true;\n }\n return false;\n }\n /**\n * 获取所有池名称\n * @returns 池名称数组\n */\n getPoolNames() {\n return Array.from(this.pools.keys());\n }\n /**\n * 获取池数量\n * @returns 池数量\n */\n getPoolCount() {\n return this.pools.size;\n }\n /**\n * 压缩所有池\n */\n compactAllPools() {\n for (const pool of this.pools.values()) {\n pool.compact();\n }\n }\n /**\n * 清空所有池\n */\n clearAllPools() {\n for (const pool of this.pools.values()) {\n pool.clear();\n }\n }\n /**\n * 获取所有池的统计信息\n * @returns 统计信息映射\n */\n getAllStats() {\n const stats = new Map();\n for (const [name, pool] of this.pools) {\n stats.set(name, pool.getStats());\n }\n return stats;\n }\n /**\n * 获取总体统计信息\n * @returns 总体统计信息\n */\n getGlobalStats() {\n let totalSize = 0;\n let totalMaxSize = 0;\n let totalCreated = 0;\n let totalObtained = 0;\n let totalReleased = 0;\n let totalMemoryUsage = 0;\n for (const pool of this.pools.values()) {\n const stats = pool.getStats();\n totalSize += stats.size;\n totalMaxSize += stats.maxSize;\n totalCreated += stats.totalCreated;\n totalObtained += stats.totalObtained;\n totalReleased += stats.totalReleased;\n totalMemoryUsage += stats.estimatedMemoryUsage;\n }\n const hitRate = totalObtained === 0 ? 0 : (totalObtained - totalCreated) / totalObtained;\n return {\n size: totalSize,\n maxSize: totalMaxSize,\n totalCreated,\n totalObtained,\n totalReleased,\n hitRate,\n estimatedMemoryUsage: totalMemoryUsage\n };\n }\n /**\n * 获取格式化的统计信息字符串\n * @returns 格式化字符串\n */\n getStatsString() {\n const lines = ['=== Pool Manager Statistics ===', ''];\n if (this.pools.size === 0) {\n lines.push('No pools registered');\n return lines.join('\\n');\n }\n const globalStats = this.getGlobalStats();\n lines.push(`Total Pools: ${this.pools.size}`);\n lines.push(`Global Hit Rate: ${(globalStats.hitRate * 100).toFixed(1)}%`);\n lines.push(`Global Memory Usage: ${(globalStats.estimatedMemoryUsage / 1024).toFixed(1)} KB`);\n lines.push('');\n for (const [name, pool] of this.pools) {\n const stats = pool.getStats();\n lines.push(`${name}:`);\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 lines.push('');\n }\n return lines.join('\\n');\n }\n /**\n * 设置自动压缩间隔\n * @param intervalMs 间隔毫秒数\n */\n setAutoCompactInterval(intervalMs) {\n this.autoCompactInterval = intervalMs;\n }\n /**\n * 预填充所有池\n */\n prewarmAllPools() {\n for (const pool of this.pools.values()) {\n const stats = pool.getStats();\n const prewarmCount = Math.floor(stats.maxSize * 0.2); // 预填充20%\n pool.prewarm(prewarmCount);\n }\n }\n /**\n * 重置池管理器\n */\n reset() {\n this.clearAllPools();\n this.pools.clear();\n this.lastCompactTime = 0;\n }\n}\n//# sourceMappingURL=PoolManager.js.map","/**\n * 日志级别\n */\nexport var LogLevel;\n(function (LogLevel) {\n LogLevel[LogLevel[\"Debug\"] = 0] = \"Debug\";\n LogLevel[LogLevel[\"Info\"] = 1] = \"Info\";\n LogLevel[LogLevel[\"Warn\"] = 2] = \"Warn\";\n LogLevel[LogLevel[\"Error\"] = 3] = \"Error\";\n LogLevel[LogLevel[\"Fatal\"] = 4] = \"Fatal\";\n LogLevel[LogLevel[\"None\"] = 5] = \"None\";\n})(LogLevel || (LogLevel = {}));\n/**\n * 预定义的颜色常量\n */\nexport const Colors = {\n // 基础颜色\n BLACK: '\\x1b[30m',\n RED: '\\x1b[31m',\n GREEN: '\\x1b[32m',\n YELLOW: '\\x1b[33m',\n BLUE: '\\x1b[34m',\n MAGENTA: '\\x1b[35m',\n CYAN: '\\x1b[36m',\n WHITE: '\\x1b[37m',\n // 亮色版本\n BRIGHT_BLACK: '\\x1b[90m',\n BRIGHT_RED: '\\x1b[91m',\n BRIGHT_GREEN: '\\x1b[92m',\n BRIGHT_YELLOW: '\\x1b[93m',\n BRIGHT_BLUE: '\\x1b[94m',\n BRIGHT_MAGENTA: '\\x1b[95m',\n BRIGHT_CYAN: '\\x1b[96m',\n BRIGHT_WHITE: '\\x1b[97m',\n // 特殊\n RESET: '\\x1b[0m',\n BOLD: '\\x1b[1m',\n UNDERLINE: '\\x1b[4m'\n};\n/**\n * 默认控制台日志实现\n */\nexport class ConsoleLogger {\n constructor(config = {}) {\n this._config = {\n level: LogLevel.Info,\n enableTimestamp: true,\n enableColors: typeof window === 'undefined',\n ...config\n };\n }\n /**\n * 输出调试级别日志\n * @param message 日志消息\n * @param args 附加参数\n */\n debug(message, ...args) {\n this.log(LogLevel.Debug, message, ...args);\n }\n /**\n * 输出信息级别日志\n * @param message 日志消息\n * @param args 附加参数\n */\n info(message, ...args) {\n this.log(LogLevel.Info, message, ...args);\n }\n /**\n * 输出警告级别日志\n * @param message 日志消息\n * @param args 附加参数\n */\n warn(message, ...args) {\n this.log(LogLevel.Warn, message, ...args);\n }\n /**\n * 输出错误级别日志\n * @param message 日志消息\n * @param args 附加参数\n */\n error(message, ...args) {\n this.log(LogLevel.Error, message, ...args);\n }\n /**\n * 输出致命错误级别日志\n * @param message 日志消息\n * @param args 附加参数\n */\n fatal(message, ...args) {\n this.log(LogLevel.Fatal, message, ...args);\n }\n /**\n * 设置日志级别\n * @param level 日志级别\n */\n setLevel(level) {\n this._config.level = level;\n }\n /**\n * 设置颜色配置\n * @param colors 颜色配置\n */\n setColors(colors) {\n if (Object.keys(colors).length === 0) {\n // 重置为默认颜色\n delete this._config.colors;\n }\n else {\n this._config.colors = {\n ...this._config.colors,\n ...colors\n };\n }\n }\n /**\n * 设置日志前缀\n * @param prefix 前缀字符串\n */\n setPrefix(prefix) {\n this._config.prefix = prefix;\n }\n /**\n * 内部日志输出方法\n * @param level 日志级别\n * @param message 日志消息\n * @param args 附加参数\n */\n log(level, message, ...args) {\n if (level < this._config.level) {\n return;\n }\n let formattedMessage = message;\n // 添加时间戳\n if (this._config.enableTimestamp) {\n const timestamp = new Date().toISOString();\n formattedMessage = `[${timestamp}] ${formattedMessage}`;\n }\n // 添加前缀\n if (this._config.prefix) {\n formattedMessage = `[${this._config.prefix}] ${formattedMessage}`;\n }\n // 添加日志级别\n const levelName = LogLevel[level].toUpperCase();\n formattedMessage = `[${levelName}] ${formattedMessage}`;\n // 使用自定义输出或默认控制台输出\n if (this._config.output) {\n this._config.output(level, formattedMessage);\n }\n else {\n this.outputToConsole(level, formattedMessage, ...args);\n }\n }\n /**\n * 输出到控制台\n * @param level 日志级别\n * @param message 格式化后的消息\n * @param args 附加参数\n */\n outputToConsole(level, message, ...args) {\n const colors = this._config.enableColors ? this.getColors() : null;\n switch (level) {\n case LogLevel.Debug:\n if (colors) {\n console.debug(`${colors.debug}${message}${colors.reset}`, ...args);\n }\n else {\n console.debug(message, ...args);\n }\n break;\n case LogLevel.Info:\n if (colors) {\n console.info(`${colors.info}${message}${colors.reset}`, ...args);\n }\n else {\n console.info(message, ...args);\n }\n break;\n case LogLevel.Warn:\n if (colors) {\n console.warn(`${colors.warn}${message}${colors.reset}`, ...args);\n }\n else {\n console.warn(message, ...args);\n }\n break;\n case LogLevel.Error:\n if (colors) {\n console.error(`${colors.error}${message}${colors.reset}`, ...args);\n }\n else {\n console.error(message, ...args);\n }\n break;\n case LogLevel.Fatal:\n if (colors) {\n console.error(`${colors.fatal}${message}${colors.reset}`, ...args);\n }\n else {\n console.error(message, ...args);\n }\n break;\n }\n }\n /**\n * 获取控制台颜色配置\n * @returns 颜色配置对象\n */\n getColors() {\n // 默认颜色配置\n const defaultColors = {\n debug: Colors.BRIGHT_BLACK, // 灰色\n info: Colors.GREEN, // 绿色\n warn: Colors.YELLOW, // 黄色\n error: Colors.RED, // 红色\n fatal: Colors.BRIGHT_RED, // 亮红色\n reset: Colors.RESET // 重置\n };\n // 合并用户自定义颜色\n return {\n ...defaultColors,\n ...this._config.colors\n };\n }\n}\n/**\n * 日志管理器\n */\nexport class LoggerManager {\n constructor() {\n this._loggers = new Map();\n this._defaultLogger = new ConsoleLogger();\n }\n /**\n * 获取日志管理器实例\n * @returns 日志管理器实例\n */\n static getInstance() {\n if (!LoggerManager._instance) {\n LoggerManager._instance = new LoggerManager();\n }\n return LoggerManager._instance;\n }\n /**\n * 获取或创建日志器\n * @param name 日志器名称\n * @returns 日志器实例\n */\n getLogger(name) {\n if (!name) {\n return this._defaultLogger;\n }\n if (!this._loggers.has(name)) {\n const logger = new ConsoleLogger({\n prefix: name,\n level: LogLevel.Info\n });\n this._loggers.set(name, logger);\n }\n return this._loggers.get(name);\n }\n /**\n * 设置日志器\n * @param name 日志器名称\n * @param logger 日志器实例\n */\n setLogger(name, logger) {\n this._loggers.set(name, logger);\n }\n /**\n * 设置全局日志级别\n * @param level 日志级别\n */\n setGlobalLevel(level) {\n if (this._defaultLogger instanceof ConsoleLogger) {\n this._defaultLogger.setLevel(level);\n }\n for (const logger of this._loggers.values()) {\n if (logger instanceof ConsoleLogger) {\n logger.setLevel(level);\n }\n }\n }\n /**\n * 创建子日志器\n * @param parentName 父日志器名称\n * @param childName 子日志器名称\n * @returns 子日志器实例\n */\n createChildLogger(parentName, childName) {\n const fullName = `${parentName}.${childName}`;\n return this.getLogger(fullName);\n }\n /**\n * 设置全局颜色配置\n * @param colors 颜色配置\n */\n setGlobalColors(colors) {\n if (this._defaultLogger instanceof ConsoleLogger) {\n this._defaultLogger.setColors(colors);\n }\n for (const logger of this._loggers.values()) {\n if (logger instanceof ConsoleLogger) {\n logger.setColors(colors);\n }\n }\n }\n /**\n * 重置为默认颜色配置\n */\n resetColors() {\n if (this._defaultLogger instanceof ConsoleLogger) {\n this._defaultLogger.setColors({});\n }\n for (const logger of this._loggers.values()) {\n if (logger instanceof ConsoleLogger) {\n logger.setColors({});\n }\n }\n }\n}\n/**\n * 默认日志器实例\n */\nexport const Logger = LoggerManager.getInstance().getLogger();\n/**\n * 创建命名日志器\n * @param name 日志器名称\n * @returns 日志器实例\n */\nexport function createLogger(name) {\n return LoggerManager.getInstance().getLogger(name);\n}\n/**\n * 设置全局日志颜色配置\n * @param colors 颜色配置\n */\nexport function setLoggerColors(colors) {\n LoggerManager.getInstance().setGlobalColors(colors);\n}\n/**\n * 重置日志颜色为默认配置\n */\nexport function resetLoggerColors() {\n LoggerManager.getInstance().resetColors();\n}\n/**\n * 设置全局日志级别\n * @param level 日志级别\n */\nexport function setGlobalLogLevel(level) {\n LoggerManager.getInstance().setGlobalLevel(level);\n}\n//# sourceMappingURL=Logger.js.map","/**\n * 64位掩码兼容层\n */\nexport class BitMask64Utils {\n /**\n * 根据位索引创建64位掩码\n * @param bitIndex 位索引,范围 [0, 63]\n * @returns 包含指定位设置为1的掩码\n * @throws 当位索引超出范围时抛出错误\n */\n static create(bitIndex) {\n if (bitIndex < 0 || bitIndex >= 64) {\n throw new Error(`Bit index ${bitIndex} out of range [0, 63]`);\n }\n if (bitIndex < 32) {\n return { lo: 1 << bitIndex, hi: 0 };\n }\n else {\n return { lo: 0, hi: 1 << (bitIndex - 32) };\n }\n }\n /**\n * 从32位数字创建64位掩码\n * @param value 32位数字值\n * @returns 低32位为输入值、高32位为0的掩码\n */\n static fromNumber(value) {\n return { lo: value >>> 0, hi: 0 };\n }\n /**\n * 检查掩码是否包含任意指定的位\n * @param mask 要检查的掩码\n * @param bits 指定的位模式\n * @returns 如果掩码包含bits中的任意位则返回true\n */\n static hasAny(mask, bits) {\n return (mask.lo & bits.lo) !== 0 || (mask.hi & bits.hi) !== 0;\n }\n /**\n * 检查掩码是否包含所有指定的位\n * @param mask 要检查的掩码\n * @param bits 指定的位模式\n * @returns 如果掩码包含bits中的所有位则返回true\n */\n static hasAll(mask, bits) {\n return (mask.lo & bits.lo) === bits.lo && (mask.hi & bits.hi) === bits.hi;\n }\n /**\n * 检查掩码是否不包含任何指定的位\n * @param mask 要检查的掩码\n * @param bits 指定的位模式\n * @returns 如果掩码不包含bits中的任何位则返回true\n */\n static hasNone(mask, bits) {\n return (mask.lo & bits.lo) === 0 && (mask.hi & bits.hi) === 0;\n }\n /**\n * 检查掩码是否为零\n * @param mask 要检查的掩码\n * @returns 如果掩码所有位都为0则返回true\n */\n static isZero(mask) {\n return mask.lo === 0 && mask.hi === 0;\n }\n /**\n * 检查两个掩码是否相等\n * @param a 第一个掩码\n * @param b 第二个掩码\n * @returns 如果两个掩码完全相等则返回true\n */\n static equals(a, b) {\n return a.lo === b.lo && a.hi === b.hi;\n }\n /**\n * 设置掩码中指定位为1\n * @param mask 要修改的掩码(原地修改)\n * @param bitIndex 位索引,范围 [0, 63]\n * @throws 当位索引超出范围时抛出错误\n */\n static setBit(mask, bitIndex) {\n if (bitIndex < 0 || bitIndex >= 64) {\n throw new Error(`Bit index ${bitIndex} out of range [0, 63]`);\n }\n if (bitIndex < 32) {\n mask.lo |= (1 << bitIndex);\n }\n else {\n mask.hi |= (1 << (bitIndex - 32));\n }\n }\n /**\n * 清除掩码中指定位为0\n * @param mask 要修改的掩码(原地修改)\n * @param bitIndex 位索引,范围 [0, 63]\n * @throws 当位索引超出范围时抛出错误\n */\n static clearBit(mask, bitIndex) {\n if (bitIndex < 0 || bitIndex >= 64) {\n throw new Error(`Bit index ${bitIndex} out of range [0, 63]`);\n }\n if (bitIndex < 32) {\n mask.lo &= ~(1 << bitIndex);\n }\n else {\n mask.hi &= ~(1 << (bitIndex - 32));\n }\n }\n /**\n * 对目标掩码执行按位或操作\n * @param target 目标掩码(原地修改)\n * @param other 用于按位或的掩码\n */\n static orInPlace(target, other) {\n target.lo |= other.lo;\n target.hi |= other.hi;\n }\n /**\n * 对目标掩码执行按位与操作\n * @param target 目标掩码(原地修改)\n * @param other 用于按位与的掩码\n */\n static andInPlace(target, other) {\n target.lo &= other.lo;\n target.hi &= other.hi;\n }\n /**\n * 对目标掩码执行按位异或操作\n * @param target 目标掩码(原地修改)\n * @param other 用于按位异或的掩码\n */\n static xorInPlace(target, other) {\n target.lo ^= other.lo;\n target.hi ^= other.hi;\n }\n /**\n * 清除掩码的所有位为0\n * @param mask 要清除的掩码(原地修改)\n */\n static clear(mask) {\n mask.lo = 0;\n mask.hi = 0;\n }\n /**\n * 将源掩码的值复制到目标掩码\n * @param source 源掩码\n * @param target 目标掩码(原地修改)\n */\n static copy(source, target) {\n target.lo = source.lo;\n target.hi = source.hi;\n }\n /**\n * 创建掩码的深拷贝\n * @param mask 要拷贝的掩码\n * @returns 新的掩码对象,内容与源掩码相同\n */\n static clone(mask) {\n return { lo: mask.lo, hi: mask.hi };\n }\n /**\n * 将掩码转换为字符串表示\n * @param mask 要转换的掩码\n * @param radix 进制,支持2(二进制)或16(十六进制),默认为2\n * @returns 掩码的字符串表示,二进制不带前缀,十六进制带0x前缀\n * @throws 当进制不支持时抛出错误\n */\n static toString(mask, radix = 2) {\n if (radix === 2) {\n if (mask.hi === 0) {\n return mask.lo.toString(2);\n }\n else {\n const hiBits = mask.hi.toString(2);\n const loBits = mask.lo.toString(2).padStart(32, '0');\n return hiBits + loBits;\n }\n }\n else if (radix === 16) {\n if (mask.hi === 0) {\n return '0x' + mask.lo.toString(16).toUpperCase();\n }\n else {\n const hiBits = mask.hi.toString(16).toUpperCase();\n const loBits = mask.lo.toString(16).toUpperCase().padStart(8, '0');\n return '0x' + hiBits + loBits;\n }\n }\n else {\n throw new Error('Only radix 2 and 16 are supported');\n }\n }\n /**\n * 计算掩码中设置为1的位数\n * @param mask 要计算的掩码\n * @returns 掩码中1的位数\n */\n static popCount(mask) {\n let count = 0;\n let lo = mask.lo;\n let hi = mask.hi;\n while (lo) {\n lo &= lo - 1;\n count++;\n }\n while (hi) {\n hi &= hi - 1;\n count++;\n }\n return count;\n }\n}\n/** 零掩码常量,所有位都为0 */\nBitMask64Utils.ZERO = { lo: 0, hi: 0 };\n//# sourceMappingURL=BigIntCompatibility.js.map","import { createLogger } from '../../Utils/Logger';\n/**\n * 启用SoA优化装饰器\n * 默认关闭SoA,只有在大规模批量操作场景下才建议开启\n */\nexport function EnableSoA(target) {\n target.__enableSoA = true;\n return target;\n}\n/**\n * 高精度数值装饰器\n * 标记字段需要保持完整精度,存储为复杂对象而非TypedArray\n */\nexport function HighPrecision(target, propertyKey) {\n const key = String(propertyKey);\n if (!target.constructor.__highPrecisionFields) {\n target.constructor.__highPrecisionFields = new Set();\n }\n target.constructor.__highPrecisionFields.add(key);\n}\n/**\n * 64位浮点数装饰器\n * 标记字段使用Float64Array存储(更高精度但更多内存)\n */\nexport function Float64(target, propertyKey) {\n const key = String(propertyKey);\n if (!target.constructor.__float64Fields) {\n target.constructor.__float64Fields = new Set();\n }\n target.constructor.__float64Fields.add(key);\n}\n/**\n * 32位浮点数装饰器\n * 标记字段使用Float32Array存储(默认类型,平衡性能和精度)\n */\nexport function Float32(target, propertyKey) {\n const key = String(propertyKey);\n if (!target.constructor.__float32Fields) {\n target.constructor.__float32Fields = new Set();\n }\n target.constructor.__float32Fields.add(key);\n}\n/**\n * 32位整数装饰器\n * 标记字段使用Int32Array存储(适用于整数值)\n */\nexport function Int32(target, propertyKey) {\n const key = String(propertyKey);\n if (!target.constructor.__int32Fields) {\n target.constructor.__int32Fields = new Set();\n }\n target.constructor.__int32Fields.add(key);\n}\n/**\n * 序列化Map装饰器\n * 标记Map字段需要序列化/反序列化存储\n */\nexport function SerializeMap(target, propertyKey) {\n const key = String(propertyKey);\n if (!target.constructor.__serializeMapFields) {\n target.constructor.__serializeMapFields = new Set();\n }\n target.constructor.__serializeMapFields.add(key);\n}\n/**\n * 序列化Set装饰器\n * 标记Set字段需要序列化/反序列化存储\n */\nexport function SerializeSet(target, propertyKey) {\n const key = String(propertyKey);\n if (!target.constructor.__serializeSetFields) {\n target.constructor.__serializeSetFields = new Set();\n }\n target.constructor.__serializeSetFields.add(key);\n}\n/**\n * 序列化Array装饰器\n * 标记Array字段需要序列化/反序列化存储\n */\nexport function SerializeArray(target, propertyKey) {\n const key = String(propertyKey);\n if (!target.constructor.__serializeArrayFields) {\n target.constructor.__serializeArrayFields = new Set();\n }\n target.constructor.__serializeArrayFields.add(key);\n}\n/**\n * 深拷贝装饰器\n * 标记字段需要深拷贝处理(适用于嵌套对象)\n */\nexport function DeepCopy(target, propertyKey) {\n const key = String(propertyKey);\n if (!target.constructor.__deepCopyFields) {\n target.constructor.__deepCopyFields = new Set();\n }\n target.constructor.__deepCopyFields.add(key);\n}\n/**\n * SoA存储器(需要装饰器启用)\n * 使用Structure of Arrays存储模式,在大规模批量操作时提供优异性能\n */\nexport class SoAStorage {\n constructor(componentType) {\n this.fields = new Map();\n this.stringFields = new Map(); // 专门存储字符串\n this.serializedFields = new Map(); // 序列化存储Map/Set/Array\n this.complexFields = new Map(); // 存储复杂对象\n this.entityToIndex = new Map();\n this.indexToEntity = [];\n this.freeIndices = [];\n this._size = 0;\n this._capacity = 1000;\n this.type = componentType;\n this.initializeFields(componentType);\n }\n initializeFields(componentType) {\n const instance = new componentType();\n const highPrecisionFields = componentType.__highPrecisionFields || new Set();\n const float64Fields = componentType.__float64Fields || new Set();\n const float32Fields = componentType.__float32Fields || new Set();\n const int32Fields = componentType.__int32Fields || new Set();\n const serializeMapFields = componentType.__serializeMapFields || new Set();\n const serializeSetFields = componentType.__serializeSetFields || new Set();\n const serializeArrayFields = componentType.__serializeArrayFields || new Set();\n // const deepCopyFields = (componentType as any).__deepCopyFields || new Set(); // 未使用,但保留供future使用\n for (const key in instance) {\n if (instance.hasOwnProperty(key) && key !== 'id') {\n const value = instance[key];\n const type = typeof value;\n if (type === 'number') {\n if (highPrecisionFields.has(key)) {\n // 标记为高精度,作为复杂对象处理\n // 不添加到fields,会在updateComponentAtIndex中自动添加到complexFields\n }\n else if (float64Fields.has(key)) {\n // 使用Float64Array存储\n this.fields.set(key, new Float64Array(this._capacity));\n }\n else if (int32Fields.has(key)) {\n // 使用Int32Array存储\n this.fields.set(key, new Int32Array(this._capacity));\n }\n else if (float32Fields.has(key)) {\n // 使用Float32Array存储\n this.fields.set(key, new Float32Array(this._capacity));\n }\n else {\n // 默认使用Float32Array\n this.fields.set(key, new Float32Array(this._capacity));\n }\n }\n else if (type === 'boolean') {\n // 布尔值使用Float32Array存储为0/1\n this.fields.set(key, new Float32Array(this._capacity));\n }\n else if (type === 'string') {\n // 字符串专门处理\n this.stringFields.set(key, new Array(this._capacity));\n }\n else if (type === 'object' && value !== null) {\n // 处理集合类型\n if (serializeMapFields.has(key) || serializeSetFields.has(key) || serializeArrayFields.has(key)) {\n // 序列化存储\n this.serializedFields.set(key, new Array(this._capacity));\n }\n // 其他对象类型会在updateComponentAtIndex中作为复杂对象处理\n }\n }\n }\n }\n addComponent(entityId, component) {\n if (this.entityToIndex.has(entityId)) {\n const index = this.entityToIndex.get(entityId);\n this.updateComponentAtIndex(index, component);\n return;\n }\n let index;\n if (this.freeIndices.length > 0) {\n index = this.freeIndices.pop();\n }\n else {\n index = this._size;\n if (index >= this._capacity) {\n this.resize(this._capacity * 2);\n }\n }\n this.entityToIndex.set(entityId, index);\n this.indexToEntity[index] = entityId;\n this.updateComponentAtIndex(index, component);\n this._size++;\n }\n updateComponentAtIndex(index, component) {\n const entityId = this.indexToEntity[index];\n const complexFieldMap = new Map();\n const highPrecisionFields = this.type.__highPrecisionFields || new Set();\n const serializeMapFields = this.type.__serializeMapFields || new Set();\n const serializeSetFields = this.type.__serializeSetFields || new Set();\n const serializeArrayFields = this.type.__serializeArrayFields || new Set();\n const deepCopyFields = this.type.__deepCopyFields || new Set();\n // 处理所有字段\n for (const key in component) {\n if (component.hasOwnProperty(key) && key !== 'id') {\n const value = component[key];\n const type = typeof value;\n if (type === 'number') {\n if (highPrecisionFields.has(key) || !this.fields.has(key)) {\n // 标记为高精度或未在TypedArray中的数值作为复杂对象存储\n complexFieldMap.set(key, value);\n }\n else {\n // 存储到TypedArray\n const array = this.fields.get(key);\n array[index] =