@esengine/ecs-framework
Version:
用于Laya、Cocos Creator等JavaScript游戏引擎的高性能ECS框架
2,249 lines (2,231 loc) • 309 kB
TypeScript
/**
* @esengine/ecs-framework v2.2.12
* TypeScript definitions
*/
/**
* TypeScript类型工具集
*
* 提供高级类型推断和类型安全的工具类型
*/
/**
* 组件类型提取器
* 从组件构造函数中提取实例类型
*/
type ComponentInstance<T> = T extends new (...args: any[]) => infer R ? R : never;
/**
* 组件构造函数类型
*
* 与 ComponentType 保持一致,避免类型转换
*/
type ComponentConstructor<T extends IComponent = IComponent> = new (...args: any[]) => T;
/**
* 组件类型的通用约束
*
* 用于确保类型参数是有效的组件构造函数
*/
type AnyComponentConstructor = ComponentConstructor<any>;
/**
* 多组件类型提取
* 从组件构造函数数组中提取所有实例类型的联合
*/
type ExtractComponents<T extends readonly ComponentConstructor[]> = {
[K in keyof T]: ComponentInstance<T[K]>;
};
/**
* 组件类型映射
* 将组件构造函数数组转换为实例类型的元组
*/
type ComponentTypeMap<T extends readonly ComponentConstructor[]> = {
[K in keyof T]: T[K] extends ComponentConstructor<infer C> ? C : never;
};
/**
* 实体with组件的类型
* 表示一个实体确定拥有某些组件
*/
interface EntityWithComponents<T extends readonly ComponentConstructor[]> {
readonly id: number;
readonly name: string;
/**
* 类型安全的组件获取
* 确保返回非空的组件实例
*/
getComponent<C extends ComponentConstructor>(componentType: C): ComponentInstance<C>;
/**
* 检查是否拥有组件
*/
hasComponent<C extends ComponentConstructor>(componentType: C): boolean;
/**
* 获取所有组件
*/
readonly components: ComponentTypeMap<T>;
}
/**
* 查询结果类型
* 根据查询条件推断实体必定拥有的组件
*/
type QueryResult$1<All extends readonly ComponentConstructor[] = [], Any extends readonly ComponentConstructor[] = [], None extends readonly ComponentConstructor[] = []> = {
/**
* 实体列表,确保拥有All中的所有组件
*/
readonly entities: ReadonlyArray<EntityWithComponents<All>>;
/**
* 实体数量
*/
readonly length: number;
/**
* 遍历实体
*/
forEach(callback: (entity: EntityWithComponents<All>, index: number) => void): void;
/**
* 映射转换
*/
map<R>(callback: (entity: EntityWithComponents<All>, index: number) => R): R[];
/**
* 过滤实体
*/
filter(predicate: (entity: EntityWithComponents<All>, index: number) => boolean): QueryResult$1<All, Any, None>;
};
/**
* System处理的实体类型
* 根据Matcher推断System处理的实体类型
*/
type SystemEntityType<M> = M extends {
getCondition(): {
all: infer All extends readonly ComponentConstructor[];
};
} ? EntityWithComponents<All> : never;
/**
* 组件字段类型提取
* 提取组件中所有可序列化的字段
*/
type SerializableFields<T> = {
[K in keyof T]: T[K] extends Function ? never : K;
}[keyof T];
/**
* 只读组件类型
* 将组件的所有字段转为只读
*/
type ReadonlyComponent<T extends IComponent> = {
readonly [K in keyof T]: T[K];
};
/**
* 部分组件类型
* 用于组件更新操作
*/
type PartialComponent<T extends IComponent> = {
[K in SerializableFields<T>]?: T[K];
};
/**
* 组件类型约束
* 确保类型参数是有效的组件
*/
type ValidComponent<T> = T extends Component ? T : never;
/**
* 组件数组约束
* 确保数组中的所有元素都是组件构造函数
*/
type ValidComponentArray<T extends readonly any[]> = T extends readonly ComponentConstructor[] ? T : never;
/**
* 事件处理器类型
* 提供类型安全的事件处理
*/
type TypedEventHandler<T> = (data: T) => void | Promise<void>;
/**
* 系统生命周期钩子类型
*/
interface SystemLifecycleHooks<T extends readonly ComponentConstructor[]> {
/**
* 实体添加到系统时调用
*/
onAdded?: (entity: EntityWithComponents<T>) => void;
/**
* 实体从系统移除时调用
*/
onRemoved?: (entity: EntityWithComponents<T>) => void;
/**
* 系统初始化时调用
*/
onInitialize?: () => void;
/**
* 系统销毁时调用
*/
onDestroy?: () => void;
}
/**
* Fluent API构建器类型
*/
interface TypeSafeBuilder<T> {
/**
* 完成构建
*/
build(): T;
}
/**
* 实体查询条件类型
*/
interface TypedQueryCondition<All extends readonly ComponentConstructor[] = [], Any extends readonly ComponentConstructor[] = [], None extends readonly ComponentConstructor[] = []> {
all: All;
any: Any;
none: None;
tag?: number;
name?: string;
}
/**
* 组件类型守卫
*/
declare function isComponentType<T extends IComponent>(value: any): value is ComponentConstructor<T>;
/**
* 类型安全的组件数组守卫
*/
declare function isComponentArray(value: any[]): value is ComponentConstructor[];
/**
* 提取组件类型名称(编译时)
*/
type ComponentTypeName<T extends ComponentConstructor> = T extends {
prototype: {
constructor: {
name: infer N;
};
};
} ? N : string;
/**
* 多组件类型名称联合
*/
type ComponentTypeNames<T extends readonly ComponentConstructor[]> = {
[K in keyof T]: ComponentTypeName<T[K]>;
}[number];
/**
* 深度只读类型
*/
type DeepReadonly<T> = {
readonly [K in keyof T]: T[K] extends object ? DeepReadonly<T[K]> : T[K];
};
/**
* 深度可选类型
*/
type DeepPartial<T> = {
[K in keyof T]?: T[K] extends object ? DeepPartial<T[K]> : T[K];
};
/**
* 排除方法的类型
*/
type DataOnly<T> = {
[K in keyof T as T[K] extends Function ? never : K]: T[K];
};
/**
* 可序列化的组件数据
*/
type SerializableComponent<T extends IComponent> = DeepPartial<DataOnly<T>>;
/**
* 可更新接口
*
* 实现此接口的服务将在每帧被Core自动调用update方法
*/
interface IUpdatable {
/**
* 每帧更新方法
*
* @param deltaTime - 帧时间间隔(秒),可选参数
*/
update(deltaTime?: number): void;
}
/**
* 框架核心类型定义
*/
/**
* 组件接口
*
* 定义组件的基本契约。
* 在 ECS 架构中,组件应该是纯数据容器,不包含业务逻辑。
*/
interface IComponent {
/** 组件唯一标识符 */
readonly id: number;
/** 组件所属的实体ID */
entityId: number | null;
/** 组件添加到实体时的回调 */
onAddedToEntity(): void;
/** 组件从实体移除时的回调 */
onRemovedFromEntity(): void;
}
/**
* 系统基础接口
*
* 为现有的EntitySystem类提供类型定义
*/
interface ISystemBase {
/** 系统名称 */
readonly systemName: string;
/** 更新顺序/优先级 */
updateOrder: number;
/** 系统启用状态 */
enabled: boolean;
/** 系统初始化 */
initialize(): void;
/** 更新系统(主要处理阶段) */
update(): void;
/** 延迟更新系统 */
lateUpdate?(): void;
}
/**
* 组件类型定义
*
* 用于类型安全的组件操作
* 支持任意构造函数签名,提供更好的类型安全性
*/
type ComponentType$1<T extends IComponent = IComponent> = new (...args: any[]) => T;
/**
* 事件总线接口
* 提供类型安全的事件发布订阅机制
*/
interface IEventBus {
/**
* 发射事件
* @param eventType 事件类型
* @param data 事件数据
*/
emit<T>(eventType: string, data: T): void;
/**
* 异步发射事件
* @param eventType 事件类型
* @param data 事件数据
*/
emitAsync<T>(eventType: string, data: T): Promise<void>;
/**
* 监听事件
* @param eventType 事件类型
* @param handler 事件处理器
* @param config 监听器配置
* @returns 监听器ID
*/
on<T>(eventType: string, handler: (data: T) => void, config?: IEventListenerConfig): string;
/**
* 监听事件(一次性)
* @param eventType 事件类型
* @param handler 事件处理器
* @param config 监听器配置
* @returns 监听器ID
*/
once<T>(eventType: string, handler: (data: T) => void, config?: IEventListenerConfig): string;
/**
* 异步监听事件
* @param eventType 事件类型
* @param handler 异步事件处理器
* @param config 监听器配置
* @returns 监听器ID
*/
onAsync<T>(eventType: string, handler: (data: T) => Promise<void>, config?: IEventListenerConfig): string;
/**
* 移除事件监听器
* @param eventType 事件类型
* @param listenerId 监听器ID
*/
off(eventType: string, listenerId: string): boolean;
/**
* 移除指定事件类型的所有监听器
* @param eventType 事件类型
*/
offAll(eventType: string): void;
/**
* 检查是否有指定事件的监听器
* @param eventType 事件类型
*/
hasListeners(eventType: string): boolean;
/**
* 获取事件统计信息
* @param eventType 事件类型(可选)
*/
getStats(eventType?: string): IEventStats | Map<string, IEventStats>;
/**
* 清空所有监听器
*/
clear(): void;
}
/**
* 事件监听器配置接口
*/
interface IEventListenerConfig {
/** 是否只执行一次 */
once?: boolean;
/** 优先级(数字越大优先级越高) */
priority?: number;
/** 是否异步执行 */
async?: boolean;
/** 事件处理函数的 this 绑定对象 */
thisArg?: object;
}
/**
* 事件统计信息接口
*/
interface IEventStats {
/** 事件类型 */
eventType: string;
/** 监听器数量 */
listenerCount: number;
/** 触发次数 */
triggerCount: number;
/** 总执行时间(毫秒) */
totalExecutionTime: number;
/** 平均执行时间(毫秒) */
averageExecutionTime: number;
/** 最后触发时间 */
lastTriggerTime: number;
}
/**
* 事件数据基类接口
*/
interface IEventData {
/** 事件时间戳 */
timestamp: number;
/** 事件来源 */
source?: string;
/** 事件ID */
eventId?: string;
}
/**
* 实体事件数据接口
*/
interface IEntityEventData extends IEventData {
/** 实体ID */
entityId: number;
/** 实体名称 */
entityName?: string;
/** 实体标签 */
entityTag?: string;
}
/**
* 组件事件数据接口
*/
interface IComponentEventData extends IEntityEventData {
/** 组件类型名称 */
componentType: string;
/** 组件实例 */
component?: IComponent;
}
/**
* 系统事件数据接口
*/
interface ISystemEventData extends IEventData {
/** 系统名称 */
systemName: string;
/** 系统类型 */
systemType: string;
}
/**
* 场景事件数据接口
*/
interface ISceneEventData extends IEventData {
/** 场景名称 */
sceneName: string;
/** 前一个场景名称 */
previousSceneName?: string;
}
/**
* 性能事件数据接口
*/
interface IPerformanceEventData extends IEventData {
/** 操作类型 */
operation: string;
/** 执行时间(毫秒) */
executionTime: number;
/** 内存使用量 */
memoryUsage?: number;
/** 额外数据 */
metadata?: Record<string, unknown>;
}
/**
* ECS调试配置接口
*/
interface IECSDebugConfig {
/** 是否启用调试 */
enabled: boolean;
/** WebSocket服务器URL */
websocketUrl: string;
/** 是否自动重连 */
autoReconnect?: boolean;
/** 数据更新间隔(毫秒)- 已弃用,使用debugFrameRate替代 */
updateInterval?: number;
/** 调试数据发送帧率 (60fps, 30fps, 15fps) */
debugFrameRate?: 60 | 30 | 15;
/** 数据通道配置 */
channels: {
entities: boolean;
systems: boolean;
performance: boolean;
components: boolean;
scenes: boolean;
};
}
/**
* Core配置接口
*/
interface ICoreConfig {
/** 是否启用调试模式 */
debug?: boolean;
/** 是否启用实体系统 */
enableEntitySystems?: boolean;
/** 调试配置 */
debugConfig?: IECSDebugConfig;
/** WorldManager配置 */
worldManagerConfig?: IWorldManagerConfig;
}
/**
* ECS调试数据接口
*/
interface IECSDebugData {
/** 时间戳 */
timestamp: number;
/** 框架版本 */
frameworkVersion?: string;
/** 是否正在运行 */
isRunning: boolean;
/** 框架是否已加载 */
frameworkLoaded: boolean;
/** 当前场景名称 */
currentScene: string;
/** 实体数据 */
entities?: IEntityDebugData;
/** 系统数据 */
systems?: ISystemDebugData;
/** 性能数据 */
performance?: IPerformanceDebugData;
/** 组件数据 */
components?: IComponentDebugData;
/** 场景数据 */
scenes?: ISceneDebugData;
}
/**
* 实体层次结构节点接口
*/
interface IEntityHierarchyNode {
id: number;
name: string;
active: boolean;
enabled: boolean;
activeInHierarchy: boolean;
componentCount: number;
componentTypes: string[];
parentId: number | null;
children: IEntityHierarchyNode[];
depth: number;
tag: number;
updateOrder: number;
}
/**
* 实体调试数据接口
*/
interface IEntityDebugData {
/** 总实体数 */
totalEntities: number;
/** 激活实体数 */
activeEntities: number;
/** 待添加实体数 */
pendingAdd: number;
/** 待移除实体数 */
pendingRemove: number;
/** 按Archetype分组的实体分布 */
entitiesPerArchetype: Array<{
signature: string;
count: number;
memory: number;
}>;
/** 组件数量最多的前几个实体 */
topEntitiesByComponents: Array<{
id: string;
name: string;
componentCount: number;
memory: number;
}>;
/** 实体详情列表 */
entityDetails?: Array<{
id: string | number;
name?: string;
tag?: string;
enabled: boolean;
componentCount: number;
components: string[];
}>;
/** 实体层次结构(根实体) */
entityHierarchy?: Array<{
id: number;
name: string;
active: boolean;
enabled: boolean;
activeInHierarchy: boolean;
componentCount: number;
componentTypes: string[];
parentId: number | null;
children: IEntityHierarchyNode[];
depth: number;
tag: number;
updateOrder: number;
}>;
/** 实体详细信息映射 */
entityDetailsMap?: Record<number, {
id: number;
name: string;
active: boolean;
enabled: boolean;
activeInHierarchy: boolean;
destroyed: boolean;
tag: number;
updateOrder: number;
componentMask: string;
parentId: number | null;
parentName: string | null;
childCount: number;
childIds: number[];
depth: number;
components: Array<{
typeName: string;
properties: Record<string, unknown>;
}>;
componentCount: number;
componentTypes: string[];
}>;
}
/**
* 系统调试数据接口
*/
interface ISystemDebugData {
/** 总系统数 */
totalSystems: number;
/** 系统信息列表 */
systemsInfo: Array<{
name: string;
type: string;
entityCount: number;
executionTime?: number;
averageExecutionTime?: number;
minExecutionTime?: number;
maxExecutionTime?: number;
executionTimeHistory?: number[];
memoryUsage?: number;
updateOrder: number;
enabled: boolean;
lastUpdateTime?: number;
}>;
}
/**
* 性能调试数据接口
*/
interface IPerformanceDebugData {
/** ECS框架执行时间(毫秒) */
frameTime: number;
/** 引擎总帧时间(毫秒) */
engineFrameTime?: number;
/** ECS占总帧时间百分比 */
ecsPercentage?: number;
/** 内存使用量(MB) */
memoryUsage: number;
/** FPS */
fps: number;
/** 平均ECS执行时间(毫秒) */
averageFrameTime: number;
/** 最小ECS执行时间(毫秒) */
minFrameTime: number;
/** 最大ECS执行时间(毫秒) */
maxFrameTime: number;
/** ECS执行时间历史记录 */
frameTimeHistory: number[];
/** 系统性能详情 */
systemPerformance: Array<{
systemName: string;
averageTime: number;
maxTime: number;
minTime: number;
samples: number;
percentage?: number;
}>;
/** 系统占比分析数据 */
systemBreakdown?: Array<{
systemName: string;
executionTime: number;
percentage: number;
}>;
/** 内存分配详情 */
memoryDetails?: {
entities: number;
components: number;
systems: number;
pooled: number;
totalMemory: number;
usedMemory: number;
freeMemory: number;
gcCollections: number;
};
}
/**
* 组件调试数据接口
*/
interface IComponentDebugData {
/** 组件类型数 */
componentTypes: number;
/** 组件实例总数 */
componentInstances: number;
/** 组件分布统计 */
componentStats: Array<{
typeName: string;
instanceCount: number;
memoryPerInstance: number;
totalMemory: number;
poolSize: number;
poolUtilization: number;
averagePerEntity?: number;
}>;
}
/**
* 场景调试数据接口
*/
interface ISceneDebugData {
/** 当前场景名称 */
currentSceneName: string;
/** 场景是否已初始化 */
isInitialized: boolean;
/** 场景运行时间(秒) */
sceneRunTime: number;
/** 场景实体数 */
sceneEntityCount: number;
/** 场景系统数 */
sceneSystemCount: number;
/** 场景内存使用量 */
sceneMemory: number;
/** 场景启动时间 */
sceneUptime: number;
}
/**
* 游戏组件基类
*
* ECS架构中的组件(Component)应该是纯数据容器。
* 所有游戏逻辑应该在 EntitySystem 中实现,而不是在组件内部。
*
* @example
* 推荐做法:纯数据组件
* ```typescript
* class HealthComponent extends Component {
* public health: number = 100;
* public maxHealth: number = 100;
* }
* ```
*
* @example
* 推荐做法:在 System 中处理逻辑
* ```typescript
* class HealthSystem extends EntitySystem {
* process(entities: Entity[]): void {
* for (const entity of entities) {
* const health = entity.getComponent(HealthComponent);
* if (health && health.health <= 0) {
* entity.destroy();
* }
* }
* }
* }
* ```
*/
declare abstract class Component implements IComponent {
/**
* 组件ID生成器
*
* 用于为每个组件分配唯一的ID。
*/
private static idGenerator;
/**
* 组件唯一标识符
*
* 在整个游戏生命周期中唯一的数字ID。
*/
readonly id: number;
/**
* 所属实体ID
*
* 存储实体ID而非引用,避免循环引用,符合ECS数据导向设计。
*/
entityId: number | null;
/**
* 创建组件实例
*
* 自动分配唯一ID给组件。
*/
constructor();
/**
* 组件添加到实体时的回调
*
* 当组件被添加到实体时调用,可以在此方法中进行初始化操作。
*
* @remarks
* 这是一个生命周期钩子,用于组件的初始化逻辑。
* 虽然保留此方法,但建议将复杂的初始化逻辑放在 System 中处理。
*/
onAddedToEntity(): void;
/**
* 组件从实体移除时的回调
*
* 当组件从实体中移除时调用,可以在此方法中进行清理操作。
*
* @remarks
* 这是一个生命周期钩子,用于组件的清理逻辑。
* 虽然保留此方法,但建议将复杂的清理逻辑放在 System 中处理。
*/
onRemovedFromEntity(): void;
}
/**
* 基础 64 位段结构
* [低32位,高32位]
*/
type BitMask64Segment = [number, number];
/**
* 位掩码数据结构
* 基础模式(64位):使用 base[lo , hi] 存储 64 位,segments 为空
* 扩展模式(128+位):base[lo , hi] 作为第一段,segments 存储额外的 64 位段
* segments[0] 对应 bit 64-127,segments[1] 对应 bit 128-191,以此类推
*/
interface BitMask64Data {
base: BitMask64Segment;
/** 扩展段数组,每个元素是一个 64 位段,用于超过 64 位的场景 */
segments?: BitMask64Segment[];
}
declare class BitMask64Utils {
/** 零掩码常量,所有位都为0 */
static readonly ZERO: Readonly<BitMask64Data>;
/**
* 根据位索引创建64位掩码
* @param bitIndex 位索引,范围 [0, 63]
* @returns 包含指定位设置为1的掩码
* @throws 当位索引超出范围时抛出错误
*/
static create(bitIndex: number): BitMask64Data;
/**
* 从32位数字创建64位掩码
* @param value 32位数字值
* @returns 低32位为输入值、高32位为0的掩码
*/
static fromNumber(value: number): BitMask64Data;
/**
* 检查掩码是否包含任意指定的位
* @param mask 要检查的掩码
* @param bits 指定的位模式
* @returns 如果掩码包含bits中的任意位则返回true
*/
static hasAny(mask: BitMask64Data, bits: BitMask64Data): boolean;
/**
* 检查掩码是否包含所有指定的位
* @param mask 要检查的掩码
* @param bits 指定的位模式
* @returns 如果掩码包含bits中的所有位则返回true
*/
static hasAll(mask: BitMask64Data, bits: BitMask64Data): boolean;
/**
* 检查掩码是否不包含任何指定的位
* @param mask 要检查的掩码
* @param bits 指定的位模式
* @returns 如果掩码不包含bits中的任何位则返回true
*/
static hasNone(mask: BitMask64Data, bits: BitMask64Data): boolean;
/**
* 检查掩码是否为零
* @param mask 要检查的掩码
* @returns 如果掩码所有位都为0则返回true
*/
static isZero(mask: BitMask64Data): boolean;
/**
* 检查两个掩码是否相等
* @param a 第一个掩码
* @param b 第二个掩码
* @returns 如果两个掩码完全相等则返回true
*/
static equals(a: BitMask64Data, b: BitMask64Data): boolean;
/**
* 设置掩码中指定位为1,必要时自动扩展
* @param mask 要修改的掩码(原地修改)
* @param bitIndex 位索引,不小于零
* @throws 当位索引超出范围时抛出错误
*/
static setBit(mask: BitMask64Data, bitIndex: number): void;
/**
* 获取掩码中指定位,如果位超出当前掩码的区段长度,则直接返回0
* @param mask 掩码
* @param bitIndex 位索引,不小于零
*/
static getBit(mask: BitMask64Data, bitIndex: number): boolean;
/**
* 清除掩码中指定位为0,如果位超出当前掩码的区段长度,则什么也不做
* @param mask 要修改的掩码(原地修改)
* @param bitIndex 位索引,不小于0
*/
static clearBit(mask: BitMask64Data, bitIndex: number): void;
/**
* 对目标掩码执行按位或操作
* @param target 目标掩码(原地修改)
* @param other 用于按位或的掩码
*/
static orInPlace(target: BitMask64Data, other: BitMask64Data): void;
/**
* 对目标掩码执行按位与操作
* @param target 目标掩码(原地修改)
* @param other 用于按位与的掩码
*/
static andInPlace(target: BitMask64Data, other: BitMask64Data): void;
/**
* 对目标掩码执行按位异或操作
* @param target 目标掩码(原地修改)
* @param other 用于按位异或的掩码
*/
static xorInPlace(target: BitMask64Data, other: BitMask64Data): void;
/**
* 清除掩码的所有位为0
* @param mask 要清除的掩码(原地修改)
*/
static clear(mask: BitMask64Data): void;
/**
* 将源掩码的值复制到目标掩码,如果source包含扩展段,则target也会至少扩展到source扩展段的长度
* @param source 源掩码
* @param target 目标掩码(原地修改)
*/
static copy(source: BitMask64Data, target: BitMask64Data): void;
/**
* 创建掩码的深拷贝
* @param mask 要拷贝的掩码
* @returns 新的掩码对象,内容与源掩码相同
*/
static clone(mask: BitMask64Data): BitMask64Data;
/**
* 将掩码转换为字符串表示,每个区段之间将使用空格分割。
* @param mask 要转换的掩码
* @param radix 进制,支持2(二进制)或16(十六进制),默认为2,其他的值被视为2
* @param printHead 打印头
* @returns 掩码的字符串表示,二进制不带前缀,十六进制带0x前缀
*/
static toString(mask: BitMask64Data, radix?: 2 | 16, printHead?: boolean): string;
/**
* 计算掩码中设置为1的位数
* @param mask 要计算的掩码
* @returns 掩码中1的位数
*/
static popCount(mask: BitMask64Data): number;
/**
* 获取包含目标位的BitMask64Segment
* @param mask 要操作的掩码
* @param bitIndex 目标位
* @param createNewSegment 如果bitIndex超过了当前范围,是否自动补充扩展区域,默认为真
* @private
*/
private static getSegmentByBitIndex;
}
/**
* 启用SoA优化装饰器
* 默认关闭SoA,只有在大规模批量操作场景下才建议开启
*/
declare function EnableSoA<T extends ComponentType>(target: T): T;
/**
* 高精度数值装饰器
* 标记字段需要保持完整精度,存储为复杂对象而非TypedArray
*/
declare function HighPrecision(target: any, propertyKey: string | symbol): void;
/**
* 64位浮点数装饰器
* 标记字段使用Float64Array存储(更高精度但更多内存)
*/
declare function Float64(target: any, propertyKey: string | symbol): void;
/**
* 32位浮点数装饰器
* 标记字段使用Float32Array存储(默认类型,平衡性能和精度)
*/
declare function Float32(target: any, propertyKey: string | symbol): void;
/**
* 32位整数装饰器
* 标记字段使用Int32Array存储(适用于整数值)
*/
declare function Int32(target: any, propertyKey: string | symbol): void;
/**
* 32位无符号整数装饰器
* 标记字段使用Uint32Array存储(适用于无符号整数,如ID、标志位等)
*/
declare function Uint32(target: any, propertyKey: string | symbol): void;
/**
* 16位整数装饰器
* 标记字段使用Int16Array存储(适用于小范围整数)
*/
declare function Int16(target: any, propertyKey: string | symbol): void;
/**
* 16位无符号整数装饰器
* 标记字段使用Uint16Array存储(适用于小范围无符号整数)
*/
declare function Uint16(target: any, propertyKey: string | symbol): void;
/**
* 8位整数装饰器
* 标记字段使用Int8Array存储(适用于很小的整数值)
*/
declare function Int8(target: any, propertyKey: string | symbol): void;
/**
* 8位无符号整数装饰器
* 标记字段使用Uint8Array存储(适用于字节值、布尔标志等)
*/
declare function Uint8(target: any, propertyKey: string | symbol): void;
/**
* 8位夹紧整数装饰器
* 标记字段使用Uint8ClampedArray存储(适用于颜色值等需要夹紧的数据)
*/
declare function Uint8Clamped(target: any, propertyKey: string | symbol): void;
/**
* 序列化Map装饰器
* 标记Map字段需要序列化/反序列化存储
*/
declare function SerializeMap(target: any, propertyKey: string | symbol): void;
/**
* 序列化Set装饰器
* 标记Set字段需要序列化/反序列化存储
*/
declare function SerializeSet(target: any, propertyKey: string | symbol): void;
/**
* 序列化Array装饰器
* 标记Array字段需要序列化/反序列化存储
*/
declare function SerializeArray(target: any, propertyKey: string | symbol): void;
/**
* 深拷贝装饰器
* 标记字段需要深拷贝处理(适用于嵌套对象)
*/
declare function DeepCopy(target: any, propertyKey: string | symbol): void;
/**
* 自动类型推断装饰器
* 根据字段的默认值和数值范围自动选择最优的TypedArray类型
*
* @param options 类型推断选项
* @param options.minValue 数值的最小值(用于范围优化)
* @param options.maxValue 数值的最大值(用于范围优化)
* @param options.precision 是否需要浮点精度(true: 使用浮点数组, false: 使用整数数组)
* @param options.signed 是否需要符号位(仅在整数模式下有效)
*/
declare function AutoTyped(options?: {
minValue?: number;
maxValue?: number;
precision?: boolean;
signed?: boolean;
}): (target: any, propertyKey: string | symbol) => void;
/**
* 自动类型推断器
* 根据数值类型和范围自动选择最优的TypedArray类型
*/
declare class TypeInference {
/**
* 根据数值范围推断最优的TypedArray类型
*/
static inferOptimalType(value: any, options?: {
minValue?: number;
maxValue?: number;
precision?: boolean;
signed?: boolean;
}): string;
/**
* 根据推断的类型名创建对应的TypedArray构造函数
*/
static getTypedArrayConstructor(typeName: string): typeof Float32Array | typeof Float64Array | typeof Int32Array | typeof Uint32Array | typeof Int16Array | typeof Uint16Array | typeof Int8Array | typeof Uint8Array | typeof Uint8ClampedArray;
}
/**
* SoA存储器支持的TypedArray类型
*/
type SupportedTypedArray = Float32Array | Float64Array | Int32Array | Uint32Array | Int16Array | Uint16Array | Int8Array | Uint8Array | Uint8ClampedArray;
/**
* SoA存储器(需要装饰器启用)
* 使用Structure of Arrays存储模式,在大规模批量操作时提供优异性能
*/
declare class SoAStorage<T extends Component> {
private static readonly _logger;
private fields;
private stringFields;
private serializedFields;
private complexFields;
private entityToIndex;
private indexToEntity;
private freeIndices;
private _size;
private _capacity;
readonly type: ComponentType<T>;
constructor(componentType: ComponentType<T>);
private initializeFields;
addComponent(entityId: number, component: T): void;
private updateComponentAtIndex;
/**
* 序列化值为JSON字符串
*/
private serializeValue;
/**
* 反序列化JSON字符串为值
*/
private deserializeValue;
/**
* 深拷贝对象
*/
private deepClone;
getComponent(entityId: number): T | null;
private getFieldType;
hasComponent(entityId: number): boolean;
removeComponent(entityId: number): T | null;
private resize;
getActiveIndices(): number[];
getFieldArray(fieldName: string): SupportedTypedArray | null;
getTypedFieldArray<K extends keyof T>(fieldName: K): SupportedTypedArray | null;
getEntityIndex(entityId: number): number | undefined;
getEntityIdByIndex(index: number): number | undefined;
size(): number;
clear(): void;
compact(): void;
getStats(): any;
/**
* 执行向量化批量操作
* @param operation 操作函数,接收字段数组和活跃索引
*/
performVectorizedOperation(operation: (fieldArrays: Map<string, SupportedTypedArray>, activeIndices: number[]) => void): void;
}
/**
* 日志级别
*/
declare enum LogLevel {
Debug = 0,
Info = 1,
Warn = 2,
Error = 3,
Fatal = 4,
None = 5
}
/**
* 预定义的颜色常量
*/
declare const Colors: {
readonly BLACK: "\u001B[30m";
readonly RED: "\u001B[31m";
readonly GREEN: "\u001B[32m";
readonly YELLOW: "\u001B[33m";
readonly BLUE: "\u001B[34m";
readonly MAGENTA: "\u001B[35m";
readonly CYAN: "\u001B[36m";
readonly WHITE: "\u001B[37m";
readonly BRIGHT_BLACK: "\u001B[90m";
readonly BRIGHT_RED: "\u001B[91m";
readonly BRIGHT_GREEN: "\u001B[92m";
readonly BRIGHT_YELLOW: "\u001B[93m";
readonly BRIGHT_BLUE: "\u001B[94m";
readonly BRIGHT_MAGENTA: "\u001B[95m";
readonly BRIGHT_CYAN: "\u001B[96m";
readonly BRIGHT_WHITE: "\u001B[97m";
readonly RESET: "\u001B[0m";
readonly BOLD: "\u001B[1m";
readonly UNDERLINE: "\u001B[4m";
};
/**
* 日志接口
*/
interface ILogger {
debug(...args: unknown[]): void;
info(...args: unknown[]): void;
warn(...args: unknown[]): void;
error(...args: unknown[]): void;
fatal(...args: unknown[]): void;
}
/**
* 日志颜色配置接口
*/
interface LoggerColorConfig {
debug?: string;
info?: string;
warn?: string;
error?: string;
fatal?: string;
reset?: string;
}
/**
* 日志配置
*/
interface LoggerConfig {
/** 日志级别 */
level: LogLevel;
/** 是否启用时间戳 */
enableTimestamp: boolean;
/** 是否启用颜色 */
enableColors: boolean;
/** 日志前缀 */
prefix?: string;
/** 自定义输出函数 */
output?: (level: LogLevel, message: string) => void;
/** 自定义颜色配置 */
colors?: LoggerColorConfig;
}
/**
* 默认控制台日志实现
*/
declare class ConsoleLogger implements ILogger {
private _config;
constructor(config?: Partial<LoggerConfig>);
/**
* 输出调试级别日志
* @param message 日志消息
* @param args 附加参数
*/
debug(message: string, ...args: unknown[]): void;
/**
* 输出信息级别日志
* @param message 日志消息
* @param args 附加参数
*/
info(message: string, ...args: unknown[]): void;
/**
* 输出警告级别日志
* @param message 日志消息
* @param args 附加参数
*/
warn(message: string, ...args: unknown[]): void;
/**
* 输出错误级别日志
* @param message 日志消息
* @param args 附加参数
*/
error(message: string, ...args: unknown[]): void;
/**
* 输出致命错误级别日志
* @param message 日志消息
* @param args 附加参数
*/
fatal(message: string, ...args: unknown[]): void;
/**
* 设置日志级别
* @param level 日志级别
*/
setLevel(level: LogLevel): void;
/**
* 设置颜色配置
* @param colors 颜色配置
*/
setColors(colors: LoggerColorConfig): void;
/**
* 设置日志前缀
* @param prefix 前缀字符串
*/
setPrefix(prefix: string): void;
/**
* 内部日志输出方法
* @param level 日志级别
* @param message 日志消息
* @param args 附加参数
*/
private log;
/**
* 输出到控制台
* @param level 日志级别
* @param message 格式化后的消息
* @param args 附加参数
*/
private outputToConsole;
/**
* 获取控制台颜色配置
* @returns 颜色配置对象
*/
private getColors;
}
/**
* 日志管理器
*/
declare class LoggerManager {
private static _instance;
private _loggers;
private _defaultLogger?;
private _defaultLevel;
private _loggerFactory?;
private constructor();
private get defaultLogger();
private createDefaultLogger;
/**
* 获取日志管理器实例
* @returns 日志管理器实例
*/
static getInstance(): LoggerManager;
/**
* 获取或创建日志器
* @param name 日志器名称
* @returns 日志器实例
*/
getLogger(name?: string): ILogger;
/**
* 设置日志器
* @param name 日志器名称
* @param logger 日志器实例
*/
setLogger(name: string, logger: ILogger): void;
/**
* 设置全局日志级别
* @param level 日志级别
*/
setGlobalLevel(level: LogLevel): void;
/**
* 创建子日志器
* @param parentName 父日志器名称
* @param childName 子日志器名称
* @returns 子日志器实例
*/
createChildLogger(parentName: string, childName: string): ILogger;
/**
* 设置全局颜色配置
* @param colors 颜色配置
*/
setGlobalColors(colors: LoggerColorConfig): void;
/**
* 重置为默认颜色配置
*/
resetColors(): void;
/**
* 设置日志器工厂方法
* @param factory 日志器工厂方法
*/
setLoggerFactory(factory: (name?: string) => ILogger): void;
}
/**
* 默认日志器实例
*/
declare const Logger: ILogger;
/**
* 创建命名日志器
* @param name 日志器名称
* @returns 日志器实例
*/
declare function createLogger(name: string): ILogger;
/**
* 设置全局日志颜色配置
* @param colors 颜色配置
*/
declare function setLoggerColors(colors: LoggerColorConfig): void;
/**
* 重置日志颜色为默认配置
*/
declare function resetLoggerColors(): void;
/**
* 设置全局日志级别
* @param level 日志级别
*/
declare function setGlobalLogLevel(level: LogLevel): void;
/**
* 设置日志器工厂方法
* @param factory 日志器工厂方法
*/
declare function setLoggerFactory(factory: (name?: string) => ILogger): void;
/**
* 组件类型定义
*/
type ComponentType<T extends Component = Component> = new (...args: any[]) => T;
/**
* 组件注册表
* 管理组件类型的位掩码分配
*/
declare class ComponentRegistry {
protected static readonly _logger: ILogger;
private static componentTypes;
private static bitIndexToType;
private static componentNameToType;
private static componentNameToId;
private static maskCache;
private static nextBitIndex;
/**
* 注册组件类型并分配位掩码
* @param componentType 组件类型
* @returns 分配的位索引
*/
static register<T extends Component>(componentType: ComponentType<T>): number;
/**
* 获取组件类型的位掩码
* @param componentType 组件类型
* @returns 位掩码
*/
static getBitMask<T extends Component>(componentType: ComponentType<T>): BitMask64Data;
/**
* 获取组件类型的位索引
* @param componentType 组件类型
* @returns 位索引
*/
static getBitIndex<T extends Component>(componentType: ComponentType<T>): number;
/**
* 检查组件类型是否已注册
* @param componentType 组件类型
* @returns 是否已注册
*/
static isRegistered<T extends Component>(componentType: ComponentType<T>): boolean;
/**
* 通过位索引获取组件类型
* @param bitIndex 位索引
* @returns 组件类型构造函数或null
*/
static getTypeByBitIndex(bitIndex: number): ComponentType | null;
/**
* 获取当前已注册的组件类型数量
* @returns 已注册数量
*/
static getRegisteredCount(): number;
/**
* 通过名称获取组件类型
* @param componentName 组件名称
* @returns 组件类型构造函数
*/
static getComponentType(componentName: string): Function | null;
/**
* 获取所有已注册的组件类型
* @returns 组件类型映射
*/
static getAllRegisteredTypes(): Map<Function, number>;
/**
* 获取所有组件名称到类型的映射
* @returns 名称到类型的映射
*/
static getAllComponentNames(): Map<string, Function>;
/**
* 通过名称获取组件类型ID
* @param componentName 组件名称
* @returns 组件类型ID
*/
static getComponentId(componentName: string): number | undefined;
/**
* 注册组件类型(通过名称)
* @param componentName 组件名称
* @returns 分配的组件ID
*/
static registerComponentByName(componentName: string): number;
/**
* 创建单个组件的掩码
* @param componentName 组件名称
* @returns 组件掩码
*/
static createSingleComponentMask(componentName: string): BitMask64Data;
/**
* 创建多个组件的掩码
* @param componentNames 组件名称数组
* @returns 组合掩码
*/
static createComponentMask(componentNames: string[]): BitMask64Data;
/**
* 清除掩码缓存
*/
static clearMaskCache(): void;
/**
* 重置注册表(用于测试)
*/
static reset(): void;
}
/**
* 高性能组件存储器
*/
declare class ComponentStorage<T extends Component> {
private dense;
private entityIds;
private entityToIndex;
private componentType;
constructor(componentType: ComponentType<T>);
/**
* 添加组件
* @param entityId 实体ID
* @param component 组件实例
*/
addComponent(entityId: number, component: T): void;
/**
* 获取组件
* @param entityId 实体ID
* @returns 组件实例或null
*/
getComponent(entityId: number): T | null;
/**
* 检查实体是否有此组件
* @param entityId 实体ID
* @returns 是否有组件
*/
hasComponent(entityId: number): boolean;
/**
* 移除组件
* @param entityId 实体ID
* @returns 被移除的组件或null
*/
removeComponent(entityId: number): T | null;
/**
* 高效遍历所有组件
* @param callback 回调函数
*/
forEach(callback: (component: T, entityId: number, index: number) => void): void;
/**
* 获取所有组件
* @returns 组件数组
*/
getDenseArray(): {
components: T[];
entityIds: number[];
};
/**
* 清空所有组件
*/
clear(): void;
/**
* 获取组件数量
*/
get size(): number;
/**
* 获取组件类型
*/
get type(): ComponentType<T>;
/**
* 获取存储统计信息
*/
getStats(): {
totalSlots: number;
usedSlots: number;
freeSlots: number;
fragmentation: number;
};
}
/**
* 组件存储管理器
* 管理所有组件类型的存储器
*/
declare class ComponentStorageManager {
private static readonly _logger;
private storages;
/**
* 检查组件类型是否启用SoA存储
* @param componentType 组件类型
* @returns 是否为SoA存储
*/
isSoAStorage<T extends Component>(componentType: ComponentType<T>): boolean;
/**
* 获取SoA存储器(类型安全)
* @param componentType 组件类型
* @returns SoA存储器或null
*/
getSoAStorage<T extends Component>(componentType: ComponentType<T>): SoAStorage<T> | null;
/**
* 直接获取SoA字段数组(类型安全)
* @param componentType 组件类型
* @param fieldName 字段名
* @returns TypedArray或null
*/
getFieldArray<T extends Component>(componentType: ComponentType<T>, fieldName: string): SupportedTypedArray | null;
/**
* 直接获取SoA字段数组(类型安全,带字段名检查)
* @param componentType 组件类型
* @param fieldName 字段名(类型检查)
* @returns TypedArray或null
*/
getTypedFieldArray<T extends Component, K extends keyof T>(componentType: ComponentType<T>, fieldName: K): SupportedTypedArray | null;
/**
* 获取SoA存储的活跃索引
* @param componentType 组件类型
* @returns 活跃索引数组或空数组
*/
getActiveIndices<T extends Component>(componentType: ComponentType<T>): number[];
/**
* 获取实体在SoA存储中的索引
* @param componentType 组件类型
* @param entityId 实体ID
* @returns 存储索引或undefined
*/
getEntityIndex<T extends Component>(componentType: ComponentType<T>, entityId: number): number | undefined;
/**
* 根据索引获取实体ID
* @param componentType 组件类型
* @param index 存储索引
* @returns 实体ID或undefined
*/
getEntityIdByIndex<T extends Component>(componentType: ComponentType<T>, index: number): number | undefined;
/**
* 获取或创建组件存储器(默认原始存储)
* @param componentType 组件类型
* @returns 组件存储器
*/
getStorage<T extends Component>(componentType: ComponentType<T>): ComponentStorage<T> | SoAStorage<T>;
/**
* 添加组件
* @param entityId 实体ID
* @param component 组件实例
*/
addComponent<T extends Component>(entityId: number, component: T): void;
/**
* 获取组件
* @param entityId 实体ID
* @param componentType 组件类型
* @returns 组件实例或null
*/
getComponent<T extends Component>(entityId: number, componentType: ComponentType<T>): T | null;
/**
* 检查实体是否有组件
* @param entityId 实体ID
* @param componentType 组件类型
* @returns 是否有组件
*/
hasComponent<T extends Component>(entityId: number, componentType: ComponentType<T>): boolean;
/**
* 移除组件
* @param entityId 实体ID
* @param componentType 组件类型
* @returns 被移除的组件或null
*/
removeComponent<T extends Component>(entityId: number, componentType: ComponentType<T>): T | null;
/**
* 移除实体的所有组件
* @param entityId 实体ID
*/
removeAllComponents(entityId: number): void;
/**
* 获取实体的组件位掩码
* @param entityId 实体ID
* @returns 组件位掩码
*/
getComponentMask(entityId: number): BitMask64Data;
/**
* 获取所有存储器的统计信息
*/
getAllStats(): Map<string, {
totalSlots: number;
usedSlots: number;
freeSlots: number;
fragmentation: number;
}>;
/**
* 清空所有存储器
*/
clear(): void;
}
/**
* 高性能实体列表管理器
* 管理场景中的所有实体,支持快速查找和批量操作
*/
declare class EntityList {
buffer: Entity[];
private _scene;
private _idToEntity;
private _nameToEntities;
private _entitiesToAdd;
private _entitiesToRemove;
get count(): number;
constructor(scene: any);
/**
* 添加实体
* @param entity 要添加的实体
*/
add(entity: Entity): void;
/**
* 立即添加实体
* @param entity 要添加的实体
*/
private addImmediate;
/**
* 移除实体
* @param entity 要移除的实体
*/
remove(entity: Entity): void;
/**
* 立即移除实体
* @param entity 要移除的实体
*/
private removeImmediate;
/**
* 移除所有实体
*/
removeAllEntities(): void;
/**
* 更新实体列表,处理延迟操作
*/
updateLists(): void;
/**
* 更新实体列表
*
* 处理延迟操作(添加/删除实体)
*/
update(): void;
/**
* 根据名称查找实体(使用索引,O(1)复杂度)
* @param name 实体名称
* @returns 找到的第一个实体或null
*/
findEntity(name: string): Entity | null;
/**
* 根据名称查找所有实体
* @param name 实体名称
* @returns 找到的所有实体数组
*/
findEntitiesByName(name: string): Entity[];
/**
* 根据ID查找实体(使用索引,O(1)复杂度)
* @param id 实体ID
* @returns 找到的实体或null
*/
findEntityById(id: number): Entity | null;
/**
* 根据标签查找实体
* @param tag 标签
* @returns 找到的所有实体数组
*/
findEntitiesByTag(tag: number): Entity[];
/**
* 根据组件类型查找实体
* @param componentType 组件类型
* @returns 找到的所有实体数组
*/
findEntitiesWithComponent<T extends Component>(componentType: new (...args: any[]) => T): Entity[];
/**
* 批量操作:对所有实体执行指定操作
* @param action 要执行的操作
*/
forEach(action: (entity: Entity) => void): void;
/**
* 批量操作:对符合条件的实体执行指定操作
* @param predicate 筛选条件
* @param action 要执行的操作
*/
forEachWhere(predicate: (entity: Entity) => boolean, action: (entity: Entity) => void): void;
/**
* 更新名称索引
* @param entity 实体
* @param isAdd 是否为添加操作
*/
private updateNameIndex;
/**
* 获取实体列表的统计信息
* @returns 统计信息
*/
getStats(): {
totalEntities: number;
activeEntities: number;
pendingAdd: number;
pendingRemove: number;
nameIndexSize: number;
};
}
/**
* 世代式ID池管理器
*
* 用于管理实体ID的分配和回收,支持世代版本控制以防止悬空引用问题。
* 世代式ID由索引和版本组成,当ID被回收时版本会递增,确保旧引用失效。
*
* 支持动态扩展,理论上可以支持到65535个索引(16位),每个索引65535个版本(16位)。
* 总计可以处理超过42亿个独特的ID组合,完全满足ECS大规模实体需求。
*
* @example
* ```typescript
* const pool = new IdentifierPool();
*
* // 分配ID
* const id = pool.checkOut(); // 例如: 65536 (版本1,索引0)
*
* // 回收ID
* pool.checkIn(id);
*
* // 验证ID是否有效
* const isValid = pool.isValid(id); // false,因为版本已递增
* ```
*/
declare class IdentifierPool {
/**
* 下一个可用的索引
*/
private _nextAvailableIndex;
/**
* 空闲的索引列表
*/
private _freeIndices;
/**
* 每个索引对应的世代版本
* 动态扩展的Map,按需分配内存
*/
private _generations;
/**
* 延迟回收队列
* 防止在同一帧内立即重用ID,避免时序问题
*/
private _pendingRecycle;
/**
* 延迟回收时间(毫秒)
*/
private _recycleDelay;
/**
* 最大索引限制(16位)
* 这是框架设计选择:16位索引 + 16位版本 = 32位ID,确保高效位操作
* 不是硬件限制,而是性能和内存效率的权衡
*/
private static readonly MAX_INDEX;
/**
* 最大世代限制(16位)
*/
private static readonly MAX_GENERATION;
/**
* 内存扩展块大小
* 当需要更多内存时,一次性预分配的索引数量
*/
private _expansionBlockSize;
/**
* 统计信息
*/
private _stats;
/**
* 构造函数
*
* @param recycleDelay 延迟回收时间(毫秒),默认为100ms
* @param expansionBlockSize 内存扩展块大小,默认为1024
*/
constructor(recycleDelay?: number, expansionBlockSize?: number);
/**
* 获取一个可用的ID
*
* 返回一个32位ID,高16位为世代版本,低16位为索引。
*
* @returns 新分配的实体ID
* @throws {Error} 当达到索引限制时抛出错误
*/
checkOut(): number;
/**
* 回收一个ID
*
* 验证ID的有效性后,将其加入延迟回收队列。
* ID不会立即可重用,而是在延迟时间后才真正回收。
*
* @param id 要回收的实体ID
* @returns 是否成功回收(ID是否有效且未被重复回收)
*/
checkIn(id: number): boolean;
/**
* 验证ID是否有效
*
* 检查ID的索引和世代版本是否匹配当前状态。
*
* @param id 要验证的实体ID
* @returns ID是否有效
*/
isValid(id: number): boolean;
/**
* 获取统计信息
*
* @returns 池的当前状态统计
*/
getStats(): {
/** 已分配的总索引数 */
totalAllocated: number;
/** 总计回收次数 */
totalRecycled: number;
/** 当前活跃实体数 */
currentActive: number;
/** 当前空闲的索引数 */
currentlyFree: number;
/** 等待回收的ID数 */
pendingRecycle: number;
/** 理论最大实体数(设计限制) */
maxPossibleEntities: number;
/** 当前使用的最大索引 */
maxUsedIndex: number;
/** 内存使用(字节) */
memoryUsage: number;
/** 内存扩展次数 */
memoryExpansions: number;
/** 平均世代版本 */
averageGeneration: number;
/** 世代存储大小 */
generationStorageSize: number;
};
/**
* 强制执行延迟回收处理
*
* 在某些情况下可能需要立即处理延迟回收队列,
* 比如内存压力大或者需要精确的统计信息时。
*/
forceProcessDelayedRecycle(): void;
/**
* 清理过期的延迟回收项
*
* 将超过延迟时间的回收项真正回收到空闲列表中。
*
* @param forceAll 是否强制处理所有延迟回收项
* @private
*/
private _processDelayedRecycle;
/**
* 预分配世代信息
*
* @param startIndex 起始索引
* @param count 分配数量
* @private
*/
private _preAllocateGenerations;
/**
* 确保指定索引的世代信息存在
*
* @param index 索引
* @private
*/
private _ensureGenerationCapacity;
/**
* 计算内存使用量
*
* @returns 内存使用字节数
* @private
*/
private _calculateMemoryUsage;
/**
* 打包索引和世代为32位ID
*
* @param index 索引(16位)
* @param generation 世代版本(16位)
* @returns 打包后的32位ID
* @private
*/
private _packId;
/**
* 从ID中解包索引
*
* @param id 32位ID
* @returns 索引部分(16位)
* @private
*/
private _unpackIndex;
/**
* 从ID中解包世代版本
*
* @param id 32位ID
* @returns 世代版本部分(16位)
* @private
*/
private _unpackGeneration;
/**
* 内部ID有效性检查
*
* @param index 索引
* @param generation 世代版本
* @returns 是否有效
* @private
*/
private _isValidId;
}
/**
* 服务基础接口
* 所有通过 ServiceContainer 管理的服务都应该实现此接口
*/
interface IService {
/**
* 释放服务占用的资源
* 当服务被注销或容器被清空时调用
*/
dispose(): void;
}
/**
* 服务类型
*
* 支持任意构造函数签名,以便与依赖注入装饰器配合使用
* 使用 any[] 以允许任意参数类型的构造函数
*/
type ServiceType<T extends IService> = new (...args: any[]) => T;
/**
* 服务生命周期
*/
declare enum ServiceLifetime {
/**
* 单例模式 - 整个应用生命周期内只有一个实例
*/
Singleton = "singleton",
/**
* 瞬时模式 - 每次请求都创建新实例
*/
Transient = "transient"
}
/**
* 服务容器
*
* 负责管理所有服务的注册、解析和生命周期。
* 支持依赖注入和服务定位模式。
*
* 特点:
* - 单例和瞬时两种生命周期
* - 支持工厂函数注册
* - 支持实例注册
* - 类型安全的服务解析
*
* @example
* ```typescript
* const container = new ServiceContainer();
*
* // 注册单例服务
* container.registerSingleton(TimerManager);
*
* // 注册工厂函数
* container.registerSingleton(Logger, (c) => createLogger('App'));
*
* // 注册实例
* container.registerInstance(Config, new Config());
*
* // 解析服务
* const timer = container.resolve(TimerManager);
* ```
*/
declare class ServiceContainer {
/**
* 服务注册表
*/
private _services;
/**
* 正在解析的服务栈(用于循环依赖检测)
*/
private _resolving;
/**
* 可更新的服务列表
*
* 自动收集所有使用@Updatable装饰器标记的服务,供Core统一更新
* 按优先级排序(数值越小越先执行)
*/
private _updatableServices;
/**
* 注册单例服务
*
* @param type - 服务类型
* @param factory - 可选的工厂函数
*
* @example
* ```typescript
* // 直接注册类型
* container.registerSingleton(TimerManager);
*
* // 使用工厂函数
* container.registerSingleton(Logger, (c) => {
* return createLogger('App');
* });
* ```
*/
registerSingleton<T extends IService>(type: ServiceType<T>, factory?: (container: ServiceContainer) => T): void;
/**
* 注册瞬时服务
*
* 每次解析都会创建新实例。
*
* @param type - 服务类型
* @param factory - 可选的工厂函数
*
* @example
* ```typescript
* // 每次解析都创建新实例
* container.registerTransient(Command);
* ```
*/
registerTransient<T extends IService>(type: ServiceType<T>, factory?: (container: ServiceContainer) => T): void;
/**
* 注册服务实例
*
* 直接注册已创建的实例,自动视为单例。
*
* @param type - 服务类型(构造函数,仅用作标识)
* @param instance - 服务实例
*
* @example
* ```typescript
* const config = new Config();
* container.registerInstance(Config, config);
* ```
*/
registerInstance<T extends IService>(type: ServiceType<T>, instance: T): void;
/**
* 解析服务
*
* @param type - 服务类型
* @returns 服务实例
* @throws 如果服务未注册或存在循环依赖
*
* @example
* ```typescript
* const timer = container.resolve(TimerManager);
* ```
*/
resolve<T extends IService>(type: ServiceType<T>): T;
/**
* 尝试解析服务
*
* 如果服务未注册,返回null而不是抛出异常。
*
* @param type - 服务类型
* @returns 服务实例或null
*
* @example
* ```typescript
* const timer = container.tryResolve(TimerManager);
* if (timer) {
* timer.schedule(...);
* }
* ```
*/
tryResolve<T extends IService>(type: ServiceType<T>): T | null;
/**
* 检查服务是否已注册
*
* @param type - 服务类型
* @returns 是否已注册
*/
isRegistered<T extends IService>(type: ServiceType<T>): boolean;
/**
* 注销服务
*
* @param type - 服务类型
* @returns 是否成功注销
*/
unregister<T extends IService>(type: ServiceType<T>): boolean;
/**
* 清空所有服务
*/
clear(): void;
/**
* 获取所有已注册的服务类型
*
* @returns 服务类型数组
*/
getRegisteredServices(): ServiceType<IService>[];
/**
* 更新所有使用@Updatable装饰器标记的服务
*
* 此方法会按优先级顺序遍历所有可更新的服务并调用它们的update方法。
* 所有服务在注册时已经由@Updatable装饰器验证过必须实现IUpdatable接口。
* 通常在Core的主更新循环中调用。
*
* @param deltaTime - 可选的帧时间间隔(秒)
*
* @example
* ```typescript
* // 在Core的update方法中
* this._serviceContainer.updateAll(deltaTime);
* ```
*/
updateAll(deltaTime?: number): void;
/**
* 获取所有可更新的服务数量
*
* @returns 可更新服务的数量
*/
getUpdatableCount(): number;
/**
* 获取所有已实例化的服务实例
*
* @returns 所有服务实例的数组
*/
getAll(): IService[];
}
/**
* 性能监控数据
*/
interface PerformanceData {
/** 系统名称 */
name: string;
/** 执行时间(毫秒) */
executionTime: number;
/** 处理的实体数量 */
entityCount: number;
/** 平均每个实体的处理时间 */
averageTimePerEntity: number;
/** 最后更新时间戳 */
lastUpdateTime: number;
/** 内存使用量(字节) */
memoryUsage?: number;
/** CPU使用率(百分比) */
cpuUsage?: number;
}
/**
* 性能统计信息
*/
interface PerformanceStats {
/** 总执行时间 */
totalTime: number;
/** 平均执行时间 */
averageTime: number;
/** 最小执行时间 */
minTime: number;
/** 最大执行时间 */
maxTime: number;
/** 执行次数 */
executionCount: number;
/** 最近的执行时间列表 */
recentTimes: number[];
/** 标准差 */
standardDeviation: number;
/** 95百分位数 */
percentile95: number;
/** 99百分位数 */
percentile99: number;
}
/**
* 性能警告类型
*/
declare enum PerformanceWarningType {
HIGH_EXECUTION_TIME = "high_execution_time",
HIGH_MEMORY_USAGE = "high_memory_usage",
HIGH_CPU_USAGE = "high_cpu_usage",
FREQUENT_GC = "frequent_gc",
LOW_FPS = "low_fps",
HIGH_ENTITY_COUNT = "high_entity_count"
}
/**
* 性能警告
*/
interface PerformanceWarning {
type: PerformanceWarningType;
systemName: string;
message: string;
severity: 'low' | 'medium' | 'high' | 'critical';
timestamp: number;
value: number;
threshold: number;
suggestion?: string;
}
/**
* 性能阈值配置
*/
interface PerformanceThresholds {
/** 执行时间阈值(毫秒) */
executionTime: {
warning: number;
critical: number;
};
/** 内存使用阈值(MB) */
memoryUsage: {
warning: number;
critical: number;
};
/** CPU使用率阈值(百分比) */
cpuUsage: {
warning: number;
critical: number;
};
/** FPS阈值 */
fps: {
warning: number;
critical: number;
};
/** 实体数量阈值 */
entityCount: {
warning: number;
critical: number;
};
}
/**
* 高性能监控器
* 用于监控ECS系统的性能表现,提供详细的分析和优化建议
*/
declare class PerformanceMonitor implements IService {
private _systemData;
private _systemStats;
private _isEnabled;
private _maxRecentSamples;
constructor();
/**
* 启用性能监控
*/
enable(): void;
/**
* 禁用性能监控
*/
disable(): void;
/**
* 检查是否启用了性能监控
*/
get isEnabled(): boolean;
/**
* 开始监控系统性能
* @param systemName 系统名称
* @returns 开始时间戳
*/
startMonitoring(_systemName: string): number;
/**
* 结束监控并记录性能数据
* @param systemName 系统名称
* @param start