将 JEI 原料筛选构建速度提升 15 倍,大幅减少大型模组服务器加入世界时的等待时间。
JEIOptimizer 并行构建 JEI 的食材过滤索引——在大型整合包中将服务器加入时间缩短多达 17 秒。 故事 我和朋友们在一个私有的 AllTheMods 服务器上游玩。每次断线、每次重启、每次“我去拿点零食”,都意味着要盯着 "正在加入世界..." 看 40 秒钟,而其他人已经在挖矿了。 我受够了。与其玩游戏,我花了一个周末研究 JEI 的源代码。这个模组就是由此诞生的。 它能做什么 当你连接到模组服务器时,JEI 会从头重建其整个物品搜索索引——因为服务器可能会提供自定义配方。在包含约 50,000 个物品的 250 个模组的整合包中,这需要 在主线程上超过 12 秒 。你的客户端只是卡住不动。 JEIOptimizer 将 JEI 的 IngredientFilter 构建过程并行化到工作线程中。每个搜索前缀(物品名称、模组 ID、标签、工具提示等)都有自己独立的线程,在独立的数据结构上运行——无竞争、无竞态条件、无风险。 实际测量数据 在 250+ 模组的整合包上测试(AE2、Mekanism、Create、Cobblemon、Apotheosis、AllTheCompressed 等)。Ryzen 5600X · 10 个工作线程 · NVMe SSD · 分配 8 GB 内存 · 远程服务器(Hetzner 数据中心)。 阶段 原版 JEI + JEIOptimizer 减少量 构建食材过滤索引 12.00 秒 0.79 秒 −94%(快 15 倍) 启动 JEI 总计 25.84 秒 14.17 秒 −45% 总连接时间 约 40 秒 约 23 秒 −42%(−17 秒) 结合下面的额外优化调整(见 再省 8 秒 ),你可以稳定地将服务器连接时间从 40 秒降至约 23 秒 。 工作原理(技术细节) JEI 的 IngredientFilter 构建一个搜索索引,其中每个 "前缀"(名称、modId、标签、工具提示等)都有自己独立的 GeneralizedSuffixTree 。独立的结构 → 可以安全地并行构建。 原版 JEI: for each ingredient (50,000): for each prefix (7-10): compute tokens → insert into suffix tree 一个线程 = 约 12 秒。 JEIOptimizer: parallelStream over prefixes: for each ingredient: compute tokens → insert into own suffix tree 6-10 个核心同时处理 7-10 个前缀 = 约 0.8 秒。 配置中的过滤模式 OFF — 原版 JEI 行为 BATCH — 小型缓存友好型改进,单线程 PARALLEL_PREFIX — 按前缀并行构建(安全) PARALLEL_FULL — 还并行化前缀内的分词过程( 默认值,最快 ) 再省 8 秒(手动 JEI 调整) 在 " config/jei/jei-client.ini ,更改: tooltipSearchMode = DISABLED JEI 索引每个连接上所有物品的提示文本。一些模组在渲染提示时会进行大量的 I/O 操作——白白消耗了原本 12 秒中的约 8 秒。玩家几乎总是通过名称搜索,而不是提示文本。 如果玩家希望使用提示文本搜索,请改用 #prefix 而不是 REQUIRE_PREFIX 。 配置 config/jeioptimizer-client.toml (自动生成): [filter] mode = "PARALLEL_FULL" # Default. Safe, fastest. async = false # Experimental: build in background log_timing = true # Log timings for verification worker_count = 0 # 0 = auto (cores - 2) [plugins] parallel_phases = [] # Experimental — see below parallel_creative_tabs = false # Experimental — see below 开箱即用的安全默认值。 只需将 jar 文件放入,即可轻松获胜。无需触碰任何配置。 兼容性 Minecraft: 1.21.1 模组加载器: NeoForge 21.x JEI: 19.x(1.21.1 构建版) 侧边: 仅客户端——无需安装服务器端 此模组不会加速的内容 诚实地说明范围: 游戏启动(模组构建、模型烘焙、资源包重载) 服务器数据同步(配方、标签、注册表)——受网络和模组序列化限制 各模组的运行时数据重新生成——Create 每次连接生成 2,124 个配方,Cobblemon 重新同步所有化石/标记/浆果,Apotheosis 重新加载所有词缀。这些是模组设计的选择。 JEIOptimizer 将 JEI 从瓶颈中移除。它不再是短板——其他模组仍会照常运行。 实验性功能(默认关闭) 经过测试,发现在真实模组包中会导致问题。为精心挑选模组集的用户提供可选开启: plugins.parallel_phases — 并行插件配方注册。许多 JEI 插件(Theurgy、Ars Nouveau、Compact Machines)并非线程安全,会导致崩溃。 plugins.parallel_creative_tabs — 并行创意标签页构建。许多模组以非线程安全方式缓存标签页状态;在我们的测试中,22% 的 JEI 物品丢失。 filter.async — 在后台构建过滤器;玩家能更早进入世界。如果他们在前 2 秒内打开 JEI,则会看到空网格,直到准备就绪。 除非您了解自己在做什么,否则请关闭这些选项。 常见问题 问:这会破坏 JEI 搜索吗? 默认模式( PARALLEL_FULL ) 更改了 索引的构建方式 ,而不是 内容 。物品相同,配方相同,搜索结果也相同。 问:我有一个较小的整合包。我会看到更少的收益吗? 是的。在物品数量低于约 10,000 时,提升微乎其微。本 mod 专为拥有 30,000+ 物品的整合包设计。 问:为什么不向 JEI 提交 PR(拉取请求)? 也许以后吧。JEI 的作者 Mezz 历来偏好保守的更改——核心代码中的并行处理可能不被欢迎。本 mod 的存在是为了让你不必等待上游合并。 问:需要服务端安装吗? 不需要。这是纯客户端 mixin。将其放入 mods/ 在服务端上没有任何效果。 问:它支持 EMI / REI 吗? 不支持,本 mod 专门针对 JEI。EMI 有自己的架构(而且已经很快了)。 鸣谢 已在包含 250+ 个 mod 的自定义整合包以及 AllTheMods10、AllTheMons 上测试。 感谢 Mezz 保持 JEI 源码开源且足够清晰,以便从外部进行优化。
在鱼乐云资源中心浏览该资源,登录后可一键安装到你的游戏服务器。