diff --git a/extensions/cocos/cocos-ecs/extensions/cocos-terrain-gen b/extensions/cocos/cocos-ecs/extensions/cocos-terrain-gen index 8ebcce72..eff68e89 160000 --- a/extensions/cocos/cocos-ecs/extensions/cocos-terrain-gen +++ b/extensions/cocos/cocos-ecs/extensions/cocos-terrain-gen @@ -1 +1 @@ -Subproject commit 8ebcce722a0889197fe006012d214178dd2a4e49 +Subproject commit eff68e895a6c607df4c38be5c66a5914256d7fff diff --git a/package-lock.json b/package-lock.json index 09c20e58..7c375940 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@esengine/ecs-framework", - "version": "2.1.24", + "version": "2.1.25", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@esengine/ecs-framework", - "version": "2.1.24", + "version": "2.1.25", "license": "MIT", "dependencies": { "@types/multer": "^1.4.13", diff --git a/package.json b/package.json index 75172aca..bf72421f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@esengine/ecs-framework", - "version": "2.1.24", + "version": "2.1.25", "description": "用于Laya、Cocos Creator等JavaScript游戏引擎的高性能ECS框架", "main": "bin/index.js", "types": "bin/index.d.ts", diff --git a/src/ECS/Core/QuerySystem.ts b/src/ECS/Core/QuerySystem.ts index d7924233..be983988 100644 --- a/src/ECS/Core/QuerySystem.ts +++ b/src/ECS/Core/QuerySystem.ts @@ -421,25 +421,34 @@ export class QuerySystem { }; } - let entities: Entity[]; + let entities: Entity[] = []; const archetypeResult = this.archetypeSystem.queryArchetypes(componentTypes, 'AND'); if (archetypeResult.archetypes.length > 0) { this.queryStats.archetypeHits++; - entities = []; for (const archetype of archetypeResult.archetypes) { entities.push(...archetype.entities); } - } else if (componentTypes.length === 1) { - this.queryStats.indexHits++; - const indexResult = this.componentIndexManager.query(componentTypes[0]); - entities = Array.from(indexResult); } else { - const indexResult = this.componentIndexManager.queryMultiple(componentTypes, 'AND'); - entities = Array.from(indexResult); + try { + if (componentTypes.length === 1) { + this.queryStats.indexHits++; + const indexResult = this.componentIndexManager.query(componentTypes[0]); + entities = Array.from(indexResult); + } else { + const indexResult = this.componentIndexManager.queryMultiple(componentTypes, 'AND'); + entities = Array.from(indexResult); + } + } catch (error) { + entities = []; + } + } + + if (entities.length === 0 && this.entities.length > 0) { + this.queryStats.linearScans++; + entities = this.queryByLinearScan(componentTypes); } - // 缓存结果 this.addToCache(cacheKey, entities); return {