McLists一周年快乐
服务器已经添加了详细介绍信息板块
服主可以在管理后台来提交自己服务器介绍信息。
服务器介绍信息提交后,管理人员会进行审核
审核通过后会在服务器详细页面进行显示
提交服务器介绍信息会让新玩家更好的了解你的服务器哦~
添加图片信息,也会让百度等搜索引擎更好的收录您的服务器哦~
管理平台地址:传送门
FastEvent

FastEvent - FastEvent 快速事件

加速 Forge/NeoForge 中的事件系统
forge / neoforge 作者 ZZZank 支持版本 1.16.5 - 1.21.1
下载量
1,067,651
关注数
24
数据来源
Modrinth
模组详细介绍

项目已弃用

长话短说,这种优化思路依然适用,但 Forge/NeoForge 不允许模组修改 EventBus。

与来自 Minecraft 或 Forge 本体的类不同,EventBus 并不是作为游戏的一部分加载的,而是作为“library”加载,这使得无法通过 Mixin 或 Transformer 修改 EventBus。

在 1.2.0 中,为了进一步提升性能,我使用了一些脏技巧(或者如果你愿意的话,也可以称为“非标准方法”)来修改 ASMEventHandler 类,但遗憾的是,这种方法在 1.18.2+ 中已经失效。这些版本现已归档,且很可能不会再收到后续更新。

FastEvent

是一个 Forge/Neoforge 优化模组,用于优化 Forge 中最基础的系统之一:事件系统。

有多快

要为每个支持的 Minecraft 版本都制作测试用例并不容易,尤其是这些版本的事件系统彼此之间还不相同。因此,我改为提供一份来自我为 Cleanroom 项目提交的 PR 中的 JMH 基准测试报告,其中使用了与 FastEvent 相同的优化思路:

注册 10,000 个事件监听器,发布事件 0 次:

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%。

注册 1,000 个事件监听器,发布事件 10,000 次:

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%。

原始 PR

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;
基本信息
模组名称FastEvent
作者ZZZank
下载量1,067,651
关注数24
支持版本1.16.5 - 1.21.1
加载器forge / neoforge
客户端optional
服务端optional

友情链接: 网易我的世界 | 泰拉瑞亚 | 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