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; 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>; 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._services = new ServiceContainer();
this.logger = createLogger('Scene'); this.logger = createLogger('Scene');
if (config?.performanceMonitor) {
this._performanceMonitor = config.performanceMonitor;
} else {
this._performanceMonitor = Core.services.resolve(PerformanceMonitor);
}
if (config?.name) { if (config?.name) {
this.name = config.name; this.name = config.name;
} }
@@ -547,8 +560,7 @@ export class Scene implements IScene {
system.scene = this; system.scene = this;
const perfMonitor = Core.services.resolve(PerformanceMonitor); system.setPerformanceMonitor(this._performanceMonitor);
system.setPerformanceMonitor(perfMonitor);
const metadata = getSystemMetadata(constructor); const metadata = getSystemMetadata(constructor);
if (metadata?.updateOrder !== undefined) { if (metadata?.updateOrder !== undefined) {

View File

@@ -581,11 +581,64 @@ describe('Scene - 场景管理系统测试', () => {
test('对已销毁实体的操作应该安全处理', () => { test('对已销毁实体的操作应该安全处理', () => {
const entity = scene.createEntity("TestEntity"); const entity = scene.createEntity("TestEntity");
scene.entities.remove(entity); scene.entities.remove(entity);
// 对已销毁实体的操作应该安全 // 对已销毁实体的操作应该安全
expect(() => { expect(() => {
entity.addComponent(new PositionComponent(0, 0)); entity.addComponent(new PositionComponent(0, 0));
}).not.toThrow(); }).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();
});
});
}); });