HS_basic 与 HS_advance 的 onUpdateItemSlashBlade 挂在 SlashBlade 的 OnUpdateEvent(持刀玩家每 tick 触发):即使特效处于 NonEffective 分支也在每 tick new PotionEffect(...) 分配并调用 addPotionEffect(HS_basic.java:47-59、HS_advance.java:47-60),效果时长 25-100 tick 远大于重复应用间隔,等于每 tick 无效重复写入药效映射;NonEffective 分支还有 player.getRNG().nextInt(4) == 0 每tick随机。单次成本低(对象分配 + potion map 写入),持刀即持续触发,列低危。 SAslashdimension_ex 的 AABB 实体扫描仅在 SA 使用瞬间(getEntityToWatch 逐步扩 2 格采样至 20 格)执行,非每 tick,不计。
onUpdateItemSlashBlade
new PotionEffect(...)
addPotionEffect
player.getRNG().nextInt(4) == 0
src/main/java/net/lrsoft/foxbladeex/hypersystem/HS_basic.java:35-60 src/main/java/net/lrsoft/foxbladeex/hypersystem/HS_advance.java:38-62
@SubscribeEvent public void onUpdateItemSlashBlade(SlashBladeEvent.OnUpdateEvent event) { // 每 tick ... case NonEffective: { if (player.getRNG().nextInt(4) == 0) break; player.addPotionEffect(new PotionEffect(Potion.moveSpeed.getId(), 80, 2)); // 每 tick 分配 return; } case Effective: { player.addPotionEffect(new PotionEffect(Potion.moveSpeed.getId(), 100, 3)); // 每 tick 重复 player.addPotionEffect(new PotionEffect(Potion.regeneration.getId(), 100, 3)); player.addPotionEffect(new PotionEffect(Potion.digSpeed.getId(), 100, 3));
SlashBladeEvent.OnUpdateEvent(每持刀玩家每 tick)
已修复:ba38c1d(main)。
ba38c1d
改动:HS_basic / HS_advance 的药效施加改为 applyIfExpiring 按需模式——仅当目标药效缺失或剩余时长 ≤ min(25, duration/4) 时才 new PotionEffect 并 addPotionEffect。效果覆盖时长与逐 tick 刷新完全一致(等效持续),但分配与 activePotions Map 合并从每 tick 1-3 次降为每个效果到期边界一次。
applyIfExpiring
new PotionEffect
activePotions
player.getRNG() 每 tick 随机保留(NonEffective 概率判定语义)。
player.getRNG()
SAslashdimension_ex 的 AABB 扫描为 SA 瞬间一次性执行,与 issue 结论一致不计。
验证:gradle build 通过(JDK25)。
gradle build
No dependencies set.
The note is not visible to the blocked user.
问题描述
HS_basic 与 HS_advance 的
onUpdateItemSlashBlade挂在 SlashBlade 的 OnUpdateEvent(持刀玩家每 tick 触发):即使特效处于 NonEffective 分支也在每 ticknew PotionEffect(...)分配并调用addPotionEffect(HS_basic.java:47-59、HS_advance.java:47-60),效果时长 25-100 tick 远大于重复应用间隔,等于每 tick 无效重复写入药效映射;NonEffective 分支还有player.getRNG().nextInt(4) == 0每tick随机。单次成本低(对象分配 + potion map 写入),持刀即持续触发,列低危。SAslashdimension_ex 的 AABB 实体扫描仅在 SA 使用瞬间(getEntityToWatch 逐步扩 2 格采样至 20 格)执行,非每 tick,不计。
代码位置
src/main/java/net/lrsoft/foxbladeex/hypersystem/HS_basic.java:35-60
src/main/java/net/lrsoft/foxbladeex/hypersystem/HS_advance.java:38-62
问题代码
热路径
SlashBladeEvent.OnUpdateEvent(每持刀玩家每 tick)
已修复:
ba38c1d(main)。改动:HS_basic / HS_advance 的药效施加改为
applyIfExpiring按需模式——仅当目标药效缺失或剩余时长 ≤ min(25, duration/4) 时才new PotionEffect并addPotionEffect。效果覆盖时长与逐 tick 刷新完全一致(等效持续),但分配与activePotionsMap 合并从每 tick 1-3 次降为每个效果到期边界一次。player.getRNG()每 tick 随机保留(NonEffective 概率判定语义)。SAslashdimension_ex 的 AABB 扫描为 SA 瞬间一次性执行,与 issue 结论一致不计。
验证:
gradle build通过(JDK25)。[性能][低] 低危杂项清单:HS 特效每 tick 重复分配 PotionEffect 并 addPotionEffect(持刀即持续触发)to 低危杂项清单:HS 特效每 tick 重复分配 PotionEffect 并 addPotionEffect(持刀即持续触发)