低危杂项清单:HS 特效每 tick 重复分配 PotionEffect 并 addPotionEffect(持刀即持续触发) #1

Closed
opened 2026-09-03 16:48:01 +00:00 by layue13 · 1 comment
Owner

问题描述

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,不计。

代码位置

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)

### 问题描述 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,不计。 ### 代码位置 src/main/java/net/lrsoft/foxbladeex/hypersystem/HS_basic.java:35-60 src/main/java/net/lrsoft/foxbladeex/hypersystem/HS_advance.java:38-62 ### 问题代码 ```java @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)
Author
Owner

已修复:ba38c1d(main)。

改动:HS_basic / HS_advance 的药效施加改为 applyIfExpiring 按需模式——仅当目标药效缺失或剩余时长 ≤ min(25, duration/4) 时才 new PotionEffect 并 addPotionEffect。效果覆盖时长与逐 tick 刷新完全一致(等效持续),但分配与 activePotions Map 合并从每 tick 1-3 次降为每个效果到期边界一次。

player.getRNG() 每 tick 随机保留(NonEffective 概率判定语义)。

SAslashdimension_ex 的 AABB 扫描为 SA 瞬间一次性执行,与 issue 结论一致不计。

验证:gradle build 通过(JDK25)。

已修复:`ba38c1d`(main)。 **改动**:HS_basic / HS_advance 的药效施加改为 `applyIfExpiring` 按需模式——仅当目标药效缺失或剩余时长 ≤ min(25, duration/4) 时才 `new PotionEffect` 并 `addPotionEffect`。效果覆盖时长与逐 tick 刷新完全一致(等效持续),但分配与 `activePotions` Map 合并从每 tick 1-3 次降为每个效果到期边界一次。 `player.getRNG()` 每 tick 随机保留(NonEffective 概率判定语义)。 SAslashdimension_ex 的 AABB 扫描为 SA 瞬间一次性执行,与 issue 结论一致不计。 **验证**:`gradle build` 通过(JDK25)。
layue13 added the
type
perf
priority
p3
labels 2026-10-06 21:07:43 +00:00
layue13 changed title from [性能][低] 低危杂项清单:HS 特效每 tick 重复分配 PotionEffect 并 addPotionEffect(持刀即持续触发) to 低危杂项清单:HS 特效每 tick 重复分配 PotionEffect 并 addPotionEffect(持刀即持续触发) 2026-10-06 21:07:43 +00:00
This repo is archived. You cannot comment on issues.
No labels
priority
p3
type
perf
1 Participants
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: Archive/slashblade-foxex#1