Scene 构造函数注入 PerformanceMonitor

This commit is contained in:
YHH
2025-10-10 22:08:10 +08:00
parent b13132b259
commit 1af2cf5f99
3 changed files with 76 additions and 3 deletions

View File

@@ -165,4 +165,12 @@ export interface ISceneConfig {
* 场景名称
*/
name?: string;
/**
* 性能监控器实例(可选)
*
* 如果不提供Scene会自动从Core.services获取全局PerformanceMonitor。
* 提供此参数可以实现场景级别的独立性能监控。
*/
performanceMonitor?: any;
}

View File

@@ -89,6 +89,13 @@ export class Scene implements IScene {
*/
private readonly logger: ReturnType<typeof createLogger>;
/**
* 性能监控器
*
* 用于监控场景和系统的性能。可以在构造函数中注入如果不提供则从Core获取。
*/
private readonly _performanceMonitor: PerformanceMonitor;
/**
* 场景是否已开始运行
*/
@@ -167,6 +174,12 @@ export class Scene implements IScene {
this._services = new ServiceContainer();
this.logger = createLogger('Scene');
if (config?.performanceMonitor) {
this._performanceMonitor = config.performanceMonitor;
} else {
this._performanceMonitor = Core.services.resolve(PerformanceMonitor);
}
if (config?.name) {
this.name = config.name;
}
@@ -547,8 +560,7 @@ export class Scene implements IScene {
system.scene = this;
const perfMonitor = Core.services.resolve(PerformanceMonitor);
system.setPerformanceMonitor(perfMonitor);
system.setPerformanceMonitor(this._performanceMonitor);
const metadata = getSystemMetadata(constructor);
if (metadata?.updateOrder !== undefined) {

View File

@@ -581,11 +581,64 @@ describe('Scene - 场景管理系统测试', () => {
test('对已销毁实体的操作应该安全处理', () => {
const entity = scene.createEntity("TestEntity");
scene.entities.remove(entity);
// 对已销毁实体的操作应该安全
expect(() => {
entity.addComponent(new PositionComponent(0, 0));
}).not.toThrow();
});
});
describe('依赖注入优化', () => {
test('应该支持注入自定义PerformanceMonitor', () => {
const mockPerfMonitor = {
startMeasure: jest.fn(),
endMeasure: jest.fn(),
recordSystemData: jest.fn(),
recordEntityCount: jest.fn(),
recordComponentCount: jest.fn(),
update: jest.fn(),
getSystemData: jest.fn(),
getSystemStats: jest.fn(),
resetSystem: jest.fn(),
reset: jest.fn(),
dispose: jest.fn()
};
const customScene = new Scene({
name: 'CustomScene',
performanceMonitor: mockPerfMonitor as any
});
class TestSystem extends EntitySystem {
constructor() {
super(Matcher.empty().all(PositionComponent));
}
}
const system = new TestSystem();
customScene.addEntityProcessor(system);
expect(mockPerfMonitor).toBeDefined();
customScene.end();
});
test('未提供PerformanceMonitor时应该从Core获取', () => {
const defaultScene = new Scene({ name: 'DefaultScene' });
class TestSystem extends EntitySystem {
constructor() {
super(Matcher.empty().all(PositionComponent));
}
}
const system = new TestSystem();
defaultScene.addEntityProcessor(system);
expect(defaultScene).toBeDefined();
defaultScene.end();
});
});
});