1.20 补丁概述 - Kasualix/ModernFix GitHub Wiki

mixin.bugfix.blueprint_modif_memory_leak

修复了Blueprint的 ObjectModificationManager 泄漏原版资源的问题,减少了内存使用。尽管修复已经在 PR #195 中提交,但尚未发布。`

mixin.bugfix.chunk_deadlock

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

mixin.bugfix.cofh_core_crash

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

mixin.bugfix.concurrency

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

mixin.bugfix.ctm_resourceutil_cme

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

mixin.bugfix.ender_dragon_leak

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

mixin.bugfix.fix_config_crashes

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

mixin.bugfix.paper_chunk_patches

1.18 及更新版本。一项关键优化。移植了来自 Paper 的一个补丁,修复了 1.17 版本中加载区块需要大量内存和生成大量 CompletableFuture 实例的问题。1.18+ 现在可以像 1.16 一样在仅使用 400MB 内存的情况下加载世界。

mixin.bugfix.removed_dimensions

修复了移除维度模组后游戏无法加载世界的问题。Forge PR #8959 的反向移植。

mixin.bugfix.world_leaks

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

mixin.core

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

mixin.devenv

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

mixin.feature.branding

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

mixin.feature.direct_stack_trace

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

mixin.feature.disable_unihex_font

移除 Unicode 字体,可以节省 10MB 的内存,但会导致特殊字符不再呈现。

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.blast_search_trees

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

mixin.perf.cache_blockstate_cache_arrays

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

mixin.perf.cache_model_materials

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

mixin.perf.cache_profile_texture_url

避免无意义地创建 URL 对象,加快头颅方块的渲染速度。

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_bit_storage

修复了一些旧版服务器(例如 Hypixel)发送空区块(好像它们包含方块似的)导致内存浪费的问题。这将在这些服务器上显著减少内存使用。

mixin.perf.compact_mojang_registries

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

mixin.perf.datapack_reload_exceptions

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

mixin.perf.dedicated_reload_executor

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

mixin.perf.deduplicate_climate_parameters

对新的生物群系系统使用的气候参数对象进行了去重,可以节省大约 2MB 的内存,但也会在数据包重载时略微减慢速度。

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_entity_renderers

首次看到实体模型时进行构建,而不是在启动时构建。某些模组不兼容这个选项,会导致 EntityRenderer 崩溃。

mixin.perf.dynamic_resources

全版本共有。详情见

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_forge_dummies

通过使用更快的代码路径,加快了启动过程中Forge注册表的冻结。

mixin.perf.fast_registry_validation

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

mixin.perf.faster_command_suggestions

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

mixin.perf.faster_item_rendering

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

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

mixin.perf.faster_texture_stitching

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

mixin.perf.model_optimizations

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

mixin.perf.mojang_registry_size

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

mixin.perf.nbt_memory_usage

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

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.rewrite_registry

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

mixin.perf.state_definition_construct

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

mixin.perf.tag_id_caching

通过缓存位置对象而不是每次重新创建它,加速了标签条目的使用。

mixin.perf.thread_priorities

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

mixin.safety

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