
卡了 OK
优化与多线程 由 n1luik 编写
概述
- 本项目用于修复和优化其他模组引发的问题,支持在服务器上运行。
- 项目包含两个主要部分:
k_all_fix和k_multi_threading,功能主要由 JVM 参数控制。 - 不提供常规配置文件;主要通过启动参数进行配置。
- 从
1.0.4.0起支持客户端使用(需要 JVM 参数-DKMT_Client=true)。 - 在多模组且单线程的基础环境下,无法保证不产生问题,但您可以在 Github 上创建 ISSUE,作者会尽快修复。
- 在某些模组组合下,即使客户端看起来没有效果,也可能需要安装此模组。
功能与使用场景
优化
- 优化 Upgraded Additional Trims 的性能。
- 优化 Atmospheric 中与愚人节日期检查相关的开销。
- 优化 Upgraded Core 的性能。
- 优化 [Let's Do] Farm & Charm 中的鸡舍 AI 性能。
- 优化 Event Wrapper 的性能。
- 优化 Create:FluidLogistic 的性能
-DKAF-fluidlogistics.DisabledDynamicUp=true用于禁用旧 ID 更新,如不设置,可能会导致性能下降。
- 优化 AE2 的游戏计算
- 优化 ItemStack.issameItemsameTags 的性能
- 优化 PPMO2 的性能
- 删除 Apotheosis 和 Create:Connected 的无用代码
修复
- 修复在服务器上同时使用 L_Ender's Cataclysm 和 MineColonies 时,实体数量相关的性能问题。
- 修复 [Let's Do] Farm & Charm 中发送过多无效数据包的问题。
- 修复 Biolith 与某些 MCreator 世界生成模组(例如 Terramity)之间的兼容性问题。
- 修复 Gregicality Rocketry 与 Canary 之间的兼容性问题,但空间站边界仍可能出现碰撞箱问题。
- 修复 Petrolpark's Library 1.4.2 在某些 Java 环境中无法使用的问题;此修复可通过
-DKAF-DisablePetrolpark=false禁用。 - 修复/优化 Alex's Caves 中与磁场相关的性能问题。
- 修复 Create: Diesel Generators 中的 mixin 性能问题。
- 修复旧版 Destroy 因数据库连接失败导致的服务器崩溃问题。
多线程
简介
- 多线程支持包括方块刻、方块实体刻、实体、维度、玩家数据包接收(手动开关,仅客户端)和玩家登录(手动开关),并通过应用多线程来修复一些有问题的单线程模组。
- 服务器端默认启用多线程。
- 在多线程场景下,可能会出现线程池拦截或超出限制的错误,但通常不会导致服务器崩溃。
- 建议手动设置
-DKMT-threadMax=[CPU线程数];否则世界生成可能会冻结。如果设置后仍出现冻结,请调高该值。 - 在
1.0.4.0之前,客户端无法使用多线程;从1.0.4.0起,客户端可通过-DKMT_Client=true启用。 - 在
1.0.3.3之后,ParaServerChunkProvider、TaskRun以及部分区块生成代码更加依赖 C2 编译(JVM 运行一段时间后会自动进入 C2 模式)。 - 在 Windows Server 2022 Datacenter 21H2 20348.3091(作者环境)中,可能会发生罕见的线程调度异常并导致 CPU 使用率异常升高;解决方案是重启服务器。
相关 JVM 参数
-DKMT-threadMax=[数字]- 设置线程池的线程数。
-DKMT-callMax=[数字]- 设置多线程任务可使用的默认最大线程数。
-DKMT-ThreadpoolKeepAliveTime=[毫秒]- 设置空闲线程在回收前的保留时间。
-DKMT_D=[任意字符]- 禁用多线程。
-DKMT-OpenVanillaServerChunkCache=true- 强制使用原版
ServerChunkCache的修复路径(在 1.0.5.3 中添加)。
- 强制使用原版
JVM 参数总览(全部保留)
基础与通用
-DKAllFix_D=[任意字符]- 禁用 KAllFix。
-DKMT_Client=true- 在客户端启用多线程相关功能(1.0.4.0+)。
-DKAF-DisablePetrolpark=false- 禁用与 Petrolpark's Library 1.4.2 相关的修复。
连接与超时
-DKAF-ClientboundKeepAlivePacket_Max=[毫秒]- 更改
ClientboundKeepAlivePacket的时间要求(默认15秒;原版必须<30秒,否则玩家会因超时被踢出)。
- 更改
-DKAF-ServerTimeout=[秒]- 设置服务器连接超时时间。
- 在某些情况下可能无效(需要两个参数,因为 Forge 的
forge.readTimeout仅涵盖服务器数据包读取超时,不包括与玩家的客户端/服务器网络线程)。
-Dforge.readTimeout=[秒]- Forge 数据包读取超时参数(与上一个参数一起使用)。
Mixin / NBT / 自动命令
-DKAF-RemoveMixin:[类名]- 禁用指定的 mixin(
k_multi_threading的 mixin 也可禁用)。
- 禁用指定的 mixin(
-DKAF-NbtIoMixin_NotGZip=true- 为非 gzip 场景下的 NBT IO 添加 try-catch(不安全;环境中需要 commons-compress)。
-DKMT-ChunkGeneratorMode2Start=[true,false]- 自动运行:
/SetterWorldConfig world setM2 %%KMT-ChunkGeneratorMode2Start%%。
- 自动运行:
繁殖控制
-DKAF-ChunkBreedingControlSize=[数字]- 当区块实体数量超过给定值时禁用繁殖;如果参数缺失/不是数字数组/为空,则禁用。
-DKAF-ChunkBreedingControlSizeEnable=[true,false]- 检测结果的内部缓存开关;手动设置可能会被程序覆盖。
可选功能
-DKMT-SafeUnloadChunk=true- 允许在区块生成线程中卸载区块(仅在
<1.0.4.2出现相关冻结问题时推荐使用)。
- 允许在区块生成线程中卸载区块(仅在
-DIndependencePlayer=true- 启用异步玩家处理(可能提供很少或没有优化)。
-DFixBiolithBugMode2=true- 尝试修复大多数 Biolith 兼容性问题(可能会引入重大 bug)。
-DKAF-gtceu.MedicalConditionTrackerMixin=true- 禁用 GTM 中的辐射。
-DKAF-RemoveClientboundKeepAlivePacket=true- 禁用原版
ClientboundKeepAlivePacket(将无法计算ping)。
- 禁用原版
-DKAF-RemoveFlyingTest=true- 移除飞行检测。
-DKAF-moonrise_fast_palette=true- 禁用来自 Moonrise 的
fast_palette功能。
- 禁用来自 Moonrise 的
-DKAF-FixTFMGDestroy=true-DKAF-Fix_fabric-object-builder-api.jar=true- 修复 Sinytra Connector 的
fabric-object-builder-api与forge-47.3.27之间的兼容性。
- 修复 Sinytra Connector 的
-DKAF-FixAllPacket=true- 修复网络数据包(客户端和服务器都必须启用);相关模组:Mekanism Explosives、Create、The Abyss II。
-DKAF-ChunkAwareBlockCollisionSweeperFast=true- 使用近似算法替换 Lithium 的 ChunkAwareBlockCollisionSweeper。
登录多线程
-DKMT-LoginMultiThreading=true- 启用多线程登录。
-DKMT-LoginMultiThreading.ConnectionLock=true- 在 Tick 结束时等待异步执行完成(禁用可能会略微提高性能,但会降低登录稳定性,并可能导致崩溃)。
-DKMT-LoginMultiThreading.TaskSizeMax=[数字]- 限制并发登录任务数(默认8)。
- 登录多线程可能导致服务器提前收到
ServerboundMovePlayerPacket,从而产生一条错误日志。
数据包优化
-DKAF-packetOptimize=true- 优化一些原版数据包(客户端和服务器都必须启用)。
-DKAF-packetOptimize.AttributesReOutputTime=[毫秒]- 设置属性相关数据的强制重发间隔(默认2分钟)。
-DKAF-packetOptimize.CompatibilityMode.ClientboundBlockEntityDataPacket=true- 对
ClientboundBlockEntityDataPacket使用更保守的压缩(影响性能)。
- 对
-DKAF-packetOptimize.CompatibilityMode.ClientboundSectionBlocksUpdatePacket=true- 对
ClientboundSectionBlocksUpdatePacket使用更保守的压缩。
- 对
其他
-DKAF-UnsafeCinderscapesFix1=true- 调整 Cinderscapes 中高开销的
enableAshFall函数的限制。
- 调整 Cinderscapes 中高开销的
-DKAF-fix.asynchronous.ClientboundCustomQueryPacket=true- 使握手过程异步化,降低安装模组过多时无法加入游戏的几率。
-DKAF-FixConfigAuto=true- 自动更改某些配置选项以确保兼容性。
安装与运行说明
- 从
1.0.3.18起,可直接运行(仍保留安装功能)。 - 在
1.0.3.18之前,请先运行模组的安装器,或使用:java -jar k_multi_threading-xxx.jar -i [空或安装目录]
- 安装仅生成
k_multi_threading-base.jar和k_multi_threading-asm.jar。 - 某些功能可能会下载依赖项(
Zstd-jni 1.5.7-2);如果下载失败,请将它们手动放入game_directory/lib。
兼容性说明
- 使用
-DKAF-FixConfigAuto=true可自动禁用: - 不应使用
-DKAF-FixConfigAuto=true的情况:- 可能与 ModernFix 中的
mixin.perf.cache_upgraded_structures冲突(可通过在config/modernfix-mixins.properties中设置mixin.perf.cache_upgraded_structures=false来禁用)。 - 启用登录多线程后,ParCool (页面中列为 Parkour) 可能需要玩家加入后死亡一次才能正常工作。
- Ars Creo 可能会偶尔记录
Modifier is already applied on this attribute!,但不会崩溃。 - NuclearCraft: Neoteric 的裂变反应堆在服务器重启后可能会偶尔错误计算冷却。
- 可能与 ModernFix 中的
命令
/debug_GetterClassFile [类名]- 将最终运行时类数据导出到游戏目录,文件名为
时间戳_save.class。
- 将最终运行时类数据导出到游戏目录,文件名为
/SetterWorldConfig [world, ClearErrorSize, RemoveRemoveErrorSize]- 此命令的设置不会持久化。
ClearErrorSize:清除记录的“可能导致服务器崩溃风险的错误”计数。RemoveRemoveErrorSize:停止记录崩溃风险计数并保持拦截。- 在
world [维度注册ID]下,可用选项:setM2 [true,false]:切换到另一种维度实现模式;优先级高于setMultiThreading,但可能导致游戏冻结。setMultiThreading [数字](默认0):为此维度设置多线程并行任务数;与setM2模式独立,也可能导致游戏冻结。
其他
- 由于 Minecraft 和许多模组从根本上是为单线程行为设计的,因此无法保证完全修复所有问题。
源代码使用
moonrise_fast_palette使用了 Moonrise 的源代码。- 针对 Gregicality Rocketry 和 Canary 的兼容性修复使用了 Canary 的源代码。
正在加载版本记录…
正在加载评论…
评论在新手盒子客户端中发表,这里同步展示。