
回复:动物性能修复
阻止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 的代码。
正在加载版本记录…
正在加载评论…
评论在新手盒子客户端中发表,这里同步展示。