From 63165bbbfc152d6ec5e03c24a2415c2d9fed7705 Mon Sep 17 00:00:00 2001 From: YHH <359807859@qq.com> Date: Fri, 17 Oct 2025 22:13:32 +0800 Subject: [PATCH] =?UTF-8?q?performancemonitor=E7=94=B1=E5=86=85=E9=83=A8?= =?UTF-8?q?=E6=A1=86=E6=9E=B6=E7=BB=B4=E6=8A=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/core/src/Core.ts | 2 +- packages/core/src/ECS/IScene.ts | 16 +++++------ packages/core/src/ECS/Scene.ts | 27 ++++++++++++------- packages/core/src/ECS/SceneManager.ts | 14 +++++++++- packages/core/tests/ECS/Scene.test.ts | 38 +++++++++------------------ 5 files changed, 53 insertions(+), 44 deletions(-) diff --git a/packages/core/src/Core.ts b/packages/core/src/Core.ts index 2f5931b5..f3f2b5e8 100644 --- a/packages/core/src/Core.ts +++ b/packages/core/src/Core.ts @@ -180,7 +180,7 @@ export class Core { this._serviceContainer.registerInstance(PoolManager, this._poolManager); // 初始化场景管理器 - this._sceneManager = new SceneManager(); + this._sceneManager = new SceneManager(this._performanceMonitor); this._serviceContainer.registerInstance(SceneManager, this._sceneManager); // 设置场景切换回调,通知调试管理器 diff --git a/packages/core/src/ECS/IScene.ts b/packages/core/src/ECS/IScene.ts index f1f90a15..6d9e32d4 100644 --- a/packages/core/src/ECS/IScene.ts +++ b/packages/core/src/ECS/IScene.ts @@ -6,6 +6,7 @@ import { ComponentStorageManager } from './Core/ComponentStorage'; import { QuerySystem } from './Core/QuerySystem'; import { TypeSafeEventSystem } from './Core/EventSystem'; import type { ReferenceTracker } from './Core/ReferenceTracker'; +import type { ServiceContainer } from '../Core/ServiceContainer'; /** * 场景接口定义 @@ -67,6 +68,13 @@ export interface IScene { */ readonly referenceTracker: ReferenceTracker; + /** + * 服务容器 + * + * 场景级别的依赖注入容器,用于管理服务的生命周期。 + */ + readonly services: ServiceContainer; + /** * 获取系统列表 */ @@ -171,12 +179,4 @@ 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 d0681889..8efb2aa6 100644 --- a/packages/core/src/ECS/Scene.ts +++ b/packages/core/src/ECS/Scene.ts @@ -21,7 +21,7 @@ import { createLogger } from '../Utils/Logger'; /** * 游戏场景默认实现类 - * + * * 实现IScene接口,提供场景的基础功能。 * 推荐使用组合而非继承的方式来构建自定义场景。 */ @@ -97,11 +97,11 @@ export class Scene implements IScene { private readonly logger: ReturnType; /** - * 性能监控器 + * 性能监控器缓存 * - * 用于监控场景和系统的性能。可以在构造函数中注入,如果不提供则从Core获取。 + * 用于监控场景和系统的性能。从 ServiceContainer 获取。 */ - private readonly _performanceMonitor: PerformanceMonitor; + private _performanceMonitor: PerformanceMonitor | null = null; /** * 场景是否已开始运行 @@ -182,10 +182,6 @@ export class Scene implements IScene { this._services = new ServiceContainer(); this.logger = createLogger('Scene'); - // 从配置获取 PerformanceMonitor,如果未提供则创建一个新实例 - // Scene 应该是独立的,不依赖于 Core,通过构造函数参数明确依赖关系 - this._performanceMonitor = config?.performanceMonitor || new PerformanceMonitor(); - if (config?.name) { this.name = config.name; } @@ -201,6 +197,19 @@ export class Scene implements IScene { } } + /** + * 获取性能监控器 + * + * 从 ServiceContainer 获取,如果未注册则创建默认实例(向后兼容) + */ + private get performanceMonitor(): PerformanceMonitor { + if (!this._performanceMonitor) { + this._performanceMonitor = this._services.tryResolve(PerformanceMonitor) + ?? new PerformanceMonitor(); + } + return this._performanceMonitor; + } + /** * 初始化场景 * @@ -578,7 +587,7 @@ export class Scene implements IScene { system.scene = this; - system.setPerformanceMonitor(this._performanceMonitor); + system.setPerformanceMonitor(this.performanceMonitor); const metadata = getSystemMetadata(constructor); if (metadata?.updateOrder !== undefined) { diff --git a/packages/core/src/ECS/SceneManager.ts b/packages/core/src/ECS/SceneManager.ts index 8d1b2b50..dd9953b7 100644 --- a/packages/core/src/ECS/SceneManager.ts +++ b/packages/core/src/ECS/SceneManager.ts @@ -4,6 +4,7 @@ import { Time } from '../Utils/Time'; import { createLogger } from '../Utils/Logger'; import type { IService } from '../Core/ServiceContainer'; import { World } from './World'; +import { PerformanceMonitor } from '../Utils/PerformanceMonitor'; /** * 单场景管理器 @@ -73,14 +74,20 @@ export class SceneManager implements IService { */ private _onSceneChangedCallback?: () => void; + /** + * 性能监控器(从 Core 注入) + */ + private _performanceMonitor: PerformanceMonitor | null = null; + /** * 默认场景ID */ private static readonly DEFAULT_SCENE_ID = '__main__'; - constructor() { + constructor(performanceMonitor?: PerformanceMonitor) { this._defaultWorld = new World({ name: '__default__' }); this._defaultWorld.start(); + this._performanceMonitor = performanceMonitor || null; } /** @@ -111,6 +118,11 @@ export class SceneManager implements IService { // 移除旧场景 this._defaultWorld.removeAllScenes(); + // 注册全局 PerformanceMonitor 到 Scene 的 ServiceContainer + if (this._performanceMonitor) { + scene.services.registerInstance(PerformanceMonitor, this._performanceMonitor); + } + // 通过 World 创建新场景 this._defaultWorld.createScene(SceneManager.DEFAULT_SCENE_ID, scene); this._defaultWorld.setSceneActive(SceneManager.DEFAULT_SCENE_ID, true); diff --git a/packages/core/tests/ECS/Scene.test.ts b/packages/core/tests/ECS/Scene.test.ts index 44650dff..9a515052 100644 --- a/packages/core/tests/ECS/Scene.test.ts +++ b/packages/core/tests/ECS/Scene.test.ts @@ -589,25 +589,10 @@ describe('Scene - 场景管理系统测试', () => { }); }); - 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() - }; - + describe('性能监控', () => { + test('Scene应该自动创建PerformanceMonitor', () => { const customScene = new Scene({ - name: 'CustomScene', - performanceMonitor: mockPerfMonitor as any + name: 'CustomScene' }); class TestSystem extends EntitySystem { @@ -619,13 +604,14 @@ describe('Scene - 场景管理系统测试', () => { const system = new TestSystem(); customScene.addEntityProcessor(system); - expect(mockPerfMonitor).toBeDefined(); + expect(customScene).toBeDefined(); customScene.end(); }); - test('未提供PerformanceMonitor时应该从Core获取', () => { - const defaultScene = new Scene({ name: 'DefaultScene' }); + test('每个Scene应该有独立的PerformanceMonitor', () => { + const scene1 = new Scene({ name: 'Scene1' }); + const scene2 = new Scene({ name: 'Scene2' }); class TestSystem extends EntitySystem { constructor() { @@ -633,12 +619,14 @@ describe('Scene - 场景管理系统测试', () => { } } - const system = new TestSystem(); - defaultScene.addEntityProcessor(system); + scene1.addEntityProcessor(new TestSystem()); + scene2.addEntityProcessor(new TestSystem()); - expect(defaultScene).toBeDefined(); + expect(scene1).toBeDefined(); + expect(scene2).toBeDefined(); - defaultScene.end(); + scene1.end(); + scene2.end(); }); }); }); \ No newline at end of file