性能优化与故障排查
高在线调优、异步线程错误和常见故障检查。
高在线调优顺序
先识别是哪一个模块造成峰值,再只调整该模块。不要同时把所有间隔拉长,否则很难判断效果来源。
PacketEvents 客户端季节色调
biome-spoof:
radius-chunks: 8
budget-chunks-per-tick: 8
packet:
max-chunks-per-packet: 64
- 在线人数多且分散:先把半径降到 6;
- 单轮区块处理过高:把共享预算降到 4~6;
- 普通 Paper 网络包偏大:把单包上限降到 32;
- 染色包为每个区块节写入单一目标群系调色板,不读取或修改服务端真实群系;旧
step-xz/step-y参数已忽略,无需再调节。
春季融雪
transition-melt-radius-chunks: 6
transition-melt-budget-per-tick: 512
transition-melt-block-check-budget-per-run: 4096
transition-melt-max-queued-chunks: 1024
max-chunk-refreshes-per-run: 4
卡顿时优先降低真实方块读取预算,其次降低列预算和玩家周围半径。队列上限控制内存与积压,区块刷新上限控制客户端重发和实体跟踪尖峰。
体温
event-interval-ticks: 40
condition:
nearby-heat-range: 3
体温每轮需要环境采样。高在线时可以把间隔改为 60~100 tick,或把冷热源搜索半径从 3 降到 2。HUD 会更新得更慢,但计算成本更稳定。
视觉与流星
visual-effects:
interval-ticks: 40
search-radius: 12
meteor-shower:
max-concurrent-showers: 6
视觉模块按玩家执行,在线数高时可提高刷新间隔、降低搜索半径。流星粒子很密集,生产服可把同时场数降到 2~4,但不要只减少尾迹到无法辨认。
Watchdog 卡顿应如何判断
线程转储中出现 LISeasons 不一定表示它是唯一根因。应区分:
- 直接阻塞点:当时线程真正卡住的位置;
- 负载放大器:高在线、区块加载、实体追踪压力下增加工作量的模块;
- 旁观调用:恰好在采样瞬间出现在堆栈,但并未造成长时间阻塞。
排查时保留完整 watchdog 报告、spark/timings、在线数、已加载区块数和同一时间段的 GC/网络信息。
TAB 异步线程报错
典型旧错误:
[TAB Scoreboard Thread/ERROR]
Thread failed main thread check: Cannot retrieve chunk asynchronously
CraftWorld.getHighestBlockYAt
TemperatureService.airConditionModifier
LISeasonsPlaceholderExpansion.temperature
直接原因是旧版温度占位符在 TAB 异步线程读取地表高度。1.0.65 使用玩家线程采样 + 异步只读快照。
处理:
- 删除
plugins/中重复或旧版 LISeasons Jar; - 放入 1.0.65;
- 完整重启;
- 在启动日志核对实际加载版本;
- 若仍出现,检查堆栈 Jar 名和行号是否确实来自 1.0.65。
普通玩家也会遇到旧版问题,只要 TAB 或其他插件从异步线程解析温度变量;与玩家是否 OP、是否假人无关。
26.2 不改变草地和树叶颜色
按顺序检查:
- LISeasons 是 1.0.65;
- PacketEvents 2.13.0 或更高兼容版本已成功启用;
- 服务端确实是受支持的 26.2 构建;
season-color.yml -> biome-spoof.packet.enable: true;- 对应季节的
season-switch为true; - 世界已在
worlds.allowed或enable-all: true,且不在denied; - 等待分批预算处理附近区块;
- 完整重启而不是热重载;
- 查找 PacketEvents 初始化、群系注册表解析或数据包发送错误。
PacketEvents 群系包失败时当前版本只关闭颜色模块,不会回退为 Bukkit/NMS 群系写入。客户端仍显示最后一次已经收到的视图,重新连接或让区块重新加载后恢复服务端真实群系外观。
冬季不结冰
检查:
water-cycle.enable;winter-freeze-chance-percent;- 当前世界和当前季节;
- 水是否为液位 0 的静水;
- 水上方是否为空气;
- 群系是否命中
freeze-exempt-biomes; - 玩家是否在搜索半径内;
- 区块是否已加载。
春季不融化
检查:
- 当前是否真的是春季,而不只是节气显示“立春”;
spring-melt-chance-percent;- 目标材料在
meltable-blocks中是否启用; melt-exempt-biomes;- 天然冰封群系保护;
- Dominion 领地保护;
- 融雪队列和每轮预算是否过低;
WATER结果要求原方块上方为空气。
流星雨没有出现
若控制台反复出现“流星轨迹粒子发送失败”与 missing required data class org.bukkit.Color,说明正在使用 1.0.69 或更早版本调用新版 FLASH 粒子契约。升级到 1.0.70 后完整重启服务器;只修改 season-events.yml 或仅执行重载不能替换旧 Jar 中的渲染代码。
- 确认事件 ID 是
meteor-night; - 模块
enabled: true; - 自然触发必须夏季、夜间;
- 世界环境默认只允许
NORMAL; - 世界名符合
allowed-worlds; - 未达到同时场数上限;
- 同一玩家没有仍在播放的流星雨;
- 客户端粒子不是“最少”;
- 抬头观察 90~150 格上空;
- 手动执行
/seasons event trigger meteor-night。
1.0.70 会自动给新版 FLASH 补充颜色,并把不支持的其他数据型自定义粒子降级为安全粒子。若升级后仍有相同警告,请在报错中附上完整的 missing required data class ... 类型、核心名称/版本及 meteor-shower.appearance 配置。
坠地率只有单颗 8%,奖励还要再通过 70% 掉落概率,没有奖励不代表高空流星未运行。
秋季树叶任务出现随机范围异常
若控制台出现 AutumnLeafColorEffect.paintNearbyLeaves 与 bound must be greater than origin,说明正在使用 1.0.70 或更早版本,并且玩家曾处于世界高度范围之外。升级到 1.0.71 并完整重启即可;新版会先修正采样高度,并在 Folia 中把真实树叶访问交给目标区域线程。
该修复不需要修改或删除 config.yml。若升级后仍出现同名异常,请确认控制台启用信息与 Jar 文件名均为 1.0.71,并附上新的完整堆栈和玩家所在世界的最低/最高高度。
GUI 打不开或图标异常
- 验证 YAML 缩进;
- 布局每行 9 个字符;
- 图标字符有定义;
- Material 存在;
slot在范围内;- 菜单大小是 9 的倍数;
- MiniMessage 标签闭合;
- 修改后执行
/seasons reload。
占位符为空
- 确认 PlaceholderAPI 已启用;
- 确认玩家在线且当前世界已启用;
- 刚加入时等待首份快照;
- 使用
/papi parse me %liseasons_season_name%测试; - 如果只有 TAB 为空,检查 TAB 刷新时机和它是否能解析内置扩展。
配置修改无效
- 确认编辑的是当前服务器
plugins/LISeasons/下文件,而不是源码资源。 - 执行
/seasons reload并观察 YAML 加载错误。 - PacketEvents、Jar、服务端版本变更必须完整重启。
festivals.yml -> global.enabled、global.festival-cooldown-seconds在 1.0.65 尚未接入加载逻辑;请逐项设置节日enabled。visual-effects.aurora.chance-percent在 1.0.65 尚未被极光渲染器读取。