1.16 补丁概述 - Kasualix/ModernFix GitHub Wiki

mixin.bugfix.chunk_deadlock

试图防止区块系统的死锁或在发生时提供额外的调试信息记录。这些死锁通常表现为服务器无限冻结(例如,实体不移动),而客户端继续正常工作。

mixin.bugfix.chunk_deadlock.valhesia

修补 Valhesia Structures 以解决其代码中的问题,该问题导致了频繁的世界生成/区块加载死锁。

mixin.bugfix.cofh_core_crash

修复 CoFH Core 中的多线程问题,该问题可能会导致在启动过程中偶尔崩溃。

mixin.bugfix.concurrency

这些补丁修复了 Minecraft 和/或 Forge 中与并发相关的问题。其中大多数问题会导致在加载过程中偶尔出现罕见且难以诊断的崩溃。

mixin.bugfix.ctm_resourceutil_cme

修复了连接纹理模组中的多线程问题,该问题可能导致在启动过程中偶尔发生罕见的崩溃。

mixin.bugfix.ender_dragon_leak

修复了原版中末影龙在保留对先前客户端世界的引用导致的一个内存泄漏问题。

mixin.bugfix.entity_load_deadlock

通过稍微延迟实体加载,修复了 EntityJoinWorldEvent/EntityJoinLevelEvent导致世界生成死锁的许多问题。然而,这不应该在游戏中引起任何明显的行为变化。

mixin.bugfix.fix_config_crashes

修复了在启动游戏时偶尔导致Forge配置文件损坏的问题。

mixin.bugfix.item_cache_flag

修复了 MC-258939。

mixin.bugfix.mc218112

此选项修复了在处理实体数据时如果抛出异常可能发生的死锁问题。原版在应该解锁数据管理器时没有正确执行此操作。这在错误跟踪器上被标记为 MC-218112,并由 Mojang 在 1.17 中修复了此问题。

mixin.bugfix.packet_leak

实验性的,默认禁用。尝试修复 1.16 上长时间游戏后出现的内存泄漏问题。

mixin.bugfix.preserve_early_window_pos

使游戏窗口在从 Forge 的早期加载切到 Minecraft 代码运行时保留其现有大小。修复了窗口在拖动后等操作后传回屏幕中心之类的问题。

mixin.bugfix.refinedstorage.te_bug

修复了在加载时,精致存储外部存储方块偶尔无法显示抽屉等内容的问题。这是对精致存储 PR #3435 的反向移植,该 PR 仅适用于 1.18 及以上版本。

mixin.bugfix.remove_block_chunkloading

修复了僵尸猪人在 Forge 上永久加载 0, 0 处区块的问题。这是 Forge PR #8583 的反向移植。

mixin.bugfix.starlight_emptiness

修复了Starlight由于空地图未初始化而导致偶尔的崩溃问题。这是对 Starlight 在 1.18.x 版本中的相同修复的反向移植。

mixin.bugfix.tf_cme_on_load

修补了暮色森林,使其使用主线程而不是 FML 工作线程执行非线程安全的客户端设置,这是应该的做法。

mixin.bugfix.world_leaks

减少了旧的客户端世界在切换维度后不再需要的内存使用。在原版中这些世界通常会被 GC 回收掉,但有时模组会保留对它们的引用。

mixin.core

现代化修复正常运作所需要的核心补丁。

mixin.devenv

在开发环境中运行时使用的补丁,用于提高速度和/或进行测试。

mixin.feature.branding

将现代化修复添加到标题屏幕的标语列表以及F3屏幕中。

mixin.feature.direct_stack_trace

通常处于关闭状态,可以启用以在发生崩溃时强制将原始堆栈跟踪信息记录到日志中。偶然情况下,原版的崩溃报告系统可能无法正常工作,提供了完全不相关的堆栈跟踪信息或报告。

mixin.feature.integrated_server_watchdog

向单机添加了原版的 Watchdog,但只会打印出堆栈跟踪信息,而不会强制终止世界。这个版本包括了 Fullstack Watchdog 的功能,但对于多人游戏,其仍然是必需品。

mixin.feature.measure_time

使用几个注入点来测定世界加载时间、数据包重载时间、资源重载时间和程序引导时间,并添加了必要的挂钩来启用原版未使用的性能分析器逻辑以用于资源重载(需要手动配置)。

mixin.feature.snapshot_easter_egg

在运行快照版本时添加彩蛋功能(不会影响任何原版的视觉或行为)。

mixin.feature.spam_thread_dump

仅用于调试。每60秒将线程导出到日志中。这可以帮助诊断加载/游戏过程中的无法解释的冻结问题。

mixin.feature.spark_profile_launch

如果启用,并且安装了兼容版本的 Spark,现代化修复将会对启动过程进行分析,直到主菜单才会停止。

mixin.feature.warn_missing_perf_mods

如果没有其他被视为必要且高度兼容的性能模组,则在启动时显示警告。

mixin.perf.async_jei

仅适用于 1.16 版本。一项关键优化。修补 JEI 以在后台线程上执行重新加载,完全消除了它在加入世界时造成的巨大延迟(表现为你在加入世界中的屏幕上会卡住一段时间)。

mixin.perf.async_locator

仅适用于 1.16 版本。将 Async Locator 模组的补丁反向移植了回来,以消除与 /locate、战利品表生成等相关的服务器卡顿问题。

mixin.perf.biome_zoomer

仅适用于 1.16 版本。使用 1.18 版本的逻辑进行了微小的优化,以提高 Biome Zoomer 的性能。

mixin.perf.blast_search_trees

全版本共有。如果安装了 REI 或 JEI,将禁用用于创造模式物品栏中原版搜索树的构建,而改为使用这些模组的搜索实现。这可以在世界加载过程中节省几秒钟的时间,并可能还可以节省一些内存(虽然 embeddedt 没有深测)。

mixin.perf.boost_worker_count

仅适用于 1.16 版本。类似于 Mojang 在 1.18 中所做的,移除了被硬编码的工作线程数量上限。

mixin.perf.cache_blockstate_cache_arrays

全版本共有。避免在每次初始化方块状态缓存时创建新的枚举数组副本。微小的优化,但很容易实现。

mixin.perf.cache_model_materials

全版本共有。缓存模型返回的RenderMaterial(纹理)集合和依赖项列表,而不是在每次请求时需要重新计算它们。有助于加速模型加载/烘焙过程。

mixin.perf.cache_strongholds

全版本共有。将生成的要塞位置列表保存在世界中,而不是在每次世界加载时重新生成它。在 1.16 上可以节省一点时间,在 1.18 和 1.19 上可以节省更多时间。

mixin.perf.cache_upgraded_structures

全版本共有。许多模组装载了过时的结构文件,这要求游戏每次加载时都使用 DFU 进行升级。这可能会相当慢。此补丁添加保存升级后结构版本的逻辑,并在下一次加载时重复使用它。为了处理模组更改结构文件但未更改名称的情况,原始文件的哈希将与缓存版本进行比较,如果它们不匹配,则结构将再次升级。

mixin.perf.clear_fabric_mapping_tables

通过清除 Fabric Loader 中的映射数据结构,减少了内存使用,这些数据结构要么是多余的,要么很少被模组使用。出于兼容性原因,默认情况下是关闭的。

mixin.perf.clear_mixin_classinfo

在启动完成后强制加载所有的 mixins,然后清除 mixin 数据结构以删除大部分 Mixin 的内存占用。出于兼容性原因,默认情况下是禁用的。

mixin.perf.compact_mojang_registries

(Fabric)实验性选项,可以将注册表的内存使用量减少约 50%。在大多数整合包中并不常用,除非其中包含数百万个方块和物品。

mixin.perf.compress_biome_container

仅适用于 1.16 版本。来自氢的优化,尝试在可能的情况下节省生物群系容器的空间。如果安装了与之冲突的模组,如 BetterEnd 或 Chocolate Fix 等,此选项将自动禁用。

mixin.perf.datapack_reload_exceptions

全版本共有。通过在数据包重新加载期间不打印一些常见异常的堆栈跟踪(例如,战利品表/配方中缺少物品)来减少日志垃圾信息,并可能略微提高加载速度。只是不打印堆栈,仍然会打印一条错误消息。

mixin.perf.dedicated_reload_executor

全版本共有。将资源包和数据包的重载移到专用工作线程池中,而不是使用默认的主线程。这允许模组们在运行时仍然有可能通过 Smooth Boot 来提高单人游戏性能,而不会因线程数量有限而减慢启动速度。

mixin.perf.deduplicate_location

全版本共有,但由于加载时间的影响,默认情况下处于禁用状态。对 ResourceLocation 的命名空间和路径进行了去重。这节省了内存,但也显著增加了构造新 ResourceLocation 的成本。

mixin.perf.deduplicate_wall_shapes

使大多数墙壁方块共享相同的形状对象,而不是每个方块都有自己的副本。当大量墙壁方块由模组添加时,可以显著减少内存使用。

mixin.perf.dynamic_block_codecs

避免为每个方块(状态)存储 Codec,而是在需要时动态生成并缓存它。通常情况下,除非有上百万个方块/物品,否则不值得启用。

mixin.perf.dynamic_dfu

全版本共有。修改 DFU(Data Fixer Upper)的初始化,使其在需要升级某些内容时首次发生。这听起来类似于 LazyDFU,但实现方式有所不同,因为它可以避免加载任何 DFU 的类/数据结构,而 LazyDFU 仅禁用规则优化。本质上,这个选项是 DataFixerSlayer 的更安全版本,因为它仍会在需要时加载 DFU。

通常情况下,即使启用了这个选项,你仍应继续使用 LazyDFU,否则 DFU 规则优化将导致卡顿。

mixin.perf.dynamic_resources

全版本共有。详情见

mixin.perf.dynamic_resources.ae2

AE2 的动态资源加载兼容补丁。

mixin.perf.dynamic_resources.ctm

CTM 的动态资源加载兼容补丁。

mixin.perf.dynamic_resources.rs

RS 的动态资源加载兼容补丁。

mixin.perf.dynamic_resources.supermartijncore

SuperMartijn642CoreLib 的动态资源加载兼容补丁。

mixin.perf.dynamic_sounds

全版本共有。允许游戏停载声音,而不是让声音在加载后无限期地持续存在。

mixin.perf.dynamic_structure_manager

全版本共有。允许游戏在生成结构后卸载结构文件,而不是永久加载它们。

mixin.perf.fast_registry_validation

全版本共有。Forge 在每次验证注册表时都会不必要地通过反射查找一个方法。这个补丁简单地缓存了返回的值,因为它每次都是相同的。

mixin.perf.faster_advancements

重新编写了进度检查逻辑,以提高速度,并且在大型模组包中不会引发 StackOverflowError。移植自 Fabric 的 Advancements Debug。

mixin.perf.faster_command_suggestions

减轻在输入命令时有数十万个建议时的卡顿问题。

mixin.perf.faster_font_loading

全版本共有。优化字体渲染器以更快地加载字体,加快资源重新加载速度。

mixin.perf.faster_item_rendering

全版本共有。避免在 GUI 中渲染物品的侧面。(是的,原版似乎会这样做。)

如果在性能较差的 GPU 上安装了像 REI/JEI 这样的模组,并且有足够多的物品可见,这可以将 FPS 提高三倍。默认情况下禁用,因为这是一个新功能,并没有经过充分测试,但应该是安全的。最有可能的问题是物品在 GUI 中完全不可见,或者在世界中呈现为扁平的外观。

mixin.perf.faster_texture_loading

适用于 1.19.4 之前的所有版本。避免两次读取纹理(第一次使用非常慢的代码路径),而是进行更快的一次加载(类似于 1.19.3+)。

mixin.perf.faster_texture_stitching

适用于所有版本。令游戏使用 SuperCoder79 最初为 1.7.10 上的 lwjgl3ify 编写的更快的纹理拼接系统,可以在加载过程中节省一些时间。偶尔会有报告称其会导致方块或 GUI 中出现奇怪的图像伪影,这可能是钠的问题。

mixin.perf.jeresources_startup

仅适用于 1.16 版本。优化了 Just Enough Resources,使其不会不必要地多次为相同职业创建村民实体,加快了 JEI 的启动速度。

mixin.perf.kubejs

仅适用于 1.16 版本。对 KubeJS 进行了优化,避免了不必要的 ItemStack 复制等操作,从而减少了加载数据包所需的时间。

mixin.perf.model_optimizations

全版本共有。实施了优化以加速模型加载过程。

mixin.perf.mojang_registry_size

解决了一个导致方块/物品注册的速度与已注册数量成比例减慢的问题。这改善了启动时间。

mixin.perf.nbt_memory_usage

全版本共有。使用更高效的后备映射来处理复合 NBT 标签,去重键名,并对非常小的复合标签使用数组映射。这减少了在内存中存储许多复合标签的开销。

mixin.perf.nuke_empty_chunk_sections

仅适用于 1.16 版本,受氢启发。避免在内存中存储充满空气的区块部分,而是将它们标记为空。

mixin.perf.patchouli_deduplicate_books

修复了 Patchouli 书籍存储许多带有 NBT 标签的空物品,减少了内存使用。

mixin.perf.reduce_blockstate_cache_rebuilds

全版本共有。一项关键的优化。较新版本的 Minecraft(1.12之后)实现了一个方块状态缓存系统,用于缓存关于方块状态的常用信息,如是否为实体、碰撞箱等。在原版中,重建这个缓存非常快速(只需一两秒),但在安装了许多模组的情况下,它会变得相当慢,因为游戏中存在许多方块状态,它们都必须重新构建它们的缓存。

这个问题在 Forge 中变得更加严重,因为在下一次重新构建之前,数据几乎肯定是未使用的,缓存会在很多地方重新构建。比如包括在达到主菜单之前(在“Freezing data”阶段)以及在加载世界时多次(!)重建缓存。

现代化修复通过使缓存重建变为惰性来解决这个性能瓶颈。每个方块状态在首次访问数据时重建其缓存。在原版或Forge尝试为所有方块状态重建缓存的任何时刻,这将被重定向为简单地使每个方块状态上的缓存无效。

这不应该对启动后的 TPS 产生任何影响。

mixin.perf.remove_biome_temperature_cache

全版本共有。删除生物群系温度缓存,就像现代版本上的锂一样。

mixin.perf.remove_spawn_chunks

完全从游戏中删除生成区块。不同于Ksyxis,它们不会再加载。

mixin.perf.resourcepacks

全版本共有。一项关键优化。现代版本的启动受到文件系统访问的严重瓶颈。资源包经常发出许多请求,用于列出资源或检查给定资源是否存在,而每个请求都导致了非常慢的文件 API 调用。

现代化修复通过简单地缓存在模组提供的和原版资源包中存在的所有资源的列表来完全消除了大部分瓶颈。缓存在资源重新加载时重新构建(除了原版资源,因为它们在游戏运行时不应更改)。

除了 OptiFine(其 CTM 资源加载不正确)外,此补丁没有已知的兼容性问题。但是,embeddedt 不建议在任何情况下使用 OptiFine,因为它本身会增加几分钟的启动时间,并且与现代化修复没有经过任何测试。

mixin.perf.reuse_datapacks

仅适用于 1.16 版本。尝试通过在可能的情况下跳过数据包重新加载来加快在单人游戏世界之间切换的速度。可能会导致与某些模组的兼容性问题,但目前默认情况下已启用。

mixin.perf.rewrite_registry

全版本共有。目前处于半崩溃状态。它会强制性地使用更快的版本替换 Forge 注册表系统的一些内部逻辑,但目前在加载某些整合包时会导致冻结。由于明显的原因,默认情况下是关闭的。

mixin.perf.skip_first_datapack_reload

仅适用于 1.16 和 1.19 版本。这是一个关键的优化。

在 1.16 开发周期中,Forge 对游戏进行了修补,使加载现有世界时重新加载数据包两次,以修复生物群系 ID 移位的问题。不幸的是,数据包的重新加载通常需要 30 秒以上的时间,因此这严重影响了世界加载时间。

现代化修复进行了必要的更改,以避免这种重新加载,这些更改基于未完成的 Forge PR #8163。

Forge 在 1.18 中删除了这个更改,但然后在 1.19 中再次添加了类似的修补程序,以修复在创建新的单人游戏世界时未加载模组数据包的问题。幸运的是,这个问题仅局限于 1.19 版本中的世界创建界面,现有世界只需要进行一次重新加载。然而,即使在 1.19 中点击“创建新世界”时,这仍然会使卡顿时间加倍,因此现代化修复再次进行了更改,以避免进行多余的重新加载。

mixin.perf.state_definition_construct

全版本共有。仅在安装了 FerriteCore 时启用。利用 FerriteCore 对方块状态的处理,加速它们的创建。这可以帮助加速具有大量方块状态的模组的启动,比如家具模组。

mixin.perf.thread_priorities

适用于所有版本。调整工作线程和服务器线程的优先级,使它们低于客户端线程。这有助于提高在 CPU 核心较少的计算机上的 FPS 稳定性,前提是使用的 Java 实现尊重线程优先级。

mixin.perf.use_integrated_resources.jepb

mixin.perf.use_integrated_resources.jeresources

mixin.safety

并发性补丁,用于防止在启动过程中发生崩溃。