1.18 补丁概述 - 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.entity_load_deadlock
通过稍微延迟实体加载,修复了 EntityJoinWorldEvent/EntityJoinLevelEvent导致世界生成死锁的许多问题。然而,这不应该在游戏中引起任何明显的行为变化。
mixin.bugfix.fix_config_crashes
修复了在启动游戏时偶尔导致Forge配置文件损坏的问题。
mixin.bugfix.item_cache_flag
修复了 MC-258939。
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.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_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.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.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.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.twilightforest.structure_spawn_fix
修复了因暮色森林世界生成以非常低效的方式检查结构而导致的卡顿问题。
mixin.safety
并发性补丁,用于防止在启动过程中发生崩溃。