UNPKG

@esengine/ecs-framework

Version:

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

1 lines 617 kB
{"version":3,"file":"index.cjs","sources":["../bin/Utils/GlobalManager.js","../bin/Utils/Time.js","../bin/Utils/Timers/Timer.js","../bin/Utils/Timers/TimerManager.js","../bin/Utils/PerformanceMonitor.js","../bin/Utils/Logger.js","../bin/Utils/Pool/Pool.js","../bin/Utils/Pool/PoolManager.js","../bin/ECS/Utils/BigIntCompatibility.js","../bin/ECS/Core/SoAStorage.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/Core/ComponentIndex.js","../bin/ECS/Core/DirtyTrackingSystem.js","../bin/ECS/Core/QuerySystem.js","../bin/ECS/CoreEvents.js","../bin/ECS/Core/ArchetypeSystem.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/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","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 */\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 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 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.gray}${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.blue}${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.yellow}${message}${colors.reset}`, ...args);\n }\n else {\n console.warn(message, ...args);\n }\n break;\n case LogLevel.Error:\n case LogLevel.Fatal:\n if (colors) {\n console.error(`${colors.red}${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 return {\n reset: '\\x1b[0m',\n red: '\\x1b[31m',\n yellow: '\\x1b[33m',\n blue: '\\x1b[34m',\n gray: '\\x1b[90m'\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 * 默认日志器实例\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 level 日志级别\n */\nexport function setGlobalLogLevel(level) {\n LoggerManager.getInstance().setGlobalLevel(level);\n}\n//# sourceMappingURL=Logger.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 * BigInt兼容性抽象层\n *\n * 为不支持BigInt的环境提供兼容实现,确保ECS框架在所有平台上都能正常运行。\n * 自动检测运行时环境的BigInt支持情况,并提供统一的接口。\n *\n * @example\n * ```typescript\n * // 创建兼容的BigInt值\n * const value = BigIntFactory.create(123);\n *\n * // 位运算\n * const result = value.or(BigIntFactory.create(456));\n *\n * // 检查兼容性\n * console.log(BigIntFactory.isNativeSupported()); // true/false\n * ```\n */\n/**\n * 原生BigInt包装器\n *\n * 为支持BigInt的环境提供统一接口包装。\n */\nclass NativeBigInt {\n constructor(value) {\n this.value = value;\n }\n valueOf() {\n return Number(this.value);\n }\n toString(radix) {\n if (radix !== undefined && radix !== 10 && radix !== 16 && radix !== 2) {\n throw new Error('Only radix 2, 10, and 16 are supported');\n }\n const result = this.value.toString(radix);\n if (radix === 16) {\n return result.toUpperCase();\n }\n return result;\n }\n and(other) {\n const otherBigInt = other instanceof NativeBigInt ? other.value : BigInt(other.valueOf());\n return new NativeBigInt(this.value & otherBigInt);\n }\n or(other) {\n const otherBigInt = other instanceof NativeBigInt ? other.value : BigInt(other.valueOf());\n return new NativeBigInt(this.value | otherBigInt);\n }\n xor(other) {\n const otherBigInt = other instanceof NativeBigInt ? other.value : BigInt(other.valueOf());\n return new NativeBigInt(this.value ^ otherBigInt);\n }\n not(maxBits = 64) {\n const mask = (BigInt(1) << BigInt(maxBits)) - BigInt(1);\n return new NativeBigInt((~this.value) & mask);\n }\n shiftLeft(bits) {\n return new NativeBigInt(this.value << BigInt(bits));\n }\n shiftRight(bits) {\n return new NativeBigInt(this.value >> BigInt(bits));\n }\n equals(other) {\n const otherBigInt = other instanceof NativeBigInt ? other.value : BigInt(other.valueOf());\n return this.value === otherBigInt;\n }\n isZero() {\n return this.value === BigInt(0);\n }\n clone() {\n return new NativeBigInt(this.value);\n }\n}\n/**\n * 数组模拟BigInt实现\n *\n * 为不支持BigInt的环境提供兼容实现,使用32位数组模拟大整数运算。\n * 性能略低于原生BigInt,但保证功能一致性。\n */\nclass ArrayBigInt {\n /**\n * 构造函数\n * @param value 初始值,可以是数值、字符串或数组\n */\n constructor(value = 0) {\n this.chunks = []; // 32位块数组\n if (typeof value === 'number') {\n this.fromNumber(value);\n }\n else if (typeof value === 'string') {\n this.fromString(value);\n }\n else {\n this.chunks = value.slice();\n }\n this.normalize();\n }\n /**\n * 从数值初始化\n * @param value 数值\n */\n fromNumber(value) {\n this.chunks = [];\n // 处理负数(在位运算中通常不会遇到)\n if (value < 0) {\n value = Math.abs(value);\n }\n if (value === 0) {\n this.chunks = [0];\n return;\n }\n while (value > 0) {\n this.chunks.push(value & ArrayBigInt.CHUNK_MASK);\n value = Math.floor(value / ArrayBigInt.CHUNK_MAX);\n }\n }\n /**\n * 从字符串初始化\n * @param value 字符串(支持十进制、十六进制、二进制)\n */\n fromString(value) {\n value = value.trim();\n if (value.startsWith('0x') || value.startsWith('0X')) {\n // 十六进制\n this.fromHexString(value.substring(2));\n }\n else if (value.startsWith('0b') || value.startsWith('0B')) {\n // 二进制\n this.fromBinaryString(value.substring(2));\n }\n else {\n // 十进制\n this.fromDecimalString(value);\n }\n }\n /**\n * 从十六进制字符串初始化\n * @param hex 十六进制字符串\n */\n fromHexString(hex) {\n this.chunks = [0];\n for (let i = hex.length - 1; i >= 0; i -= 8) {\n const start = Math.max(0, i - 7);\n const chunk = parseInt(hex.substring(start, i + 1), 16);\n this.chunks.push(chunk);\n }\n this.normalize();\n }\n /**\n * 从二进制字符串初始化\n * @param binary 二进制字符串\n */\n fromBinaryString(binary) {\n this.chunks = [0];\n for (let i = binary.length - 1; i >= 0; i -= 32) {\n const start = Math.max(0, i - 31);\n const chunk = parseInt(binary.substring(start, i + 1), 2);\n this.chunks.push(chunk);\n }\n this.normalize();\n }\n /**\n * 从十进制字符串初始化\n * @param decimal 十进制字符串\n */\n fromDecimalString(decimal) {\n // 简化实现,直接转换为数值(在ECS位运算场景中通常是小数值)\n const num = parseInt(decimal, 10);\n this.fromNumber(num);\n }\n /**\n * 规范化数组,移除前导零\n */\n normalize() {\n while (this.chunks.length > 1 && this.chunks[this.chunks.length - 1] === 0) {\n this.chunks.pop();\n }\n if (this.chunks.length === 0) {\n this.chunks = [0];\n }\n }\n valueOf() {\n let result = 0;\n let multiplier = 1;\n for (const chunk of this.chunks) {\n result += chunk * multiplier;\n multiplier *= ArrayBigInt.CHUNK_MAX;\n // 防止溢出\n if (multiplier > Number.MAX_SAFE_INTEGER) {\n break;\n }\n }\n return result;\n }\n toString(radix = 10) {\n if (radix !== 10 && radix !== 16 && radix !== 2) {\n throw new Error('Only radix 2, 10, and 16 are supported');\n }\n if (this.isZero()) {\n return '0';\n }\n if (radix === 10) {\n // 简化实现,转换为数值\n return this.valueOf().toString(10);\n }\n else if (radix === 16) {\n let result = '';\n for (let i = this.chunks.length - 1; i >= 0; i--) {\n const hex = this.chunks[i].toString(16);\n result += i === this.chunks.length - 1 ? hex : hex.padStart(8, '0');\n }\n return result.toUpperCase();\n }\n else if (radix === 2) {\n let result = '';\n for (let i = this.chunks.length - 1; i >= 0; i--) {\n const binary = this.chunks[i].toString(2);\n result += i === this.chunks.length - 1 ? binary : binary.padStart(32, '0');\n }\n return result;\n }\n return this.valueOf().toString(radix);\n }\n and(other) {\n const otherArray = other;\n const maxLength = Math.max(this.chunks.length, otherArray.chunks.length);\n const result = [];\n for (let i = 0; i < maxLength; i++) {\n const a = i < this.chunks.length ? this.chunks[i] : 0;\n const b = i < otherArray.chunks.length ? otherArray.chunks[i] : 0;\n result.push(a & b);\n }\n return new ArrayBigInt(result);\n }\n or(other) {\n const otherArray = other;\n const maxLength = Math.max(this.chunks.length, otherArray.chunks.length);\n const result = [];\n for (let i = 0; i < maxLength; i++) {\n const a = i < this.chunks.length ? this.chunks[i] : 0;\n const b = i < otherArray.chunks.length ? otherArray.chunks[i] : 0;\n result.push(a | b);\n }\n return new ArrayBigInt(result);\n }\n xor(other) {\n const otherArray = other;\n const maxLength = Math.max(this.chunks.length, otherArray.chunks.length);\n const result = [];\n for (let i = 0; i < maxLength; i++) {\n const a = i < this.chunks.length ? this.chunks[i] : 0;\n const b = i < otherArray.chunks.length ? otherArray.chunks[i] : 0;\n result.push(a ^ b);\n }\n return new ArrayBigInt(result);\n }\n not(maxBits = 64) {\n const maxChunks = Math.ceil(maxBits / ArrayBigInt.CHUNK_SIZE);\n const result = [];\n for (let i = 0; i < maxChunks; i++) {\n const chunk = i < this.chunks.length ? this.chunks[i] : 0;\n if (i === maxChunks - 1) {\n // 最后一个块需要处理剩余位数\n const remainingBits = maxBits % ArrayBigInt.CHUNK_SIZE;\n if (remainingBits > 0) {\n const mask = (1 << remainingBits) - 1;\n result.push((~chunk) & mask);\n }\n else {\n result.push((~chunk) & ArrayBigInt.CHUNK_MASK);\n }\n }\n else {\n result.push((~chunk) & ArrayBigInt.CHUNK_MASK);\n }\n }\n return new ArrayBigInt(result);\n }\n shiftLeft(bits) {\n if (bits === 0) {\n return this.clone();\n }\n if (bits < 0) {\n return this.shiftRight(-bits);\n }\n const chunkShift = Math.floor(bits / ArrayBigInt.CHUNK_SIZE);\n const bitShift = bits % ArrayBigInt.CHUNK_SIZE;\n const result = new Array(chunkShift).fill(0);\n if (bitShift === 0) {\n // 整块移位\n result.push(...this.chunks);\n }\n else {\n // 部分位移位\n let carry = 0;\n for (const chunk of this.chunks) {\n const shifted = (chunk << bitShift) | carry;\n result.push(shifted & ArrayBigInt.CHUNK_MASK);\n carry = chunk >>> (ArrayBigInt.CHUNK_SIZE - bitShift);\n }\n if (carry > 0) {\n result.push(carry);\n }\n }\n return new ArrayBigInt(result);\n }\n shiftRight(bits) {\n if (bits === 0) {\n return this.clone();\n }\n if (bits < 0) {\n return this.shiftLeft(-bits);\n }\n const chunkShift = Math.floor(bits / ArrayBigInt.CHUNK_SIZE);\n const bitShift = bits % ArrayBigInt.CHUNK_SIZE;\n if (chunkShift >= this.chunks.length) {\n return new ArrayBigInt(0);\n }\n const result = [];\n if (bitShift === 0) {\n // 整块移位\n for (let i = chunkShift; i < this.chunks.length; i++) {\n result.push(this.chunks[i]);\n }\n }\n else {\n // 部分位移位\n let carry = 0;\n for (let i = this.chunks.length - 1; i >= chunkShift; i--) {\n const chunk = this.chunks[i];\n const shifted = (carry << (ArrayBigInt.CHUNK_SIZE - bitShift)) | (chunk >>> bitShift);\n result.unshift(shifted);\n carry = chunk & ((1 << bitShift) - 1);\n }\n }\n return new ArrayBigInt(result.length > 0 ? result : [0]);\n }\n equals(other) {\n if (!(other instanceof ArrayBigInt)) {\n return false;\n }\n if (this.chunks.length !== other.chunks.length) {\n return false;\n }\n for (let i = 0; i < this.chunks.length; i++) {\n if (this.chunks[i] !== other.chunks[i]) {\n return false;\n }\n }\n return true;\n }\n isZero() {\n return this.chunks.length === 1 && this.chunks[0] === 0;\n }\n clone() {\n return new ArrayBigInt(this.chunks.slice());\n }\n}\nArrayBigInt.CHUNK_SIZE = 32;\nArrayBigInt.CHUNK_MASK = 0xFFFFFFFF;\nArrayBigInt.CHUNK_MAX = 0x100000000; // 2^32\n/**\n * BigInt工厂类\n *\n * 自动检测运行时环境的BigInt支持情况,并提供统一的创建接口。\n * 在支持BigInt的环境中使用原生实现,在不支持的环境中使用兼容实现。\n */\nexport class BigIntFactory {\n // 缓存检测结果以避免重复检测\n /**\n * 检查是否支持原生BigInt\n * @returns 是否支持原生BigInt\n */\n static isNativeSupported() {\n if (this._supportsBigInt === null) {\n this._supportsBigInt = this.detectBigIntSupport();\n }\n return this._supportsBigInt;\n }\n /**\n * 检测BigInt支持情况\n * @returns 是否支持BigInt\n */\n static detectBigIntSupport() {\n try {\n // 检查BigInt构造函数是否存在\n if (typeof BigInt === 'undefined') {\n return false;\n }\n // 检查基本BigInt操作\n const test1 = BigInt(1);\n const test2 = BigInt(2);\n const result = test1 | test2;\n // 检查字面量支持\n const literal = eval('1n'); // 使用eval避免语法错误\n // 检查类型\n if (typeof result !== 'bigint' || typeof literal !== 'bigint') {\n return false;\n }\n // 检查基本运算\n const shifted = test1 << BigInt(1);\n const compared = test1 === BigInt(1);\n return typeof shifted === 'bigint' && compared === true;\n }\n catch (error) {\n // 任何异常都表示不支持\n return false;\n }\n }\n /**\n * 创建BigInt兼容值\n * @param value 初始值\n * @returns IBigIntLike实例\n */\n static create(value = 0) {\n if (this.isNativeSupported()) {\n let bigintValue;\n if (typeof value === 'bigint') {\n bigintValue = value;\n }\n else if (typeof value === 'string') {\n bigintValue = BigInt(value);\n }\n else {\n bigintValue = BigInt(value);\n }\n return new NativeBigInt(bigintValue);\n }\n else {\n // 转换bigint类型到兼容类型\n let compatValue;\n if (typeof value === 'bigint') {\n compatValue = value.toString();\n }\n else {\n compatValue = value;\n }\n return new ArrayBigInt(compatValue);\n }\n }\n /**\n * 创建零值\n * @returns 零值的IBigIntLike实例\n */\n static zero() {\n if (!this._cachedZero) {\n this._cachedZero = this.create(0);\n }\n return this._cachedZero;\n }\n /**\n * 创建1值\n * @returns 1值的IBigIntLike实例\n */\n static one() {\n if (!this._cachedOne) {\n this._cachedOne = this.create(1);\n }\n return this._cachedOne;\n }\n /**\n * 从二进制字符串创建\n * @param binary 二进制字符串\n * @returns IBigIntLike实例\n */\n static fromBinaryString(binary) {\n if (this.isNativeSupported()) {\n const value = BigInt('0b' + binary);\n return new NativeBigInt(value);\n }\n else {\n return new ArrayBigInt('0b' + binary);\n }\n }\n /**\n * 从十六进制字符串创建\n * @param hex 十六进制字符串\n * @returns IBigIntLike实例\n */\n static fromHexString(hex) {\n if (this.isNativeSupported()) {\n const cleanHex = hex.replace(/^0x/i, '');\n const value = BigInt('0x' + cleanHex);\n return new NativeBigInt(value);\n }\n else {\n return new ArrayBigInt(hex);\n }\n }\n /**\n * 获取环境信息\n * @returns 环境信息对象\n */\n static getEnvironmentInfo() {\n return {\n supportsBigInt: this.isNativeSupported(),\n environment: this.detectEnvironment(),\n jsEngine: this.detectJSEngine()\n };\n }\n /**\n * 检测运行环境\n * @returns 环境类型\n */\n static detectEnvironment() {\n if (typeof window !== 'undefined') {\n // 浏览器环境\n if (typeof navigator !== 'undefined') {\n const userAgent = navigator.userAgent;\n if (userAgent.includes('Chrome')) {\n const match = userAgent.match(/Chrome\\/(\\d+)/);\n const version = match ? parseInt(match[1]) : 0;\n return `Chrome ${version}`;\n }\n if (userAgent.includes('Firefox')) {\n const match = userAgent.match(/Firefox\\/(\\d+)/);\n const version = match ? parseInt(match[1]) : 0;\n return `Firefox ${version}`;\n }\n if (userAgent.includes('Safari') && !userAgent.includes('Chrome')) {\n const match = userAgent.match(/Version\\/(\\d+)/);\n const version = match ? parseInt(match[1]) : 0;\n return `Safari ${version}`;\n }\n return 'Browser (Unknown)';\n }\n return 'Browser';\n }\n else if (typeof global !== 'undefined') {\n // Node.js环境\n if (typeof process !==