performancemonitor由内部框架维护

This commit is contained in:
YHH
2025-10-17 22:13:32 +08:00
parent 61caad2bef
commit 63165bbbfc
5 changed files with 53 additions and 44 deletions

View File

@@ -180,7 +180,7 @@ export class Core {
this._serviceContainer.registerInstance(PoolManager, this._poolManager); this._serviceContainer.registerInstance(PoolManager, this._poolManager);
// 初始化场景管理器 // 初始化场景管理器
this._sceneManager = new SceneManager(); this._sceneManager = new SceneManager(this._performanceMonitor);
this._serviceContainer.registerInstance(SceneManager, this._sceneManager); this._serviceContainer.registerInstance(SceneManager, this._sceneManager);
// 设置场景切换回调,通知调试管理器 // 设置场景切换回调,通知调试管理器

View File

@@ -6,6 +6,7 @@ import { ComponentStorageManager } from './Core/ComponentStorage';
import { QuerySystem } from './Core/QuerySystem'; import { QuerySystem } from './Core/QuerySystem';
import { TypeSafeEventSystem } from './Core/EventSystem'; import { TypeSafeEventSystem } from './Core/EventSystem';
import type { ReferenceTracker } from './Core/ReferenceTracker'; import type { ReferenceTracker } from './Core/ReferenceTracker';
import type { ServiceContainer } from '../Core/ServiceContainer';
/** /**
* 场景接口定义 * 场景接口定义
@@ -67,6 +68,13 @@ export interface IScene {
*/ */
readonly referenceTracker: ReferenceTracker; readonly referenceTracker: ReferenceTracker;
/**
* 服务容器
*
* 场景级别的依赖注入容器,用于管理服务的生命周期。
*/
readonly services: ServiceContainer;
/** /**
* 获取系统列表 * 获取系统列表
*/ */
@@ -171,12 +179,4 @@ export interface ISceneConfig {
* 场景名称 * 场景名称
*/ */
name?: string; name?: string;
/**
* 性能监控器实例(可选)
*
* 如果不提供Scene会自动从Core.services获取全局PerformanceMonitor。
* 提供此参数可以实现场景级别的独立性能监控。
*/
performanceMonitor?: any;
} }

View File

@@ -21,7 +21,7 @@ import { createLogger } from '../Utils/Logger';
/** /**
* 游戏场景默认实现类 * 游戏场景默认实现类
* *
* 实现IScene接口提供场景的基础功能。 * 实现IScene接口提供场景的基础功能。
* 推荐使用组合而非继承的方式来构建自定义场景。 * 推荐使用组合而非继承的方式来构建自定义场景。
*/ */
@@ -97,11 +97,11 @@ export class Scene implements IScene {
private readonly logger: ReturnType<typeof createLogger>; private readonly logger: ReturnType<typeof createLogger>;
/** /**
* 性能监控器 * 性能监控器缓存
* *
* 用于监控场景和系统的性能。可以在构造函数中注入如果不提供则从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._services = new ServiceContainer();
this.logger = createLogger('Scene'); this.logger = createLogger('Scene');
// 从配置获取 PerformanceMonitor如果未提供则创建一个新实例
// Scene 应该是独立的,不依赖于 Core通过构造函数参数明确依赖关系
this._performanceMonitor = config?.performanceMonitor || new PerformanceMonitor();
if (config?.name) { if (config?.name) {
this.name = 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.scene = this;
system.setPerformanceMonitor(this._performanceMonitor); system.setPerformanceMonitor(this.performanceMonitor);
const metadata = getSystemMetadata(constructor); const metadata = getSystemMetadata(constructor);
if (metadata?.updateOrder !== undefined) { if (metadata?.updateOrder !== undefined) {

View File

@@ -4,6 +4,7 @@ import { Time } from '../Utils/Time';
import { createLogger } from '../Utils/Logger'; import { createLogger } from '../Utils/Logger';
import type { IService } from '../Core/ServiceContainer'; import type { IService } from '../Core/ServiceContainer';
import { World } from './World'; import { World } from './World';
import { PerformanceMonitor } from '../Utils/PerformanceMonitor';
/** /**
* 单场景管理器 * 单场景管理器
@@ -73,14 +74,20 @@ export class SceneManager implements IService {
*/ */
private _onSceneChangedCallback?: () => void; private _onSceneChangedCallback?: () => void;
/**
* 性能监控器(从 Core 注入)
*/
private _performanceMonitor: PerformanceMonitor | null = null;
/** /**
* 默认场景ID * 默认场景ID
*/ */
private static readonly DEFAULT_SCENE_ID = '__main__'; private static readonly DEFAULT_SCENE_ID = '__main__';
constructor() { constructor(performanceMonitor?: PerformanceMonitor) {
this._defaultWorld = new World({ name: '__default__' }); this._defaultWorld = new World({ name: '__default__' });
this._defaultWorld.start(); this._defaultWorld.start();
this._performanceMonitor = performanceMonitor || null;
} }
/** /**
@@ -111,6 +118,11 @@ export class SceneManager implements IService {
// 移除旧场景 // 移除旧场景
this._defaultWorld.removeAllScenes(); this._defaultWorld.removeAllScenes();
// 注册全局 PerformanceMonitor 到 Scene 的 ServiceContainer
if (this._performanceMonitor) {
scene.services.registerInstance(PerformanceMonitor, this._performanceMonitor);
}
// 通过 World 创建新场景 // 通过 World 创建新场景
this._defaultWorld.createScene(SceneManager.DEFAULT_SCENE_ID, scene); this._defaultWorld.createScene(SceneManager.DEFAULT_SCENE_ID, scene);
this._defaultWorld.setSceneActive(SceneManager.DEFAULT_SCENE_ID, true); this._defaultWorld.setSceneActive(SceneManager.DEFAULT_SCENE_ID, true);

View File

@@ -589,25 +589,10 @@ describe('Scene - 场景管理系统测试', () => {
}); });
}); });
describe('依赖注入优化', () => { describe('性能监控', () => {
test('应该支持注入自定义PerformanceMonitor', () => { test('Scene应该自动创建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({ const customScene = new Scene({
name: 'CustomScene', name: 'CustomScene'
performanceMonitor: mockPerfMonitor as any
}); });
class TestSystem extends EntitySystem { class TestSystem extends EntitySystem {
@@ -619,13 +604,14 @@ describe('Scene - 场景管理系统测试', () => {
const system = new TestSystem(); const system = new TestSystem();
customScene.addEntityProcessor(system); customScene.addEntityProcessor(system);
expect(mockPerfMonitor).toBeDefined(); expect(customScene).toBeDefined();
customScene.end(); customScene.end();
}); });
test('未提供PerformanceMonitor时应该从Core获取', () => { test('每个Scene应该有独立的PerformanceMonitor', () => {
const defaultScene = new Scene({ name: 'DefaultScene' }); const scene1 = new Scene({ name: 'Scene1' });
const scene2 = new Scene({ name: 'Scene2' });
class TestSystem extends EntitySystem { class TestSystem extends EntitySystem {
constructor() { constructor() {
@@ -633,12 +619,14 @@ describe('Scene - 场景管理系统测试', () => {
} }
} }
const system = new TestSystem(); scene1.addEntityProcessor(new TestSystem());
defaultScene.addEntityProcessor(system); scene2.addEntityProcessor(new TestSystem());
expect(defaultScene).toBeDefined(); expect(scene1).toBeDefined();
expect(scene2).toBeDefined();
defaultScene.end(); scene1.end();
scene2.end();
}); });
}); });
}); });