diff --git a/src/ECS/Core/QuerySystem.ts b/src/ECS/Core/QuerySystem.ts index be983988..d029abc0 100644 --- a/src/ECS/Core/QuerySystem.ts +++ b/src/ECS/Core/QuerySystem.ts @@ -378,9 +378,15 @@ export class QuerySystem { this.entityIndex.byComponentType.clear(); this.entityIndex.byTag.clear(); this.entityIndex.byName.clear(); + + // 清理ArchetypeSystem和ComponentIndexManager + this.archetypeSystem.clear(); + this.componentIndexManager.clear(); for (const entity of this.entities) { this.addEntityToIndexes(entity); + this.componentIndexManager.addEntity(entity); + this.archetypeSystem.addEntity(entity); } this.indexDirty = false; @@ -897,15 +903,25 @@ export class QuerySystem { * @returns 生成的位掩码 */ private createComponentMask(componentTypes: ComponentType[]): bigint { - // 使用位掩码优化器创建掩码 - const componentNames = componentTypes.map(type => type.name); - - // 确保组件类型已注册到优化器 - for (const name of componentNames) { - this.bitMaskOptimizer.registerComponentType(name); + let mask = BigInt(0); + let hasValidComponents = false; + + for (const type of componentTypes) { + try { + const bitMask = ComponentRegistry.getBitMask(type); + mask |= bitMask; + hasValidComponents = true; + } catch (error) { + console.warn(`组件类型 ${type.name} 未注册,跳过`); + } } - - return this.bitMaskOptimizer.createCombinedMask(componentNames); + + // 如果没有有效的组件类型,返回一个不可能匹配的掩码 + if (!hasValidComponents) { + return BigInt(-1); // 所有位都是1,不可能与任何实体匹配 + } + + return mask; } /** diff --git a/tests/ECS/Core/QuerySystem.test.ts b/tests/ECS/Core/QuerySystem.test.ts index 7bdce8d6..ca2d8c1c 100644 --- a/tests/ECS/Core/QuerySystem.test.ts +++ b/tests/ECS/Core/QuerySystem.test.ts @@ -260,14 +260,14 @@ describe('QuerySystem - 查询系统测试', () => { testEntities.push(entity); } - // 将实体添加到查询系统 - querySystem.setEntities([...entities, ...testEntities]); - - // 添加组件 + // 先添加组件 for (const entity of testEntities) { entity.addComponent(new PositionComponent(0, 0)); entity.addComponent(new VelocityComponent(1, 1)); } + + // 将实体添加到查询系统 + querySystem.setEntities([...entities, ...testEntities]); const startTime = performance.now(); const result = querySystem.queryAll(PositionComponent, VelocityComponent); @@ -317,10 +317,7 @@ describe('QuerySystem - 查询系统测试', () => { testEntities.push(entity); } - // 将实体添加到查询系统 - querySystem.setEntities([...entities, ...testEntities]); - - // 随机分配组件 + // 先随机分配组件 for (let i = 0; i < entityCount; i++) { const entity = testEntities[i]; @@ -338,6 +335,9 @@ describe('QuerySystem - 查询系统测试', () => { entity.addComponent(new RenderComponent(true)); } } + + // 将实体添加到查询系统 + querySystem.setEntities([...entities, ...testEntities]); const startTime = performance.now();