
脉冲网络
一个服务端的Fabric网络优化模组,采用数据包批处理及其他优化措施。与Krypton完全兼容。

PulseNet
高性能网络的心跳 - BorisShoes 出品的 Fabric 版
PulseNet 是一个 Fabric 模组,为你的 Minecraft 服务器带来高性能的数据包批量处理。通过用智能批处理替代标准的逐包网络刷新,PulseNet 在保持关键数据包低延迟传输的同时,降低了系统调用开销和 CPU 占用。
项目概述
PulseNet 是一个 Fabric 模组,用智能批处理系统替代 Minecraft 默认的逐包网络刷新。发出的数据包会被分组并一起刷新,从而大幅降低内核系统调用开销和事件循环任务调度,同时让战斗、聊天和其他延迟敏感的数据包保持即时传输。通过 Mixin 兼容性设计,可与其他 Fabric 模组无缝协作。
安装
PulseNet 是一个服务端 Fabric 模组。将它和 Fabric API 一起放入你的 mods/ 文件夹。
要求:
Fabric Loader 0.18.5+
Minecraft 26.1+
Java 25+
功能
| 功能 | 描述 |
|---|---|
| 智能数据包批处理 | 在一个 tick 内对发出的数据包进行分组,并通过单次内核系统调用刷新,而不是每个数据包一次。支持三种模式:smart_execution、strict_tick 和 interval。 |
| 写入队列 | 用单个批量写入任务替代逐包的事件循环任务提交,消除 lambda 分配和跨线程调度开销。 |
| 数据包合并 | 将类似的低优先级数据包(粒子、声音)打包成 BundlePacket,减少客户端接收的数据包数量。 |
| 爆炸优化 | 检测爆炸导致的大规模方块变化,在超过可配置阈值时用整区块重发替代单独的方块更新数据包。 |
| 数据包分类 | 自动将数据包分类为 Critical、Instant、Chat、Ignored 或 Coalesce——确保延迟敏感的数据包(keepalive、disconnect、combat)始终绕过缓冲区。Fabric 基础设施数据包(minecraft:register、minecraft:unregister)在 Connection 层面处理,以防止模组握手失败。 |
| 实时指标 | 内置指标系统,跟踪逻辑/物理 PPS、带宽、CPU 占用、内存节省和写入队列效率。可通过命令或游戏内 Boss 栏查看。 |
| Mixin 兼容性 | 使用 @WrapOperation 方法,在所有其他 mixin(Polymer、服务端翻译等)之后运行,确保与 Fabric 模组生态完全兼容。 |
| 可热重载配置 | 所有设置均可通过 pulse.properties 和游戏内命令(/pulse config、/pulse reload)配置,无需重启。 |
命令
| 命令 | 描述 |
|---|---|
/pulse |
显示当前 PulseNet 版本。 |
/pulse reload |
从磁盘重新加载配置。 |
/pulse config |
在游戏内查看和修改所有配置设置。 |
/pulse netstats [network|cpu|ram|all] |
显示实时网络、CPU 和内存统计信息。 |
/pulse netstats bar |
切换指标 Boss 栏叠加显示。 |
/pulse netstats reset |
将所有指标计数器重置为零。 |
/pulse packetNames |
列出所有观察到的数据包类名和通道 ID。 |
/pulse packetNames classes |
仅列出观察到的数据包类名。 |
/pulse packetNames channels |
仅列出观察到的自定义负载通道 ID。 |
/pulse packetNames reset |
清除观察到的数据包名称列表。 |
配置命令
以下命令可用于调整 pulse.properties 文件中的可配置设置,无需重启服务器(运行这些命令后使用 /pulse reload 热替换更改)。这些命令可以附加一个值来设置该项,或不带值使用以查看当前设置。
/pulse config batchingEnabled智能数据包批处理系统的主开关。为 true 时,发出的数据包会被缓冲并批量刷新,而不是逐个刷新。(默认:true)/pulse config batchingMode批处理模式:smart_execution(在 tick 和限制时刷新)、strict_tick(仅在 tick 结束时刷新)、interval(按计时器刷新)。(默认:smart_execution)/pulse config batchingMaxBatchSize强制刷新前缓冲的最大数据包数量。(默认:1024)/pulse config batchingMaxBatchBytes强制刷新前缓冲的最大字节数。(默认:32000)/pulse config batchingFlushIntervalINTERVAL 批处理模式的间隔毫秒数。(默认:25)/pulse config batchingSafetyMarginBytes从最大批量字节限制中减去的安全余量字节数,以防止溢出。(默认:64)/pulse config batchingInstantPackets应在发送时立即刷新缓冲区的数据包类名列表。(默认:ClientboundHurtAnimationPacket, ClientboundDamageEventPacket, ClientboundBlockEntityDataPacket)/pulse config batchingIgnoredPackets应始终完全绕过缓冲区的数据包类名列表。(默认:[])/pulse config batchingInstantChannels其自定义负载数据包应在发送时立即刷新缓冲区的插件通道 ID 列表(例如axiom:hello)。使用/pulse packetNames channels发现通道 ID。(默认:[])/pulse config batchingIgnoredChannels其自定义负载数据包应始终完全绕过缓冲区的插件通道 ID 列表。使用/pulse packetNames channels发现通道 ID。注意:minecraft:register和minecraft:unregister在 Connection 层面处理,无论此列表如何,始终绕过缓冲区。(默认:[])/pulse config batchingChatPacketsBypass为 true 时,聊天相关数据包绕过缓冲区以即时传输。(默认:true)/pulse config batchingOffThreadBypass为 true 时,从服务器线程之外发送的数据包绕过缓冲区。(默认:true)/pulse config batchingWriteQueue为 true 时,缓冲的数据包会被排队并在单个事件循环任务中写入,而不是对每个数据包调用 Connection.send(),从而消除逐包 lambda 分配和跨线程任务调度。(默认:true)/pulse config batchingPacketCoalescing为 true 时,合并列表中的数据包会在刷新时打包成 BundlePacket,减少客户端接收的数据包数量。(默认:true)/pulse config batchingCoalescePackets要合并成 BundlePacket 的数据包类名列表(例如粒子、声音)。支持使用点语法(Foo.Bar)表示内部类。(默认:ClientboundLevelParticlesPacket, ClientboundSoundPacket, ClientboundSoundEntityPacket)/pulse config batchingCoalesceBundleLimit每个 BundlePacket 的最大子数据包数量。原版客户端强制上限为 4096。(默认:4000)/pulse config optExplosionsEnabled为 true 时,爆炸产生的方块更新会按区块分组,如果超过阈值则替换为整区块重发。(默认:true)/pulse config optExplosionsBlockChangeThreshold单个区块中触发整区块重发(替代单独更新)所需的方块变化数量。(默认:512)/pulse config optExplosionsLogOptimizations为 true 时,每次爆炸优化用区块重发替代方块更新时都会记录一条消息。(默认:false)/pulse config metricsEnabled为 true 时,指标收集系统处于活动状态并计算网络统计信息。(默认:true)/pulse config metricsUpdateInterval指标系统重新计算派生统计信息的频率(秒)。(默认:1)/pulse config metricsModuleNetwork启用网络指标模块(PPS、带宽)。(默认:true)/pulse config metricsModuleCpu启用 CPU 指标模块(进程 CPU 占用估算)。(默认:true)/pulse config metricsModuleMemory启用内存指标模块(节省分配估算)。(默认:true)/pulse config metricsModuleWriteQueue启用写入队列指标模块(事件循环任务节省跟踪)。(默认:true)
权限节点
PulseNet 使用 Fabric Permissions API 来处理命令权限。每个节点都有一个回退的原版权限等级,供没有权限模组的服务器使用。
通用
| 节点 | 默认 | 描述 |
|---|---|---|
pulsenet.pulse |
ALL |
访问 /pulse 基础命令(显示版本) |
pulsenet.reload |
GAMEMASTERS |
重新加载 PulseNet 配置文件 |
pulsenet.netstats |
GAMEMASTERS |
查看网络、CPU 和内存统计信息 |
pulsenet.netstats.bar |
GAMEMASTERS |
切换指标 Boss 栏叠加显示 |
pulsenet.netstats.reset |
GAMEMASTERS |
将所有指标计数器重置为零 |
pulsenet.packetnames |
GAMEMASTERS |
列出观察到的数据包类名和通道 ID |
配置
配置命令根据每个配置值动态生成。下面的 <name> 对应 camelCase 配置键(例如 batchingEnabled、metricsUpdateInterval)。
| 节点 | 默认 | 描述 |
|---|---|---|
pulsenet.config |
GAMEMASTERS |
列出所有配置值 |
pulsenet.config.<name>.get |
GAMEMASTERS |
读取特定配置值 |
pulsenet.config.<name>.set |
GAMEMASTERS |
更改特定配置值 |
试试我的其他模组!
所有服务端 Fabric 模组——无需客户端安装。
支持与贡献
PulseNet 是 PulseMC 的一个开源项目。我们欢迎关于 Netty、Mixin 和协议级优化的贡献。
- Pulse Discord:加入我们的社区
- Boris 的 Discord:Boris 的模组 Discord
- 问题反馈:在 GitHub 上报告 bug
正在加载版本记录…
正在加载评论…
评论在新手盒子客户端中发表,这里同步展示。