Scene 构造函数注入 PerformanceMonitor
This commit is contained in:
@@ -165,4 +165,12 @@ export interface ISceneConfig {
|
|||||||
* 场景名称
|
* 场景名称
|
||||||
*/
|
*/
|
||||||
name?: string;
|
name?: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 性能监控器实例(可选)
|
||||||
|
*
|
||||||
|
* 如果不提供,Scene会自动从Core.services获取全局PerformanceMonitor。
|
||||||
|
* 提供此参数可以实现场景级别的独立性能监控。
|
||||||
|
*/
|
||||||
|
performanceMonitor?: any;
|
||||||
}
|
}
|
||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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();
|
||||||
|
});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
Reference in New Issue
Block a user