diff --git a/packages/core/src/ECS/IScene.ts b/packages/core/src/ECS/IScene.ts index fb9fc5a0..459d4e76 100644 --- a/packages/core/src/ECS/IScene.ts +++ b/packages/core/src/ECS/IScene.ts @@ -165,4 +165,12 @@ export interface ISceneConfig { * 场景名称 */ name?: string; + + /** + * 性能监控器实例(可选) + * + * 如果不提供,Scene会自动从Core.services获取全局PerformanceMonitor。 + * 提供此参数可以实现场景级别的独立性能监控。 + */ + performanceMonitor?: any; } \ No newline at end of file diff --git a/packages/core/src/ECS/Scene.ts b/packages/core/src/ECS/Scene.ts index 1d468554..54ae0e2b 100644 --- a/packages/core/src/ECS/Scene.ts +++ b/packages/core/src/ECS/Scene.ts @@ -89,6 +89,13 @@ export class Scene implements IScene { */ private readonly logger: ReturnType; + /** + * 性能监控器 + * + * 用于监控场景和系统的性能。可以在构造函数中注入,如果不提供则从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) { diff --git a/packages/core/tests/ECS/Scene.test.ts b/packages/core/tests/ECS/Scene.test.ts index 2d5355af..44650dff 100644 --- a/packages/core/tests/ECS/Scene.test.ts +++ b/packages/core/tests/ECS/Scene.test.ts @@ -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(); + }); + }); }); \ No newline at end of file