From 52528ff1b740545b563370c833007ae2caf9205a Mon Sep 17 00:00:00 2001 From: YHH <359807859@qq.com> Date: Tue, 29 Jul 2025 10:58:31 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8Dquerysystem=E7=9A=84rebuildin?= =?UTF-8?q?dex=E6=96=B9=E6=B3=95=20=E4=BF=AE=E5=A4=8D=E4=BD=8D=E6=8E=A9?= =?UTF-8?q?=E7=A0=81=E4=B8=8D=E4=B8=80=E8=87=B4=E9=97=AE=E9=A2=98=20?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=9C=AA=E6=B3=A8=E5=86=8C=E7=BB=84=E4=BB=B6?= =?UTF-8?q?=E7=9A=84=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ECS/Core/QuerySystem.ts | 32 ++++++++++++++++++++++-------- tests/ECS/Core/QuerySystem.test.ts | 16 +++++++-------- 2 files changed, 32 insertions(+), 16 deletions(-) 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();