修复querysystem的rebuildindex方法

修复位掩码不一致问题
修复未注册组件的处理
This commit is contained in:
YHH
2025-07-29 10:58:31 +08:00
parent 4a9317f3f4
commit 52528ff1b7
2 changed files with 32 additions and 16 deletions

View File

@@ -378,9 +378,15 @@ export class QuerySystem {
this.entityIndex.byComponentType.clear(); this.entityIndex.byComponentType.clear();
this.entityIndex.byTag.clear(); this.entityIndex.byTag.clear();
this.entityIndex.byName.clear(); this.entityIndex.byName.clear();
// 清理ArchetypeSystem和ComponentIndexManager
this.archetypeSystem.clear();
this.componentIndexManager.clear();
for (const entity of this.entities) { for (const entity of this.entities) {
this.addEntityToIndexes(entity); this.addEntityToIndexes(entity);
this.componentIndexManager.addEntity(entity);
this.archetypeSystem.addEntity(entity);
} }
this.indexDirty = false; this.indexDirty = false;
@@ -897,15 +903,25 @@ export class QuerySystem {
* @returns 生成的位掩码 * @returns 生成的位掩码
*/ */
private createComponentMask(componentTypes: ComponentType[]): bigint { private createComponentMask(componentTypes: ComponentType[]): bigint {
// 使用位掩码优化器创建掩码 let mask = BigInt(0);
const componentNames = componentTypes.map(type => type.name); let hasValidComponents = false;
// 确保组件类型已注册到优化器 for (const type of componentTypes) {
for (const name of componentNames) { try {
this.bitMaskOptimizer.registerComponentType(name); 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;
} }
/** /**

View File

@@ -260,14 +260,14 @@ describe('QuerySystem - 查询系统测试', () => {
testEntities.push(entity); testEntities.push(entity);
} }
// 将实体添加到查询系统 // 先添加组件
querySystem.setEntities([...entities, ...testEntities]);
// 添加组件
for (const entity of testEntities) { for (const entity of testEntities) {
entity.addComponent(new PositionComponent(0, 0)); entity.addComponent(new PositionComponent(0, 0));
entity.addComponent(new VelocityComponent(1, 1)); entity.addComponent(new VelocityComponent(1, 1));
} }
// 将实体添加到查询系统
querySystem.setEntities([...entities, ...testEntities]);
const startTime = performance.now(); const startTime = performance.now();
const result = querySystem.queryAll(PositionComponent, VelocityComponent); const result = querySystem.queryAll(PositionComponent, VelocityComponent);
@@ -317,10 +317,7 @@ describe('QuerySystem - 查询系统测试', () => {
testEntities.push(entity); testEntities.push(entity);
} }
// 将实体添加到查询系统 // 先随机分配组件
querySystem.setEntities([...entities, ...testEntities]);
// 随机分配组件
for (let i = 0; i < entityCount; i++) { for (let i = 0; i < entityCount; i++) {
const entity = testEntities[i]; const entity = testEntities[i];
@@ -338,6 +335,9 @@ describe('QuerySystem - 查询系统测试', () => {
entity.addComponent(new RenderComponent(true)); entity.addComponent(new RenderComponent(true));
} }
} }
// 将实体添加到查询系统
querySystem.setEntities([...entities, ...testEntities]);
const startTime = performance.now(); const startTime = performance.now();