ManaPoolRepair 在刀架更新事件中每 tick 通过 ReflectionHelper.getPrivateValue(SlashBladeEvent.OnEntityBladeStandUpdateEvent.class, event, "entityBladeStand") 读取私有字段(ManaPoolRepair.java:35),无 Field 缓存。与 lastsmith ManaRepair 为同一根因的独立出现点(互为拷贝)。
ReflectionHelper.getPrivateValue(SlashBladeEvent.OnEntityBladeStandUpdateEvent.class, event, "entityBladeStand")
代码位置:
调用链: 刀架实体 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 热点占比,修改前后对比。
Archive 组织仓已过时(Daniel 2026-09-23),整组织 issue 统一关闭。
No dependencies set.
The note is not visible to the blocked user.
问题描述
ManaPoolRepair 在刀架更新事件中每 tick 通过
ReflectionHelper.getPrivateValue(SlashBladeEvent.OnEntityBladeStandUpdateEvent.class, event, "entityBladeStand")读取私有字段(ManaPoolRepair.java:35),无 Field 缓存。与 lastsmith ManaRepair 为同一根因的独立出现点(互为拷贝)。技术分析
代码位置:
调用链:
刀架实体 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 热点占比,修改前后对比。
Archive 组织仓已过时(Daniel 2026-09-23),整组织 issue 统一关闭。
[性能][中] ManaPoolRepair 每 tick 通过 ReflectionHelper.getPrivateValue 反射取事件私有字段(未缓存 Field)to ManaPoolRepair 每 tick 通过 ReflectionHelper.getPrivateValue 反射取事件私有字段(未缓存 Field)