ManaPoolRepair 每 tick 通过 ReflectionHelper.getPrivateValue 反射取事件私有字段(未缓存 Field) #2

Closed
opened 2026-09-08 18:47:25 +00:00 by layue13 · 1 comment
Owner

问题描述

ManaPoolRepair 在刀架更新事件中每 tick 通过 ReflectionHelper.getPrivateValue(SlashBladeEvent.OnEntityBladeStandUpdateEvent.class, event, "entityBladeStand") 读取私有字段(ManaPoolRepair.java:35),无 Field 缓存。与 lastsmith ManaRepair 为同一根因的独立出现点(互为拷贝)。

技术分析

代码位置:

  • 文件:src/main/java/mods/flammpfeil/slashblade/terra/specialeffect/ManaPoolRepair.java:32-65(反射点 :35)
  • 方法:事件监听方法

调用链:
刀架实体 onUpdate(每 tick/每刀架)
→ OnEntityBladeStandUpdateEvent 派发
→ ManaPoolRepair 监听
→ ReflectionHelper.getPrivateValue(findField 每次线性扫描)
→ 后续修复速率 1 durability/tick 的受损刀存在期间每 tick 走全路径 + tile entity 查询

影响规模

每刀架每 tick 1 次反射字段查找。50 个自动化刀架 = 1000 次 findField/秒。CPU(主线程)+ GC(反射中间对象)。规模随刀架数线性增长。

根因分析

重复计算:恒定元数据每 tick 重解析。

优化方向

static final Field 缓存一次查找结果;核对主仓事件类是否有公共访问器可直接使用。保持行为不变;不影响 Forge API/Mod API/存档/网络同步。

兼容性分析

同 lastsmith 条目。完全兼容。

验证方案

复现条件:50 个加载刀架 + 受损刀,Spark 采样;
观察:findField 热点占比,修改前后对比。

## 问题描述 ManaPoolRepair 在刀架更新事件中每 tick 通过 `ReflectionHelper.getPrivateValue(SlashBladeEvent.OnEntityBladeStandUpdateEvent.class, event, "entityBladeStand")` 读取私有字段(ManaPoolRepair.java:35),无 Field 缓存。与 lastsmith ManaRepair 为同一根因的独立出现点(互为拷贝)。 ## 技术分析 代码位置: - 文件:src/main/java/mods/flammpfeil/slashblade/terra/specialeffect/ManaPoolRepair.java:32-65(反射点 :35) - 方法:事件监听方法 调用链: 刀架实体 onUpdate(每 tick/每刀架) → OnEntityBladeStandUpdateEvent 派发 → ManaPoolRepair 监听 → ReflectionHelper.getPrivateValue(findField 每次线性扫描) → 后续修复速率 1 durability/tick 的受损刀存在期间每 tick 走全路径 + tile entity 查询 ## 影响规模 每刀架每 tick 1 次反射字段查找。50 个自动化刀架 = 1000 次 findField/秒。CPU(主线程)+ GC(反射中间对象)。规模随刀架数线性增长。 ## 根因分析 重复计算:恒定元数据每 tick 重解析。 ## 优化方向 static final Field 缓存一次查找结果;核对主仓事件类是否有公共访问器可直接使用。保持行为不变;不影响 Forge API/Mod API/存档/网络同步。 ## 兼容性分析 同 lastsmith 条目。完全兼容。 ## 验证方案 复现条件:50 个加载刀架 + 受损刀,Spark 采样; 观察:findField 热点占比,修改前后对比。
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:44 +00:00
layue13 changed title from [性能][中] ManaPoolRepair 每 tick 通过 ReflectionHelper.getPrivateValue 反射取事件私有字段(未缓存 Field) to ManaPoolRepair 每 tick 通过 ReflectionHelper.getPrivateValue 反射取事件私有字段(未缓存 Field) 2026-10-06 21:07:44 +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-terra#2