feat(ecs): 添加系统稳定排序支持
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user