回复:动物性能修复

回复:动物性能修复

阻止Re:Animal每tick发送寻路调试数据包,并限制其装饰性水生生物的Brain AI频率。

性能

Re:Animal 性能修复

这是一个针对 Minecraft 1.21.1 / NeoForge 的小型服务端修复模组。它针对 Re:Animal 0.6.0 引起的两个特定性能问题。它不添加任何物品、方块或实体——只是停止那些无意义的工作。

仅在服务端安装。客户端不需要它,客户端缺少它也不会阻止任何人加入:该模组不注册网络负载或注册表条目,因此在连接时无需协商。单人游戏和局域网世界运行集成服务端,因此在这些情况下需要将其安装在客户端实例中。


问题 1——生产环境中的寻路调试数据包

在原版 Minecraft 中,DebugPackets.sendPathFindingPacket 是一个空存根。它由 PathNavigation.tick() 调用,这意味着每个拥有路径的生物每 tick 都会调用一次——但方法体不执行任何操作,因为调试渲染是仅开发环境的功能。

Re:Animal 注入到该方法中并实现了实际发送。每次调用时,它会遍历世界中的整个实体列表来查找玩家,然后序列化该生物的完整 Path 并发送给每个玩家。在人口密集的服务器上,这是 tick 循环中开销最大的方法。

没有任何东西会消耗其结果:Re:Animal 自己的客户端数据包处理程序是一个空方法,因此每一条路径都会被编码、推送到网络栈、由客户端解码然后丢弃。

此模组在任何这些发生之前就取消了调用。

在从实际服务器获取的性能剖析中,这一个方法约占服务器线程的 15%,其中约 4% 是 Netty 事件循环上的 write(2) 系统调用。出站带宽也随之相应下降。

问题 2——装饰性生物上的 Brain AI

Re:Animal 的海星和海胆是近乎静止的装饰性动物,但它们每一个都运行着完整的 Brain AI——与村民和猪灵使用的系统相同——再加上 WaterBoundPathNavigation,并且每个 tick 都在运行。在同一个性能剖析中,仅海星的开销就超过了世界中所有僵尸、骷髅、苦力怕和蜘蛛的总和。

此模组可以将这种决策改为每 N 个 tick 运行一次(默认:每 4 个 tick 一次,按实体 ID 偏移,避免它们落在同一个 tick 上)。仅跳过 Mob.serverAiStep()。物理、移动、碰撞、伤害、氧气、繁殖计时器和消失检查仍然每个 tick 运行,因此生物行为正常——只是决策频率降低了。

问题 3——数量实在太多了

Re:Animal 将海星和海胆注册为 MobCategory.CREATURE,生成权重为 25,群体大小为 5–15,遍布所有海洋和海滩生物群系。这种组合比看起来更糟糕:

  • CREATURE 是 Minecraft 在填充新生成的区块时使用的类别,因此每个新海洋区块在世界生成时都会放置一个群体;
  • 原版海洋几乎没有 CREATURE 生成与之竞争,因此权重 25 主导了随机选择;
  • Animal 永远不会消失,因此随着玩家探索,种群只会不断增长。

以下设置可解决此问题:

  • despawnFarAway(默认开启)允许海星和海胆在距离所有玩家超过 128 格时像普通野生生物一样消失。被命名、被拴绳以及其他需要持久化的生物绝不会受到影响。这用于清理已经过度繁殖的世界。

配置

所有内容都可配置,每个修复都可单独关闭。配置文件是 NeoForge 的 SERVER 配置,首次启动时生成。

[pathfinding_debug]
    disablePathfindingDebugPackets = true

[ai_throttle] aiThrottleInterval = 4 # 0 或 1 禁用节流 aiThrottleEntities = ["reanimal:starfish", "reanimal:sea_urchin", "reanimal:pigeon"] skipAiWhenNoPlayerNearby = false playerRadius = 24

[despawn] despawnFarAway = true despawnFarAwayEntities = ["reanimal:starfish", "reanimal:sea_urchin"]

aiThrottleEntities 是一个简单的实体 ID 列表,因此节流功能实际上并不绑定于 Re:Animal——你可以将其指向任何人们不会密切观察行为的装饰性生物。不要将其指向敌对生物、宠物或坐骑。

兼容性

所有三个 mixin 都针对原版类(DebugPackets、Mob、Animal),而非 Re:Animal 自身的类,因此 Re:Animal 的更新不会导致它们失效。如果未安装 Re:Animal,则 DebugPackets mixin 根本不会被应用。

一个已知的交互:Moonlight Lib 也注入到 sendPathFindingPacket 中,用于其 /moonlight debug pathfinding 渲染器。该渲染器在操作员显式启用之前不会做任何事情,但只要 disablePathfindingDebugPackets 为 true,它就不会显示任何内容。如果你需要它,请将该选项设置为 false。

许可证

MIT。此模组不包含 Re:Animal 的代码。