搜索

性能优化与故障排查

高在线调优、异步线程错误和常见故障检查。

高在线调优顺序

先识别是哪一个模块造成峰值,再只调整该模块。不要同时把所有间隔拉长,否则很难判断效果来源。

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 使用玩家线程采样 + 异步只读快照。

处理:

  1. 删除 plugins/ 中重复或旧版 LISeasons Jar;
  2. 放入 1.0.65;
  3. 完整重启;
  4. 在启动日志核对实际加载版本;
  5. 若仍出现,检查堆栈 Jar 名和行号是否确实来自 1.0.65。

普通玩家也会遇到旧版问题,只要 TAB 或其他插件从异步线程解析温度变量;与玩家是否 OP、是否假人无关。

26.2 不改变草地和树叶颜色

按顺序检查:

  1. LISeasons 是 1.0.65;
  2. PacketEvents 2.13.0 或更高兼容版本已成功启用;
  3. 服务端确实是受支持的 26.2 构建;
  4. season-color.yml -> biome-spoof.packet.enable: true;
  5. 对应季节的 season-switch 为 true;
  6. 世界已在 worlds.allowed 或 enable-all: true,且不在 denied;
  7. 等待分批预算处理附近区块;
  8. 完整重启而不是热重载;
  9. 查找 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 刷新时机和它是否能解析内置扩展。

配置修改无效

  1. 确认编辑的是当前服务器 plugins/LISeasons/ 下文件,而不是源码资源。
  2. 执行 /seasons reload 并观察 YAML 加载错误。
  3. PacketEvents、Jar、服务端版本变更必须完整重启。
  4. festivals.yml -> global.enabled、global.festival-cooldown-seconds 在 1.0.65 尚未接入加载逻辑;请逐项设置节日 enabled。
  5. visual-effects.aurora.chance-percent 在 1.0.65 尚未被极光渲染器读取。

返回首页