5 个弹体实体类(EntityDriveEx、EntityFlareSword、EntityHurricaneSword、EntityLightningSword、EntityPhantomSwordEx)均继承同一模式:onUpdate 每 tick 无条件执行 DestructableSelector 的 getEntitiesWithinAABBExcludingEntity,且 multiHit/偶数 tick 时再执行一次 AttackableSelector 扫描(EntityDriveEx.java:228,264;EntityFlareSword.java:94,130;EntityHurricaneSword.java:84,121;EntityLightningSword.java:84,121;EntityPhantomSwordEx.java:159,196),随后 removeAll(alreadyHitEntity) 做线性去重。剑技齐发时同屏弹体可达数十个,每弹体每 tick 2 次区块实体扫描 + 线性去重,与 SlashBlade-MoreSA 的 EntityDrive 问题雷同。EntityNoFireLightningBolt(:93)另有每 tick 一次 7×6×7 边界盒查询。
getEntitiesWithinAABBExcludingEntity
removeAll(alreadyHitEntity)
src/main/java/mods/flammpfeil/slashblade/exsa/entity/EntityDriveEx.java:228,264 src/main/java/mods/flammpfeil/slashblade/exsa/entity/EntityFlareSword.java:94,130 src/main/java/mods/flammpfeil/slashblade/exsa/entity/EntityHurricaneSword.java:84,121 src/main/java/mods/flammpfeil/slashblade/exsa/entity/EntityLightningSword.java:84,121 src/main/java/mods/flammpfeil/slashblade/exsa/entity/EntityPhantomSwordEx.java:159,196 src/main/java/mods/flammpfeil/slashblade/exsa/entity/EntityNoFireLightningBolt.java:93
// EntityDriveEx.onUpdate(其余 4 类同构) List<Entity> list = this.worldObj.getEntitiesWithinAABBExcludingEntity( this.getThrower(), bb, ItemSlashBlade.DestructableSelector); // 每 tick 无条件 list.removeAll(this.alreadyHitEntity); // List.contains 线性去重 ... List<Entity> list = this.worldObj.getEntitiesWithinAABBExcludingEntity( this.getThrower(), bb, ItemSlashBlade.AttackableSelector); // multiHit/偶数 tick 再扫一次
各弹体实体 onUpdate(服务端每 tick,每个飞行弹体)
主线验收后已推送:67fd40011a53c611eca7c762d42407667d291419(perf(slashblade-exsa): 加速飞剑已命中目标过滤)。
EntityDriveEx 的 alreadyHitEntity 已由 ArrayList 改为 HashSet。EntityPhantomSwordEx、EntityFlareSword、EntityHurricaneSword 和 EntityLightningSword 继承同一集合;全局使用仅有 clear、add、addAll 与扫描结果的 removeAll,未依赖集合迭代、顺序或重复值。候选列表和 selector 调用保持原样,因而仅加速历史命中成员过滤。
验证:主线以 Java 8 + Gradle 8.14.3 执行 build --rerun-tasks --no-daemon --console=plain 成功(test 为 NO-SOURCE)。
保持开放:五类实体的 DestructableSelector 与 AttackableSelector AABB 扫描依然保留,二者筛选语义和命中后处理不同;本提交未声称合并或消除这些范围扫描。
Generated by Codex with GPT-5
Archive 组织仓已过时(Daniel 2026-09-23),整组织 issue 统一关闭。
No dependencies set.
The note is not visible to the blocked user.
问题描述
5 个弹体实体类(EntityDriveEx、EntityFlareSword、EntityHurricaneSword、EntityLightningSword、EntityPhantomSwordEx)均继承同一模式:onUpdate 每 tick 无条件执行 DestructableSelector 的
getEntitiesWithinAABBExcludingEntity,且 multiHit/偶数 tick 时再执行一次 AttackableSelector 扫描(EntityDriveEx.java:228,264;EntityFlareSword.java:94,130;EntityHurricaneSword.java:84,121;EntityLightningSword.java:84,121;EntityPhantomSwordEx.java:159,196),随后removeAll(alreadyHitEntity)做线性去重。剑技齐发时同屏弹体可达数十个,每弹体每 tick 2 次区块实体扫描 + 线性去重,与 SlashBlade-MoreSA 的 EntityDrive 问题雷同。EntityNoFireLightningBolt(:93)另有每 tick 一次 7×6×7 边界盒查询。代码位置
src/main/java/mods/flammpfeil/slashblade/exsa/entity/EntityDriveEx.java:228,264
src/main/java/mods/flammpfeil/slashblade/exsa/entity/EntityFlareSword.java:94,130
src/main/java/mods/flammpfeil/slashblade/exsa/entity/EntityHurricaneSword.java:84,121
src/main/java/mods/flammpfeil/slashblade/exsa/entity/EntityLightningSword.java:84,121
src/main/java/mods/flammpfeil/slashblade/exsa/entity/EntityPhantomSwordEx.java:159,196
src/main/java/mods/flammpfeil/slashblade/exsa/entity/EntityNoFireLightningBolt.java:93
问题代码
热路径
各弹体实体 onUpdate(服务端每 tick,每个飞行弹体)
主线验收后已推送:67fd40011a53c611eca7c762d42407667d291419(perf(slashblade-exsa): 加速飞剑已命中目标过滤)。
EntityDriveEx 的 alreadyHitEntity 已由 ArrayList 改为 HashSet。EntityPhantomSwordEx、EntityFlareSword、EntityHurricaneSword 和 EntityLightningSword 继承同一集合;全局使用仅有 clear、add、addAll 与扫描结果的 removeAll,未依赖集合迭代、顺序或重复值。候选列表和 selector 调用保持原样,因而仅加速历史命中成员过滤。
验证:主线以 Java 8 + Gradle 8.14.3 执行 build --rerun-tasks --no-daemon --console=plain 成功(test 为 NO-SOURCE)。
保持开放:五类实体的 DestructableSelector 与 AttackableSelector AABB 扫描依然保留,二者筛选语义和命中后处理不同;本提交未声称合并或消除这些范围扫描。
Generated by Codex with GPT-5
Archive 组织仓已过时(Daniel 2026-09-23),整组织 issue 统一关闭。
[性能][中] 5 类弹体实体每 tick 双 getEntitiesWithinAABBExcludingEntity 扫描 + 线性去重(DriveEx/Flare/Hurricane/Lightning/Phantom)to 5 类弹体实体每 tick 双 getEntitiesWithinAABBExcludingEntity 扫描 + 线性去重(DriveEx/Flare/Hurricane/Lightning/Phantom)