Drive/SlashDimension/Summoned 弹体每 tick 双 getEntitiesWithinAABBExcludingEntity 扫描 + 线性去重(4 类弹体) #1

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

问题描述

EntityDriveAdd / EntitySlashDimensionAdd / EntitySummonedButterfly / EntitySummonedSwordAdd 的 onUpdate 与 balumg 的 Drive 弹体同类问题:每弹体每 tick 各执行 2 次 getEntitiesWithinAABBExcludingEntity(DestructableSelector 无条件 + AttackableSelector 在 multiHit/偶数 tick),返回列表再做 removeAll(alreadyHitEntity)(ArrayList.contains 线性去重,O(命中数×已命中数))。与 SlashBlade-MoreSA 的 EntityDrive 雷同。不同点:本仓库 DriveAdd 还在 onUpdate 顶部每 tick 调用 new Date().getTime() 做存活计时(分配 Date 相关对象 + 墙钟计时而非 ticksExisted)。4 类弹体在剑技齐发时数量成倍,密集场景下扫描成本显著。

代码位置

src/main/java/com/moe/allweapon/Entityadd/EntityDriveAdd.java:244-300(onUpdate:245 每tick new Date 计时、262/298 双扫描)
src/main/java/com/moe/allweapon/Entityadd/EntitySlashDimensionAdd.java:176-225(185/221 双扫描)
src/main/java/com/moe/allweapon/Entityadd/EntitySummonedButterfly.java:599-628、227、420
src/main/java/com/moe/allweapon/Entityadd/EntitySummonedSwordAdd.java:598-628、226、419

问题代码

// EntityDriveAdd.onUpdate:每 tick 墙钟计时 + 双 AABB 扫描
long time = new Date().getTime();
long time_2 = (time - this.startTime) / 1000L;
...
List list = this.worldObj.getEntitiesWithinAABBExcludingEntity(
        this.getThrower(), bb, ItemSlashBlade.DestructableSelector);
list.removeAll(this.alreadyHitEntity);
...
List list = this.worldObj.getEntitiesWithinAABBExcludingEntity(
        this.getThrower(), bb, ItemSlashBlade.AttackableSelector);
list.removeAll(this.alreadyHitEntity);

热路径

EntityDriveAdd/EntitySlashDimensionAdd/EntitySummonedButterfly/EntitySummonedSwordAdd.onUpdate(服务端每 tick,每个飞行弹体)

### 问题描述 EntityDriveAdd / EntitySlashDimensionAdd / EntitySummonedButterfly / EntitySummonedSwordAdd 的 onUpdate 与 balumg 的 Drive 弹体同类问题:每弹体每 tick 各执行 2 次 `getEntitiesWithinAABBExcludingEntity`(DestructableSelector 无条件 + AttackableSelector 在 multiHit/偶数 tick),返回列表再做 `removeAll(alreadyHitEntity)`(ArrayList.contains 线性去重,O(命中数×已命中数))。与 SlashBlade-MoreSA 的 EntityDrive 雷同。不同点:本仓库 DriveAdd 还在 onUpdate 顶部每 tick 调用 `new Date().getTime()` 做存活计时(分配 Date 相关对象 + 墙钟计时而非 ticksExisted)。4 类弹体在剑技齐发时数量成倍,密集场景下扫描成本显著。 ### 代码位置 src/main/java/com/moe/allweapon/Entityadd/EntityDriveAdd.java:244-300(onUpdate:245 每tick new Date 计时、262/298 双扫描) src/main/java/com/moe/allweapon/Entityadd/EntitySlashDimensionAdd.java:176-225(185/221 双扫描) src/main/java/com/moe/allweapon/Entityadd/EntitySummonedButterfly.java:599-628、227、420 src/main/java/com/moe/allweapon/Entityadd/EntitySummonedSwordAdd.java:598-628、226、419 ### 问题代码 ```java // EntityDriveAdd.onUpdate:每 tick 墙钟计时 + 双 AABB 扫描 long time = new Date().getTime(); long time_2 = (time - this.startTime) / 1000L; ... List list = this.worldObj.getEntitiesWithinAABBExcludingEntity( this.getThrower(), bb, ItemSlashBlade.DestructableSelector); list.removeAll(this.alreadyHitEntity); ... List list = this.worldObj.getEntitiesWithinAABBExcludingEntity( this.getThrower(), bb, ItemSlashBlade.AttackableSelector); list.removeAll(this.alreadyHitEntity); ``` ### 热路径 EntityDriveAdd/EntitySlashDimensionAdd/EntitySummonedButterfly/EntitySummonedSwordAdd.onUpdate(服务端每 tick,每个飞行弹体)
Author
Owner

主线验收后已推送:c3284030a3764cd418e450948365f495a93bbfc4(perf(slashblade-allweapon): 加速弹体命中去重)。

EntityDriveAdd、EntitySlashDimensionAdd、EntitySummonedButterfly 与 EntitySummonedSwordAdd 的 alreadyHitEntity 已由 ArrayList 改为 HashSet。该集合只用于 clear、add、addAll 和 removeAll 成员排除,未发现迭代、顺序或重复值依赖;因此保留所有命中、攻击、冷却和 selector 调用顺序,同时使扫描结果的已命中过滤不再线性查找。

验证:主线以 Java 25 + Gradle 9.4.0 执行 build --no-daemon --console=plain 成功(test 为 NO-SOURCE)。

保持开放:DestructableSelector 与 AttackableSelector 的两次 AABB 查询筛选集与后处理不同,不能在不改变目标/伤害语义下直接合并;EntityDriveAdd 的墙钟生命周期改为 ticksExisted 也会改变卡顿条件下的存活语义。


Generated by Codex with GPT-5

主线验收后已推送:c3284030a3764cd418e450948365f495a93bbfc4(perf(slashblade-allweapon): 加速弹体命中去重)。 EntityDriveAdd、EntitySlashDimensionAdd、EntitySummonedButterfly 与 EntitySummonedSwordAdd 的 alreadyHitEntity 已由 ArrayList 改为 HashSet。该集合只用于 clear、add、addAll 和 removeAll 成员排除,未发现迭代、顺序或重复值依赖;因此保留所有命中、攻击、冷却和 selector 调用顺序,同时使扫描结果的已命中过滤不再线性查找。 验证:主线以 Java 25 + Gradle 9.4.0 执行 build --no-daemon --console=plain 成功(test 为 NO-SOURCE)。 保持开放:DestructableSelector 与 AttackableSelector 的两次 AABB 查询筛选集与后处理不同,不能在不改变目标/伤害语义下直接合并;EntityDriveAdd 的墙钟生命周期改为 ticksExisted 也会改变卡顿条件下的存活语义。 --- 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:42 +00:00
layue13 changed title from [性能][中] Drive/SlashDimension/Summoned 弹体每 tick 双 getEntitiesWithinAABBExcludingEntity 扫描 + 线性去重(4 类弹体) to Drive/SlashDimension/Summoned 弹体每 tick 双 getEntitiesWithinAABBExcludingEntity 扫描 + 线性去重(4 类弹体) 2026-10-06 21:07:42 +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-allweapon#1