5 类弹体实体每 tick 双 getEntitiesWithinAABBExcludingEntity 扫描 + 线性去重(DriveEx/Flare/Hurricane/Lightning/Phantom) #1

Closed
opened 2026-09-03 16:47:18 +00:00 by layue13 · 2 comments
Owner

问题描述

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

问题代码

// 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,每个飞行弹体)

### 问题描述 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 ### 问题代码 ```java // 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,每个飞行弹体)
Author
Owner

主线验收后已推送: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

主线验收后已推送: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
Author
Owner

Archive 组织仓已过时(Daniel 2026-09-23),整组织 issue 统一关闭。

Archive 组织仓已过时(Daniel 2026-09-23),整组织 issue 统一关闭。
layue13 added the
type
perf
priority
p2
labels 2026-10-06 21:07:43 +00:00
layue13 changed title from [性能][中] 5 类弹体实体每 tick 双 getEntitiesWithinAABBExcludingEntity 扫描 + 线性去重(DriveEx/Flare/Hurricane/Lightning/Phantom) to 5 类弹体实体每 tick 双 getEntitiesWithinAABBExcludingEntity 扫描 + 线性去重(DriveEx/Flare/Hurricane/Lightning/Phantom) 2026-10-06 21:07:43 +00:00
This repo is archived. You cannot comment on issues.
No labels
priority
p2
type
perf
1 Participants
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: Archive/slashblade-exsa#1