跳到正文

Krypton Hybrid

作者:dreamforSh

Krypton Hybrid 是基于 Krypton fnp legacy 的分支,补上了旧版缺少的 Netty 优化,将 Speed Compression 的实现替换为原生 zstd 和 lz4 算法,并支持混合服务器。

收藏

截图

介绍

介绍由机器翻译自 CurseForge 原页面,仅供参考。

Krypton Hybrid


License: LGPL-3.0

curseforge
github

概览

Krypton Hybrid 是基于 Krypton fnp legacy(1.19.2)制作的分支,补全了 Krypton fnp lite 版本中缺失的优化,加入了对 zstd 压缩算法的支持,并改进了原有的编码与 Netty 程序处理,同时保留了 Krypton fnp 和 RecastLib 的功能。

主要区别

  1. 支持混合型服务器兼容。

  2. 提供用于监控流量使用情况的命令。

  3. 本项目优先使用 zstd 作为主要压缩算法,同时保留原版本对实体追踪和通信编码的优化。

技术细节

1. 网络压缩管线

Krypton Hybrid 通过注入 Connection.setupCompression,替换 Minecraft 默认的 zlib 编码器。

特性 详情
主要算法 通过 zstd-jni 使用 Zstd(原生)
备用算法 通过 velocity-native 使用 zlib
等级范围 1 – 22(默认 3)
多线程 workers ≥ 1 时启用原生线程池
字典 可选的 .zdict 预训练文件,支持失败时开放或快速失败
高级调优 overlap_log、job_size、strategy、LDM + window_log

服务器和客户端必须使用相同的算法。算法不匹配会立即导致会话数据损坏。


2. 轻量载荷优化 — Uniform-RLE

地表上方的天空光照区段几乎总是均匀的(0xFF = 全部为 15)。对于均匀层,Krypton 不再写入 2 048 字节,而是将其编码为 2 字节。

线路格式(ClientboundLightUpdatePacketData):

[0x4B]            – Krypton marker (1 byte)
[skyYMask]        – BitSet
[blockYMask]      – BitSet
[emptySkyYMask]   – BitSet
[emptyBlockYMask] – BitSet
[skyCount]        – VarInt
For each sky DataLayer:
  [0x01] + 1 byte     – uniform (all nibbles == byte)
  [0x00] + 2048 bytes – raw    (fixed size, no VarInt prefix)
[blockCount]      – VarInt
For each block DataLayer: same as above

节省量保护条件:仅当 2048 × uniform_count + raw_count − 1 > 0 时启用。
最大节省量:在开放天空环境中,每个区块约可节省 40 KB(视距为 12 时,最多可有 20 个均匀天空层)。


3. 区块数据优化 — XOR 增量高度图 + 生物群系流

线路格式(ClientboundLevelChunkPacketData):

[0x4B]            – Krypton 区块数据标记(1 字节)

──── 高度图(二进制 + XOR 差分)────
VarInt  entry_count
每个条目:
  UTF-8  key
  VarInt long_count
  long[] XOR 差分编码(delta[i] = raw[i] ^ raw[i-1])

──── 方块数据(不含生物群系的区段)────
VarInt  blocks_length
byte[]  blocks(每个区段包含 short nonEmptyCount + PalettedContainer<BlockState>)

──── 生物群系数据(紧凑流)────
VarInt  section_count
每个区段:
  0x01 + VarInt(biomeId)          – 单值区段(2 字节,而非 3 字节以上)
  0x00 + VarInt(len) + raw bytes  – 多值区段

──── 方块实体 ────
LIST_STREAM_CODEC(原版编码方式不变)
优化项 机制 优势
XOR 差分高度图 相邻列之间存在相关性 → 许多 long 值接近零 提升 Zstd/zlib 压缩率 + 消除约 40 B 的 NBT 开销
拆分生物群系流 将生物群系数据分组;压缩单值区段 单值区段:2 B,而非 3 B 以上;利用跨区段冗余

4. 延迟区块缓存(DCC)

离开视距的区块会先缓存起来,而不是立即丢弃。如果玩家在条目过期前重新进入范围,则可跳过完整重发。

配置项 默认值 说明
dcc.enabled true 总开关
dcc.size_limit 60 每位玩家最多缓存的区块数
dcc.distance 5 玩家位置周围的缓存半径(区块)
dcc.timeout_seconds 30 强制移除超时时间

条目会根据三个维度移除:距离、容量和超时。被移除的条目会在下一次 ChunkMap.tick() 时触发延迟的 dropChunk 回调。


5. Flush 合并 + 实体数据包打包

两个互补层可减少实体追踪 tick 期间的系统调用与帧开销:

ChunkMap.tick() HEAD
  ① Recovery: flush any stale batch from previous failed tick
  ② Disable auto-flush for all players
  ③ Open EntityBundleCollector batch window

  ↳ TrackedEntity.broadcast() → packets collected per player

ChunkMap.tick() RETURN
  ④ Close batch → emit ClientboundBundlePackets (buffered, not yet flushed)
  ⑤ Re-enable auto-flush → single kernel flush per player
层级 机制 优势
Flush 合并(Netty) 缓冲写入,在 tick 结束时统一调用一次 flush() 繁忙服务器上的系统调用更少
数据包合并(协议) N 个实体数据包 → 1 个 ClientboundBundlePacket 减少帧开销;提升压缩率;保证客户端侧原子性

6. 热路径微优化

目标 优化方式
VarInt.read() 无分支的 4 字节 getIntLE + 位运算快速路径(适用于 0 – 268 M 的值)
VarInt.getByteSize() 通过 Integer.numberOfLeadingZeros 使用查找表
VarLong.getByteSize() 采用相同的查找表方案
FriendlyByteBuf.writeVarInt() 针对 1/2/3/4/5 字节的分路径处理,直接写入底层 ByteBuf
FriendlyByteBuf.writeUtf() 通过 ByteBufUtil.utf8Bytes 单次遍历完成 — 无需中间 byte[]
Varint21FrameDecoder 衍生自 Velocity 的高效帧处理 + 缓解 nullping 攻击

7. 可观测性 — /krypton 命令

/krypton stats show          – 压缩率、带宽节省量、运行时间
/krypton stats reset         – 重置所有计数器
/krypton packets bycount [n] – 按数量列出前 N 种数据包类型
/krypton packets bybytes [n] – 按字节数列出前 N 种数据包类型
/krypton mods bycount [n]    – 按数量列出前 N 个模组命名空间
/krypton mods bybytes [n]    – 按字节数列出前 N 个模组命名空间

需要操作员权限等级 2。

测试数据

在原始测试中,该模组将初始数据包大小压缩至原来的 13%。

test

鸣谢

常见问题

Krypton Hybrid 支持哪些 Minecraft 版本?

Krypton Hybrid 支持 Minecraft Java 版 1.19.2–1.21.1,共 3 个版本,可用的加载器:Forge / NeoForge。下载时注意选择和你游戏版本一致的文件。

Krypton Hybrid 怎么安装?

先用 PCL2 或 HMCL 启动器安装对应版本的 Forge / NeoForge,再把下载的 .jar 文件放进游戏目录的 mods 文件夹,重新启动游戏即可。开启了版本隔离的,mods 文件夹在 versions/版本名 下面。

评论

登录后评论和评分

dreamforSh 的其他作品

查看全部 →