长话短说,这种优化思路依然适用,但 Forge/NeoForge 不允许模组修改 EventBus。
与来自 Minecraft 或 Forge 本体的类不同,EventBus 并不是作为游戏的一部分加载的,而是作为“library”加载,这使得无法通过 Mixin 或 Transformer 修改 EventBus。
在 1.2.0 中,为了进一步提升性能,我使用了一些脏技巧(或者如果你愿意的话,也可以称为“非标准方法”)来修改 ASMEventHandler 类,但遗憾的是,这种方法在 1.18.2+ 中已经失效。这些版本现已归档,且很可能不会再收到后续更新。
是一个 Forge/Neoforge 优化模组,用于优化 Forge 中最基础的系统之一:事件系统。
要为每个支持的 Minecraft 版本都制作测试用例并不容易,尤其是这些版本的事件系统彼此之间还不相同。因此,我改为提供一份来自我为 Cleanroom 项目提交的 PR 中的 JMH 基准测试报告,其中使用了与 FastEvent 相同的优化思路:
Benchmark Mode Cnt Score Error Units
BusPerformanceTest.register10000Legacy avgt 5 1126.498 ± 284.633 ms/op
BusPerformanceTest.register10000Modern avgt 5 1058.961 ± 173.586 ms/op
快约 6.4%。
Benchmark Mode Cnt Score Error Units
BusPerformanceTest.register1000test10000Legacy avgt 5 4407.963 ± 4250.643 ms/op
BusPerformanceTest.register1000test10000Modern avgt 5 3550.578 ± 1991.352 ms/op
快约 24%。
https://github.com/CleanroomMC/Cleanroom/pull/328#issuecomment-2801099504
(技术宅细节警告)
当开发者使用 @EventBusSubscriber 和/或 @SubscribeEvent 来订阅事件处理器时,EventBus 并不能神奇地直接拿到事件处理器,它实际能拿到的只有一个 Method 对象。所以最直接的做法,就是直接使用这个对象:method.invoke(...)。这个调用最终会被 JVM 重定向回原始方法,从而使事件处理器在订阅后能够接收到事件。
但这个(method.invoke(...))真的很慢。为了让它更快,EventBus 会在运行时为它找到的每个方法生成事件处理器类,从而消除基于反射调用带来的高开销。
但生成类本身又引入了另一种性能损耗。为了进一步加速,FastEvent 用 lambda 构造替代了类生成,从而加快事件处理器的构造速度。另一个好处是,lambda 是“隐藏的”,这让 JVM 能够执行更多优化。
如果你恰好懂一点 Java,下面的代码示例对你来说可能会更直观:
class Listen {
public void onEvent(Event event) {
}
}
Listen lis = new Listen();
// EventBus 会为每个事件处理器生成一个新类
class IEventListener$Listen$onEvent implements IEventListener {
private Listen instance;
public IEventListener$Listen$onEvent(Listen instance) {
this.instance = instance;
}
@Override
public void invoke(Event event) {
instance.onEvent(event);
}
}
IEventListener handler = new IEventListener$Listen$onEvent(lis);
// FastEvent 使用 lambda 生成事件处理器
IEventListener handler = lis::onEvent; 友情链接: 网易我的世界 | 泰拉瑞亚 | ocent云计算 | 米饭Minecraft插件文档 | 友链合作
历史访问人数:211,667 | 历史访问人次:320,073
今日访问人数:18,565 | 今日访问人次:21,824
昨日访问人数:30,537 | 昨日访问人次:36,142
Copyright © 2019-2026 我的世界服务器列表站. All rights reserved.
❤ Powered by GermMC 京ICP备17023959号-6