卡了 OK

卡了 OK

优化与多线程 由 n1luik 编写

基础库

概述

  • 本项目用于修复和优化其他模组引发的问题,支持在服务器上运行。
  • 项目包含两个主要部分:k_all_fix 和 k_multi_threading,功能主要由 JVM 参数控制。
  • 不提供常规配置文件;主要通过启动参数进行配置。
  • 从 1.0.4.0 起支持客户端使用(需要 JVM 参数 -DKMT_Client=true)。
  • 在多模组且单线程的基础环境下,无法保证不产生问题,但您可以在 Github 上创建 ISSUE,作者会尽快修复。
  • 在某些模组组合下,即使客户端看起来没有效果,也可能需要安装此模组。

功能与使用场景

优化

修复

多线程

简介

  • 多线程支持包括方块刻、方块实体刻、实体、维度、玩家数据包接收(手动开关,仅客户端)和玩家登录(手动开关),并通过应用多线程来修复一些有问题的单线程模组。
  • 服务器端默认启用多线程。
  • 在多线程场景下,可能会出现线程池拦截或超出限制的错误,但通常不会导致服务器崩溃。
  • 建议手动设置 -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

连接与超时

  • -DKAF-ClientboundKeepAlivePacket_Max=[毫秒]
    • 更改 ClientboundKeepAlivePacket 的时间要求(默认15秒;原版必须<30秒,否则玩家会因超时被踢出)。
  • -DKAF-ServerTimeout=[秒]
    • 设置服务器连接超时时间。
    • 在某些情况下可能无效(需要两个参数,因为 Forge 的 forge.readTimeout 仅涵盖服务器数据包读取超时,不包括与玩家的客户端/服务器网络线程)。
  • -Dforge.readTimeout=[秒]
    • Forge 数据包读取超时参数(与上一个参数一起使用)。

Mixin / NBT / 自动命令

  • -DKAF-RemoveMixin:[类名]
    • 禁用指定的 mixin(k_multi_threading 的 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 功能。
  • -DKAF-FixTFMGDestroy=true
    • 修复 Destroy 与 Create 之间的兼容性(创造模式泵无法正确连接到 Create 的管道)。
  • -DKAF-Fix_fabric-object-builder-api.jar=true
    • 修复 Sinytra Connector 的 fabric-object-builder-api 与 forge-47.3.27 之间的兼容性。
  • -DKAF-FixAllPacket=true
  • -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 函数的限制。
  • -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 可自动禁用:
    • Cupboard 中的 logOffthreadEntityAdd。
    • Canary / Lithium 中的 world.tick_scheduler 和 entity_by_type(您必须在 config/canary.properties 或 config/lithium.properties 中手动添加 mixin.world.tick_scheduler=false;否则这些模组将覆盖对 ClassInstanceMultiMap 的多线程修复)。
  • 不应使用 -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 的裂变反应堆在服务器重启后可能会偶尔错误计算冷却。

命令

  • /debug_GetterClassFile [类名]

    • 将最终运行时类数据导出到游戏目录,文件名为 时间戳_save.class。
  • /SetterWorldConfig [world, ClearErrorSize, RemoveRemoveErrorSize]

    • 此命令的设置不会持久化。
    • ClearErrorSize:清除记录的“可能导致服务器崩溃风险的错误”计数。
    • RemoveRemoveErrorSize:停止记录崩溃风险计数并保持拦截。
    • 在 world [维度注册ID] 下,可用选项:
      • setM2 [true,false]:切换到另一种维度实现模式;优先级高于 setMultiThreading,但可能导致游戏冻结。
      • setMultiThreading [数字](默认 0):为此维度设置多线程并行任务数;与 setM2 模式独立,也可能导致游戏冻结。

其他

  • 由于 Minecraft 和许多模组从根本上是为单线程行为设计的,因此无法保证完全修复所有问题。

源代码使用