feat(ecs): 添加系统稳定排序支持

This commit is contained in:
yhh
2025-12-03 20:54:34 +08:00
parent 88af781d78
commit d746cf3bb8
3 changed files with 144 additions and 2 deletions

View File

@@ -143,6 +143,14 @@ export class Scene implements IScene {
*/
private _maxErrorCount: number = 10;
/**
* 系统添加计数器
*
* 用于为每个添加的系统分配唯一的添加顺序,保证排序稳定性
* Counter for assigning unique add order to each system for stable sorting
*/
private _systemAddCounter: number = 0;
/**
* 获取场景中所有已注册的EntitySystem
*
@@ -180,10 +188,15 @@ export class Scene implements IScene {
}
/**
* 按updateOrder排序系统
* 按 updateOrder 排序系统,相同时按 addOrder 保证稳定性
* Sort systems by updateOrder, use addOrder as secondary key for stability
*/
private _sortSystemsByUpdateOrder(systems: EntitySystem[]): EntitySystem[] {
return systems.sort((a, b) => a.updateOrder - b.updateOrder);
return systems.sort((a, b) => {
const orderDiff = a.updateOrder - b.updateOrder;
if (orderDiff !== 0) return orderDiff;
return a.addOrder - b.addOrder;
});
}
/**
@@ -707,6 +720,9 @@ export class Scene implements IScene {
system.scene = this;
// 分配添加顺序,用于稳定排序 | Assign add order for stable sorting
system.addOrder = this._systemAddCounter++;
system.setPerformanceMonitor(this.performanceMonitor);
const metadata = getSystemMetadata(constructor);

View File

@@ -66,6 +66,12 @@ interface EventListenerRecord {
*/
export abstract class EntitySystem implements ISystemBase, IService {
private _updateOrder: number;
/**
* 添加顺序,用于 updateOrder 相同时的稳定排序
* Add order for stable sorting when updateOrder is the same
* @internal
*/
private _addOrder: number;
private _enabled: boolean;
private _performanceMonitor: PerformanceMonitor | null;
private _systemName: string;
@@ -116,6 +122,24 @@ export abstract class EntitySystem implements ISystemBase, IService {
this.setUpdateOrder(value);
}
/**
* 获取系统的添加顺序
* Get the add order of the system
* @internal
*/
public get addOrder(): number {
return this._addOrder;
}
/**
* 设置系统的添加顺序(由 Scene 在添加时设置)
* Set the add order of the system (set by Scene when adding)
* @internal
*/
public set addOrder(value: number) {
this._addOrder = value;
}
/**
* 获取系统的启用状态
*/
@@ -139,6 +163,7 @@ export abstract class EntitySystem implements ISystemBase, IService {
constructor(matcher?: Matcher) {
this._updateOrder = 0;
this._addOrder = 0;
this._enabled = true;
this._performanceMonitor = null;
this._systemName = getSystemInstanceTypeName(this);