一款极其激进且实验性的 Minecraft 服务器性能优化模组。
我们建议将 Sepals 与 Lithium 和 Async 搭配使用,以获得最佳性能。
首先,
Sepals 是一系列高度实验性的服务器端优化集合,专门针对 Minecraft 中 AI、实体处理和任务系统等非常具体的性能瓶颈。与 Lithium 提供广泛的“通用”优化不同,Sepals 专注于对少数极其耗时的原版机制进行深度重写——特别是村民大脑、青蛙行为、实体挤压、目标筛选和附近实体感知。
如果你运行大型农场、村民大厅、密集的怪物围栏,
或任何在小区域内存在数百/数千个实体的场景,
Sepals 通过避免原版最昂贵的 AI 操作,显著降低了游戏刻耗时。
如果你运行的是带有小型农场的普通 SMP 服务器,你可能不会注意到太大区别。
它是实验性的,并非每一项优化都保证与原版行为完全一致,
但在性能压力测试中,收益可能是巨大的。
目前,Sepals 与几乎所有模组兼容。
以下是经过验证的模组列表及其与最新 Sepals 版本的要求:
| 目标模组 | 所需目标版本 |
|---|---|
| Sodium | 全部 |
| Iris | 全部 |
| FerriteCore | 全部 |
| Krypton | 全部 |
| Lithium | >=0.18.0 |
| C2ME | \>=0.3.4.0.0 |
| Moonrise | \>=0.6.0-beta.1+45edfd7 |
| Async | \>=0.1.7+alpha.7-1.21.8 |
如果你不知道选择哪个版本,请使用优化模组的最新版本,因为 Sepals 会确保与它们的兼容性。
Sepals 不支持任何旧版本和快照版本的 Minecraft;所有错误修复和功能仅在新版本中提供。
当与 Async 一起使用时,
请手动比较使用 Sepals 和 Async 的性能,并编辑它们的配置,以找出哪些优化是值得的,
因为每台机器的结果都不同。
Sepals 相关功能:``enableSepalsEntitiesCramming``。
| 配置名称 | 允许值 | 默认值 |
|---|---|---|
| forceEnableSepalsPoi | 布尔值 | false |
| enableSepalsVillager | 布尔值 | true |
| enableSepalsFrogLookAt | 布尔值 | true |
| enableSepalsFrogAttackableSensor | 布尔值 | true |
| enableSepalsLivingTargetCache | 布尔值 | true |
| nearestLivingEntitiesSensorUseQuickSort | 布尔值 | true |
| enableSepalsBiasedLongJumpTask | 布尔值 | true |
| enableSepalsEntitiesCramming | 布尔值 | true |
| enableSepalsItemMerge | 布尔值 | true |
| enableSepalsQuickCanBePushByEntityPredicate | 布尔值 | true |
测试在飞喵提供的 Mars 服务器上进行,CPU:Intel i7-14700K;游戏内存:4G;操作系统:Ubuntu 24.04.1 LTS;
Minecraft 版本:1.21。
使用盒子缓存来防止过多的 'getOtherEntities' 调用
-- 注意 --
此功能会忽略每个实体的记分板/队伍谓词,
并可能导致意外行为。
此问题不会影响原版中的任何内容,除非使用命令方块。
-- 状态 --
默认启用
1390 个村民挤压在 7x7 空间内:
| 环境 | tickCramming | 百分比 (平均) |
|---|---|---|
| 原版 | 53.6 ms | 100 % |
| Lithium | 54.4 ms | 101 % |
| Sepals | 10.2 ms | 19 % |
| Sepals + Lithium | 8.5 ms | 15 % |
使用二分搜索替换原版加权随机
-- 警告 --
此功能可能不值得启用,
因为 Spark 证明在构建范围表时它比原版更慢,
即使二分搜索耗时接近 0 ms。
-- 状态 --
默认禁用
-- 警告 --
未经测试。
使用 Sepals 的长跳任务实现替换原版
如上所述,二分搜索几乎没有成本
sepals 实现将在生成目标的同时构建范围表
并使用 Catheter 替换 Java 流
同时,重新安排青蛙大脑中应该跳跃的条件,以获得良好的性能
-- 注意 --
此功能无法在游戏运行时更改
需要重启服务器才能应用更改
-- 状态 --
默认启用
800 只青蛙挤压在 7x7 空间内:
| 环境 | keepRunning | 百分比(平均) |
|---|
| 原版
(LongJumpTask) | 43.1 ms | 100 % |
| Lithium
(LongJumpTask) | 7.5 ms | 17 % |
| Sepals
(SepalsLongJumpTask) | 0.2 ms | 0.4 % |
| Sepals + Lithium
(SepalsLongJumpTask) | 0.05 ms | 0.1 % |
| 环境 | getTarget | 百分比(平均) | 百分比(在 ``keepRunning`` 中) |
|---|
| 原版
(LongJumpTask) | 43.1 ms | 100 % | 100 % |
| Lithium
(LongJumpTask) | 3.6 ms | 9 % | 48 % |
| Sepals
(SepalsLongJumpTask) | N/A ms | 0 % | 0 % |
| Sepals + Lithium
(SepalsLongJumpTask) | N/A ms | 0 % | 0 % |
使用 FastUtil 的快速排序替换 Java TIM 的排序
-- 状态 --
默认启用
800 只青蛙挤压在 7x7 空间内:
| 环境 | sort (NearestLivingEntitiesSensor#sense) | 百分比(平均) |
|---|---|---|
| 原版 | 3.8 ms | 100 % |
| Lithium | 3.6 ms | 94 % |
| Sepals | 2.2 ms | 57 % |
| Sepals + Lithium | 2.2 ms | 57 % |
重新安排可攻击条件
将成本最低的条件放在前面,
从而降低计算高成本条件的概率
-- 抱怨 --
Mojang 的可攻击谓词是:
!entity.getBrain().hasMemoryModule(MemoryModuleType.HAS_HUNTING_COOLDOWN)
&& Sensor.testAttackableTargetPredicate(entity, target)
&& FrogEntity.isValidFrogFood(target)
&& !this.isTargetUnreachable(entity, target)
&& target.isInRange(entity, 10.0)
在这种情况下,'Sensor#testAttackableTargetPredicate' 调用了 'TargetPredicate#test'
当一个区域内有太多实体时,这会导致大量的光线投射计算,
更糟糕的是,考虑到 Minecraft 的光线投射速度极慢
在这种情况下,'TargetPredicate#test' (800 只青蛙) 每游戏刻耗时 9.8ms,
而 'BlockView.raycast' 贡献了 7.3ms
因此,我将其改为:
FrogEntity.isValidFrogFood(target) &&
entity.getBrain().hasMemoryModule(MemoryModuleType.HAS_HUNTING_COOLDOWN) &&
target.isInRange(entity, 10.0) &&
Sensor.testAttackableTargetPredicate(entity, target) &&
isTargetUnreachable(entity, target);
'isValidFrogFood' 是一个简单的条件,它检查实体的 'frog_food' 标签
以及当实体是史莱姆时额外检查其大小是否为 1
'isInRange' 和 'hasMemoryModule' 也没问题,因为它们只计算一些简单的东西
-- 状态 --
默认启用
800 只青蛙挤压在 7x7 空间内:
| 环境 | 耗时 | 百分比(平均) |
|---|---|---|
| 原版 (FrogAttackablesSensor#matches) | 10 ms | 100 % |
| Lithium (FrogAttackablesSensor#matches) | 5.7 ms | 57 % |
| Sepals (SepalsFrogBrain#attackable) | 0.1 ms | 1 % |
| Sepals + Lithium (SepalsFrogBrain#attackable) | 0.1 ms | 1 % |
使用 'SepalsLivingTargetCache' 来提高目标搜索性能
你必须启用该选项,否则此功能与原版相同
-- 注意 --
光线投射在 TargetPredicate 测试中
位于 'findFirst' 在 LivingTargetCache 中,当输入谓词成功时
但如果后续条件失败,进一步计算这个就没有用了
因为即使 findFirst 找到了(光线投射成功)
但我们没有在后续上下文中使用这个结果
-- 状态 --
默认启用
800 只青蛙挤压在 7x7 空间内:
| 环境 | findFirst | 百分比 |
|---|
| 原版
(LookAtMobWithIntervalTask$$Lambda#findFirst) | 2.7 ms | 100 % |
| Lithium
(LookAtMobWithIntervalTask$$Lambda#findFirst) | 2.5 ms | 92 % |
| Sepals
(SepalsLookAtMobWithIntervalTask$$Lambda#findFirstPlayer) | 0.1 ms | 3 % |
| Sepals + Lithium
(SepalsLookAtMobWithIntervalTask$$Lambda#findFirstPlayer) | 0.1 ms | 3 % |
这是 Sepals 所做的:
1. 使用 Catheter 替换 Java 的 Stream,因为它在性能和可扩展性方面比 Stream 好得多
2. 缓存任务、活动、运行中的任务和记忆,以提高启动和更新任务的时间
3. 使用 sepals 复合任务替换原版复合任务
4. 尽可能寻找机会跳过更多的光线投射和无用的谓词
5. 使用 'SepalsLivingTargetCache' 替换原版缓存,以传感器刻中的成本换取在查找交互目标或注视实体任务中更低的成本
6. 重新安排谓词和额外的低成本谓词,目的是稍后执行高成本谓词,或者最好不执行,提前跳过剩余的高成本谓词
7. 复制并修改了来自 lithium 的 'SerializingRegionBasedStorage' 优化
8. 使用更具针对性的任务,不使用泛型来减少无用操作
9. 使用二分搜索列表替换哈希集搜索
-- 注意 --
建议将此功能与 Lithium 和 C2ME 一起使用以获得最佳性能
-- 警告 --
未经长期稳定性测试,仅一个月的运行显示目前正常
此功能尚未被证明与原版完全相同,
但也未出现统计上的差异
-- 状态 --
默认启用
800 个村民在中午挤压在 7x7 空间内:
| 环境 | Brain#tick (总计) | 百分比 | Brain#startTasks | 百分比(startTasks) | Brain#tickSensors | 百分比(tickSensors) | Brain#updateTasks | 百分比(updateTasks) | Brain#tickMemories | 百分比(tickMemories) |
|---|---|---|---|---|---|---|---|---|---|---|
| 原版 | 18 ms | 100 % | 9.3 ms | 100 % | 5.2 ms | 100 % | 3 ms | 100 % | 0.5 ms | 100 % |
| Lithium | 12.4 ms | 68 % | 4.8 ms | 51 % | 5.9 ms | 113 % | 1.2 ms | 40 % | 0.5 ms | 100 % |
| Sepals | 9.7 ms | 53 % | 3.6 ms | 38 % | 3.7 ms | 71 % | 2 ms | 66 % | 0.4 ms | 80 % |
| Sepals + Lithium | 10 ms | 55 % | 3.4 ms | 36 % | 3.7 ms | 71 % | 2.5 ms | 83 % | 0.4 ms | 80 % |
800 个村民在夜晚挤压在 7x7 空间内:
| 环境 | Brain#tick (总计) | 百分比 | Brain#startTasks | 百分比(startTasks) | Brain#tickSensors | 百分比(tickSensors) | Brain#updateTasks | 百分比(updateTasks) | Brain#tickMemories | 百分比(tickMemories) |
|---|---|---|---|---|---|---|---|---|---|---|
| 原版 | 16.7 ms | 100 % | 8.2 ms | 100 % | 6 ms | 100 % | 2 ms | 100 % | 0.5 ms | 100 % |
| Lithium | 10.2 ms | 61 % | 3.2 ms | 24 % | 6 ms | 113 % | 0.5 ms | 25 % | 0.5 ms | 100 % |
| Sepals | 9 ms | 53 % | 3.3 ms | 16 % | 4.7 ms | 78 % | 0.7 ms | 35 % | 0.3 ms | 60 % |
| Sepals + lithium | 8.7 ms | 52 % | 2.9 ms | 11 % | 4.6 ms | 76 % | 0.7 ms | 35 % | 0.5 ms | 100 % |
1172 只青蛙挤压在 3x3 空间内:
| 环境 | 耗时 | 百分比(平均) |
|---|---|---|
| 原版 (java.util.function.Predicate.lambda\$and\$0()) | 49.01 ms | 100 % |
| Sepals (com.github.cao.awa.sepals.entity.predicate.SepalsEntityPredicates$$Lambda/0x000002d8f116e000.test()) | 22.6 ms | 46 % |
友情链接: 网易我的世界 | 泰拉瑞亚 | ocent云计算 | 米饭Minecraft插件文档 | 友链合作
历史访问人数:135,480 | 历史访问人次:229,590
今日访问人数:20,946 | 今日访问人次:23,095
昨日访问人数:25,573 | 昨日访问人次:27,367
Copyright © 2019-2026 我的世界服务器列表站. All rights reserved.
❤ Powered by GermMC 京ICP备17023959号-6