
PacketFixer
一个服务端的Fabric模组(Minecraft 1.21.1,Java 21,v1.5.1,组com.packetfixer),用于优化服务器到客户端的网络流量。
一个服务端 Fabric 模组(Minecraft 1.21.1,Java 21,v1.5.1,组 com.packetfixer),用于优化服务器到客户端的网络流量。它是一个 DedicatedServerModInitializer,因此仅在服务器上运行。它主要做两件事:防止其他模组的数据包导致的崩溃/断开连接,并减少带宽、延迟和网络 CPU 占用。
模块
-
针对损坏的模组数据包的反断开连接(ClientConnectionMixin) 在 Netty 管道中插入一个处理器,并拦截 exceptionCaught:如果错误是包含 custom_payload 的 EncoderException(即某个模组发出的损坏数据包),它会记录一条警告并吞掉该错误,而不是踢出玩家。
-
自定义负载节流(PacketThrottler + 配置 → config/packetfixer.json) 每个连接每 tick 最多允许 50 个自定义负载;超出部分将进入队列(最大 500 个,最旧丢弃),并在下一个 tick 开始时通过批量写入和单次 Netty 刷新重新发送。它具有自适应拥塞控制:随着队列增长,“实时”预算会按比例缩小(背压),而刷新预算则按比例增加。对延迟敏感的数据包(位置、速度、方块更新、物品栏、生命值、声音)始终绕过节流,且 cobblemon 命名空间默认被排除 — 显然是为了避免破坏战斗数据包。
-
刷新合并(Flush consolidation) 添加一个 Netty FlushConsolidationHandler 以将多次刷新合并为更少的系统调用,并根据玩家数量设置自适应阈值(玩家少 = 低阈值 = 更佳延迟;玩家多 = 高阈值 = 更低 CPU)。tick 结束时的“刷新脉冲”确保没有数据滞留在缓冲区中。
-
数据包优化器(PacketOptimizerConfig → config/packetoptimizer.properties)
- NBT 剥离器(EntityNbtMixin):移除仅存在于服务端的标签(如 Paper.Origin、Bukkit.updateLevel 等)和空复合标签
- 区块优化器(ChunkDataMixin):对区块数据中的方块实体执行相同的清理
- 延迟实体加载器(LazyEntityTracker):处理超过 16 格距离外的实体,但按每 tick 约 10 个的批次进行
- 实体更新节流(EntityTrackerEntryMixin):距离所有玩家超过 48 格的实体仅每 3 个 tick 发送一次位置更新(减少约 66% 的数据包)
- 压缩调优:通过反射将 Deflater 强制设为级别 1(更快,但数据包稍大)
- 数据包监视器(PacketEncoderMonitorMixin):记录警告/错误 — 有助于找出哪个模组在发送超大数据包
几点值得注意的信息
ClientConnectionMixin 使用反射来处理压缩器的 Deflater 部分,如果 Netty/MC 内部结构发生变化,它会静默失败(捕获异常并记录调试日志)。此外,被吞掉的 exceptionCaught 意味着如果某个模组确实存在序列化错误,该数据包会消失而客户端永远不会知道 — 这是预期行为,但可能掩盖真正的问题。
正在加载版本记录…
正在加载评论…
评论在新手盒子客户端中发表,这里同步展示。