移除了 EntitySystem.update() 中的冗余 invalidate() 调用
This commit is contained in:
@@ -554,10 +554,8 @@ export abstract class EntitySystem<
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
this.onBegin();
|
this.onBegin();
|
||||||
// 清除持久缓存,确保每次update都重新查询并检测实体变化
|
|
||||||
// 这对于响应式查询正确工作至关重要
|
|
||||||
this._entityCache.invalidate();
|
|
||||||
// 查询实体并存储到帧缓存中
|
// 查询实体并存储到帧缓存中
|
||||||
|
// 响应式查询会自动维护最新的实体列表,updateEntityTracking会在检测到变化时invalidate
|
||||||
this._entityCache.frame = this.queryEntities();
|
this._entityCache.frame = this.queryEntities();
|
||||||
entityCount = this._entityCache.frame.length;
|
entityCount = this._entityCache.frame.length;
|
||||||
|
|
||||||
|
|||||||
@@ -1,92 +0,0 @@
|
|||||||
import { Scene } from '../../../src/ECS/Scene';
|
|
||||||
import { Entity } from '../../../src/ECS/Entity';
|
|
||||||
import { Component } from '../../../src/ECS/Component';
|
|
||||||
import { ComponentTypeManager } from '../../../src/ECS/Utils/ComponentTypeManager';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 响应式查询调试测试
|
|
||||||
*
|
|
||||||
* 隔离测试响应式查询初始化问题
|
|
||||||
*/
|
|
||||||
|
|
||||||
class HealthComponent extends Component {
|
|
||||||
public health: number;
|
|
||||||
|
|
||||||
constructor(health: number = 100) {
|
|
||||||
super();
|
|
||||||
this.health = health;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
describe('ReactiveQueryDebug - 响应式查询初始化调试', () => {
|
|
||||||
let scene: Scene;
|
|
||||||
|
|
||||||
beforeEach(() => {
|
|
||||||
ComponentTypeManager.instance.reset();
|
|
||||||
scene = new Scene();
|
|
||||||
scene.name = 'DebugScene';
|
|
||||||
});
|
|
||||||
|
|
||||||
test('场景有实体时QuerySystem.queryAll应该能找到实体', () => {
|
|
||||||
const entity = scene.createEntity('TestEntity');
|
|
||||||
entity.addComponent(new HealthComponent(100));
|
|
||||||
|
|
||||||
// 直接使用QuerySystem查询
|
|
||||||
const result = scene.querySystem!.queryAll(HealthComponent);
|
|
||||||
|
|
||||||
console.log('QuerySystem.queryAll结果:', {
|
|
||||||
count: result.count,
|
|
||||||
entities: result.entities.map(e => ({ id: e.id, name: e.name }))
|
|
||||||
});
|
|
||||||
|
|
||||||
expect(result.count).toBe(1);
|
|
||||||
expect(result.entities[0]).toBe(entity);
|
|
||||||
});
|
|
||||||
|
|
||||||
test('第一次查询和第二次查询应该返回相同结果', () => {
|
|
||||||
const entity = scene.createEntity('TestEntity');
|
|
||||||
entity.addComponent(new HealthComponent(100));
|
|
||||||
|
|
||||||
// 第一次查询
|
|
||||||
const result1 = scene.querySystem!.queryAll(HealthComponent);
|
|
||||||
|
|
||||||
console.log('第一次查询结果:', {
|
|
||||||
count: result1.count,
|
|
||||||
entities: result1.entities.map(e => ({ id: e.id, name: e.name }))
|
|
||||||
});
|
|
||||||
|
|
||||||
// 第二次查询
|
|
||||||
const result2 = scene.querySystem!.queryAll(HealthComponent);
|
|
||||||
|
|
||||||
console.log('第二次查询结果:', {
|
|
||||||
count: result2.count,
|
|
||||||
entities: result2.entities.map(e => ({ id: e.id, name: e.name }))
|
|
||||||
});
|
|
||||||
|
|
||||||
expect(result1.count).toBe(1);
|
|
||||||
expect(result2.count).toBe(1);
|
|
||||||
expect(result1.entities[0]).toBe(result2.entities[0]);
|
|
||||||
});
|
|
||||||
|
|
||||||
test('添加组件后查询应该能找到实体', () => {
|
|
||||||
const entity = scene.createEntity('TestEntity');
|
|
||||||
|
|
||||||
// 第一次查询(实体还没有组件)
|
|
||||||
const result1 = scene.querySystem!.queryAll(HealthComponent);
|
|
||||||
console.log('添加组件前查询结果:', { count: result1.count });
|
|
||||||
expect(result1.count).toBe(0);
|
|
||||||
|
|
||||||
// 添加组件
|
|
||||||
entity.addComponent(new HealthComponent(100));
|
|
||||||
|
|
||||||
// 第二次查询(实体已有组件)
|
|
||||||
const result2 = scene.querySystem!.queryAll(HealthComponent);
|
|
||||||
console.log('添加组件后查询结果:', {
|
|
||||||
count: result2.count,
|
|
||||||
entities: result2.entities.map(e => ({ id: e.id, name: e.name }))
|
|
||||||
});
|
|
||||||
|
|
||||||
expect(result2.count).toBe(1);
|
|
||||||
expect(result2.entities[0]).toBe(entity);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
@@ -1,164 +0,0 @@
|
|||||||
import { Scene } from '../../../src/ECS/Scene';
|
|
||||||
import { Entity } from '../../../src/ECS/Entity';
|
|
||||||
import { Component } from '../../../src/ECS/Component';
|
|
||||||
import { EntitySystem } from '../../../src/ECS/Systems/EntitySystem';
|
|
||||||
import { Matcher } from '../../../src/ECS/Utils/Matcher';
|
|
||||||
import { ComponentTypeManager } from '../../../src/ECS/Utils/ComponentTypeManager';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* System初始化调试测试
|
|
||||||
*/
|
|
||||||
|
|
||||||
class HealthComponent extends Component {
|
|
||||||
public health: number;
|
|
||||||
|
|
||||||
constructor(health: number = 100) {
|
|
||||||
super();
|
|
||||||
this.health = health;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class HealthSystem extends EntitySystem {
|
|
||||||
public initializeCalled = false;
|
|
||||||
public onAddedEntities: Entity[] = [];
|
|
||||||
public queryResults: readonly Entity[] = [];
|
|
||||||
|
|
||||||
constructor() {
|
|
||||||
super(Matcher.empty().all(HealthComponent));
|
|
||||||
}
|
|
||||||
|
|
||||||
public override initialize(): void {
|
|
||||||
console.log('[HealthSystem] initialize() 开始');
|
|
||||||
console.log('[HealthSystem] scene:', !!this.scene);
|
|
||||||
console.log('[HealthSystem] matcher:', this.matcher.toString());
|
|
||||||
|
|
||||||
this.initializeCalled = true;
|
|
||||||
super.initialize();
|
|
||||||
|
|
||||||
// 初始化后立即查询
|
|
||||||
if (this.scene?.querySystem) {
|
|
||||||
const result = this.scene.querySystem.queryAll(HealthComponent);
|
|
||||||
console.log('[HealthSystem] 初始化后立即查询结果:', {
|
|
||||||
count: result.count,
|
|
||||||
entities: result.entities.map(e => ({ id: e.id, name: e.name }))
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
console.log('[HealthSystem] initialize() 完成, onAddedEntities.length=', this.onAddedEntities.length);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected override onAdded(entity: Entity): void {
|
|
||||||
console.log('[HealthSystem] onAdded() 被调用:', { id: entity.id, name: entity.name });
|
|
||||||
this.onAddedEntities.push(entity);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected override process(entities: readonly Entity[]): void {
|
|
||||||
this.queryResults = entities;
|
|
||||||
for (const entity of entities) {
|
|
||||||
const health = entity.getComponent(HealthComponent)!;
|
|
||||||
if (health.health <= 0) {
|
|
||||||
entity.enabled = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
describe('SystemInitializationDebug - 系统初始化调试', () => {
|
|
||||||
let scene: Scene;
|
|
||||||
|
|
||||||
beforeEach(() => {
|
|
||||||
ComponentTypeManager.instance.reset();
|
|
||||||
scene = new Scene();
|
|
||||||
scene.name = 'DebugScene';
|
|
||||||
});
|
|
||||||
|
|
||||||
test('先创建实体再添加系统 - 应该触发onAdded', () => {
|
|
||||||
console.log('\n=== 测试开始 ===');
|
|
||||||
|
|
||||||
// 1. 创建实体并添加组件
|
|
||||||
const entity = scene.createEntity('TestEntity');
|
|
||||||
console.log('[Test] 创建实体:', { id: entity.id, name: entity.name });
|
|
||||||
|
|
||||||
entity.addComponent(new HealthComponent(100));
|
|
||||||
console.log('[Test] 添加HealthComponent');
|
|
||||||
|
|
||||||
// 2. 验证QuerySystem能查询到实体
|
|
||||||
const queryResult = scene.querySystem!.queryAll(HealthComponent);
|
|
||||||
console.log('[Test] QuerySystem查询结果:', {
|
|
||||||
count: queryResult.count,
|
|
||||||
entities: queryResult.entities.map(e => ({ id: e.id, name: e.name }))
|
|
||||||
});
|
|
||||||
|
|
||||||
expect(queryResult.count).toBe(1);
|
|
||||||
expect(queryResult.entities[0]).toBe(entity);
|
|
||||||
|
|
||||||
// 3. 添加系统
|
|
||||||
const system = new HealthSystem();
|
|
||||||
console.log('[Test] 准备添加系统到场景');
|
|
||||||
scene.addEntityProcessor(system);
|
|
||||||
console.log('[Test] 系统已添加');
|
|
||||||
|
|
||||||
// 4. 验证系统状态
|
|
||||||
console.log('[Test] 系统状态:', {
|
|
||||||
initializeCalled: system.initializeCalled,
|
|
||||||
onAddedEntitiesLength: system.onAddedEntities.length,
|
|
||||||
onAddedEntities: system.onAddedEntities.map(e => ({ id: e.id, name: e.name }))
|
|
||||||
});
|
|
||||||
|
|
||||||
expect(system.initializeCalled).toBe(true);
|
|
||||||
expect(system.onAddedEntities).toHaveLength(1);
|
|
||||||
expect(system.onAddedEntities[0]).toBe(entity);
|
|
||||||
|
|
||||||
console.log('=== 测试结束 ===\n');
|
|
||||||
});
|
|
||||||
|
|
||||||
test('添加同类型的第二个系统 - 应该返回已注册的实例', () => {
|
|
||||||
console.log('\n=== 单例模式测试开始 ===');
|
|
||||||
|
|
||||||
// 1. 创建实体并添加组件
|
|
||||||
const entity = scene.createEntity('TestEntity');
|
|
||||||
console.log('[Test] 创建实体:', { id: entity.id, name: entity.name });
|
|
||||||
|
|
||||||
entity.addComponent(new HealthComponent(100));
|
|
||||||
console.log('[Test] 添加HealthComponent');
|
|
||||||
|
|
||||||
// 2. 添加第一个系统
|
|
||||||
const system1 = new HealthSystem();
|
|
||||||
console.log('[Test] 准备添加第一个系统');
|
|
||||||
const returnedSystem1 = scene.addEntityProcessor(system1);
|
|
||||||
console.log('[Test] 第一个系统已添加, system1===returnedSystem1?', system1 === returnedSystem1);
|
|
||||||
|
|
||||||
console.log('[Test] 第一个系统状态:', {
|
|
||||||
initializeCalled: system1.initializeCalled,
|
|
||||||
onAddedEntitiesLength: system1.onAddedEntities.length
|
|
||||||
});
|
|
||||||
|
|
||||||
expect(system1.initializeCalled).toBe(true);
|
|
||||||
expect(system1.onAddedEntities).toHaveLength(1);
|
|
||||||
expect(system1.onAddedEntities[0]).toBe(entity);
|
|
||||||
|
|
||||||
// 3. 尝试添加第二个同类型系统 - 应该返回已注册的system1
|
|
||||||
const system2 = new HealthSystem();
|
|
||||||
console.log('[Test] 准备添加第二个系统, system1===system2?', system1 === system2);
|
|
||||||
console.log('[Test] 系统是否已在ServiceContainer注册:', scene.services.isRegistered(HealthSystem));
|
|
||||||
const returnedSystem2 = scene.addEntityProcessor(system2);
|
|
||||||
console.log('[Test] 第二个系统调用完成');
|
|
||||||
console.log('[Test] system2===returnedSystem2?', system2 === returnedSystem2);
|
|
||||||
console.log('[Test] returnedSystem1===returnedSystem2?', returnedSystem1 === returnedSystem2);
|
|
||||||
|
|
||||||
// 验证单例行为: returnedSystem2应该是system1而不是system2
|
|
||||||
expect(returnedSystem1).toBe(returnedSystem2);
|
|
||||||
expect(returnedSystem2).toBe(system1);
|
|
||||||
expect(returnedSystem2).not.toBe(system2);
|
|
||||||
|
|
||||||
// system2不应该被初始化(因为被拒绝了)
|
|
||||||
expect(system2.initializeCalled).toBe(false);
|
|
||||||
expect(system2.onAddedEntities).toHaveLength(0);
|
|
||||||
|
|
||||||
// 返回的应该是已初始化的system1
|
|
||||||
expect(returnedSystem2.initializeCalled).toBe(true);
|
|
||||||
expect(returnedSystem2.onAddedEntities).toHaveLength(1);
|
|
||||||
|
|
||||||
console.log('=== 单例模式测试结束 ===\n');
|
|
||||||
});
|
|
||||||
});
|
|
||||||
Reference in New Issue
Block a user