跳到正文

Ice and Fire Memory Fix

作者:TheFlareStar

通过弱引用缓存和无分配状态查询,减少 Ice and Fire 的内存泄漏和实体刻开销。

收藏

介绍

介绍由机器翻译自 CurseForge 原页面,仅供参考。

📖 模组介绍

Ice and Fire 会为游戏中的每一个生物实体(包括动物、怪物和村民)附加一个“状态数据包”,用于追踪冰冻、锁链、海妖魅惑等效果。问题在于,绝大多数实体根本不会用到这些功能,却仍然携带着完整的数据包,而且游戏每个刻都要查询一次。

结果就是:内存开销高,还会造成不必要的性能损耗。

这个模组的作用很直接:减少不必要的内存占用,并缩短查询路径。

简而言之:内存占用减少约 20%,性能提升约 7%。


⚙️ 工作原理

1. 缓存查询结果——不再绕远路

实体第一次需要查询状态数据时,仍会照常查询。之后,查询结果会直接存储在实体自身上。下次查询时,即可直接命中,无需再经过全局注册表。

2. 按需创建——不再预先分配

原本,每个实体都会立即分配 4 个对象(锁链、魅惑、腐烂鸡蛋、杂项),不管它们以后是否会用到。优化后,只有真正需要时才会创建对象。普通动物、怪物和村民将不再分配这些不必要的对象。

3. 读取只读,写入才写入

只读路径使用共享的空对象,不会生成新数据。只有实际修改状态的路径才会创建专用数据。

4. 状态为空时释放,只保存有用数据

状态恢复为空时,对应对象会立即释放。NBT 只保存有意义的数据。完全兼容旧存档,可以放心升级。


📊 优化效果

测试方法:使用 Spark heapsummary,在相同整合包和种子下探索 5 分钟。

指标 未优化 优化后 改善幅度
Ice and Fire 相关内存 382 KB 272 KB -28.7%
状态数据包内部内存 169 KB 72 KB -57.0%
每个实体的状态数据开销 ~220 B ~96 B -56.1%
4 种延迟创建的子对象总数 3,080 17 -99.45%
JVM 已用堆内存 4.13 GiB 3.57 GiB ~ -478 MiB

🕹️ 6 小时游戏对比

使用相同的整合包、渲染距离和实体距离。TPS 稳定在 20。交替进行探索和基地活动。

指标 未优化 优化后 差异
每刻查询次数 数亿次全局查询 直接读取本地缓存 大多数查询已消除
JVM 已用堆内存 ~6.2 GiB ~4.9 GiB ~ -1.3 GiB

常见问题

Ice and Fire Memory Fix 支持哪些 Minecraft 版本?

Ice and Fire Memory Fix 支持 Minecraft Java 版 1.19.2–1.20.1,共 2 个版本,可用的加载器:Forge。下载时注意选择和你游戏版本一致的文件。

Ice and Fire Memory Fix 怎么安装?

先用 PCL2 或 HMCL 启动器安装对应版本的 Forge,再把下载的 .jar 文件放进游戏目录的 mods 文件夹,重新启动游戏即可。开启了版本隔离的,mods 文件夹在 versions/版本名 下面。

评论

登录后评论和评分

TheFlareStar 的其他作品

查看全部 →