Kinetic - Lag Preventer

适用于 Paper 1.21+ 的性能优化器,具有 AI 节奏控制、实体堆叠和数据包控制。

资源图片
**Kinetic** 是一个为 Paper 服务器 (1.21+) 提供的性能和游戏玩法优化器。 它通过智能控制 AI、合并实体、限制数据包、以及优化服务器机制来减少延迟——所有这些都不需要分叉或核心修改。 一些特性可以选择性地与 **ProtocolLib** 集成以实现高级数据包处理。 如果未安装 ProtocolLib 并且 `protocollib-required` 在配置文件中启用,则分层数据包模块将自动禁用。 --- ## 关键特性 * **实体、物品和 XP 合并** * 可配置每个生物类型、材质或 XP 球的堆叠大小。 * 可选的全息图显示 `{amount}`、`{name}`、`{material}`、`{type}`。 * 支持按玩家剔除,全息图随拥有者消失。 * **动态 AI 预算器 (DAB)** * 距离和优先级感知 AI 节奏控制。 * TPS 适应和抖动注入以防止延迟峰值。 * 实体远离玩家的冻结系统,并使用 FOV/LOS 指标。 * **生成控制** * 每个区块的软上限,按类别划分。 * TPS 保护,当服务器掉落到阈值以下时拒绝生成。 * 玩家活动区域以外的远距离拒绝生成。 * **漏斗和区块优化** * 批量漏斗移动,每刻上限。 * 减慢玩家远离时流体更新、植物生长、落叶腐烂和活塞动作的速度。 * **数据包限制 (需要 ProtocolLib)** * 隐藏远离的实体,限制声音和粒子效果,控制区块传输速度,进行空闲压缩。 * 减少客户端负载的同时保持游戏玩法正确性。 * **仅插件实体剔除** * 使用 `Player#hideEntity`/`showEntity` 并设置每刻预算。 * 全息图集成确保每个玩家的一致性。 --- ## 工作原理 | 子系统 | 目标 | 技术 | | ------------------ | ------------------------------ | -------------------------------------------------------------------------- | | **合并** | 减少实体数量 | 合并生物、物品和 XP;可配置堆叠大小和全息图 | | **AI 预算** | 平滑每刻负载 | 距离加权、动作倍增器、TPS 缩放、抖动、冻结 | | **生成** | 防止失控实体 | 每个区块上限、基于 TPS 的拒绝、距离拒绝 | | **区块/漏斗** | 限制红石/机器成本 | 漏斗批处理、活塞上限、生长/腐烂节奏 | | **数据包** | 减少带宽 + 客户端压力 | 隐藏远离实体、限制声音/粒子效果、控制区块传输速度、元数据限制 | | **追踪器** | 安全的插件端剔除 | 基于玩家的隐藏/显示,与全息图集成 | --- ## AI 预算曲线示例 当 `activation-dist-mod: 8` 并且 `power: 2.0` 时,距离小于 8 格的实体几乎每游戏刻一次进行 tick,而远处的实体 tick 频率较低。 曲线是非线性的,更倾向于附近的生物: ``` 距离 (格) | 相对 Tick 频率 ------------------|------------------- 0–8 | 100% 16 | ~50% 32 | ~25% 64+ | ~10% 或冻结 (如果启用) ``` 这确保了战斗生物对玩家响应迅速,而其他生物消耗的 CPU 资源很少。 --- ## 配置文件 `config.yml` 具有完全注释且模块化的结构。 关键模块包括: * `merging` – 实体/物品/XP 堆叠和全息图。 * `dab` – 带有冻结、FOV/LOS、排除项的动态 AI 预算器。 * `spawns` – 上限、TPS 保护、远距离规则。 * `hoppers`、`blocks` – 技术机制的时序和批处理。 * `packets` – 数据包限制 (需要 ProtocolLib)。 * `tracker` – 仅插件按玩家可见性。 * `performance` – 全局刻预算分配。 --- ## 安装 1. 将 `Kinetic.jar` 放入 `plugins/` 目录。 2. 启动服务器以生成默认的 `config.yml` 文件。 3. 调整模块以适应你的玩家群和服务器类型。 4. 如果你想要高级数据包特性,安装 **ProtocolLib**。 --- ## 兼容性 * 需要 **Paper 1.21+**。 * 数据包特性需要 **ProtocolLib**。 * 所有其他系统仅插件运行,不需要分叉或补丁。 --- ## 为什么选择 Kinetic? 与轻量级堆叠器或一次性优化器不同,Kinetic 是 **模块化**、**安全**和 **可伸缩** 的。 它将常见的减慢延迟模式整合到一个连贯的系统,具有每个世界的预算、每个玩家的可见性和与 TPS 相关的自适应节奏。 结果: 更流畅的游戏体验、更高的刻率和更干净的服务器,而不会牺牲机制。 --- ## 许可和贡献 * 对于错误、性能报告或功能请求,请提交问题。 * 欢迎通过 PR 或配置文件配方分享进行贡献。 * 许可信息提供在仓库中。 ---
Спойлер ``` version: 1 # 这主要 Kinetic 的配置。注释解释了每个选项的作用, # 预期单位/范围以及任何权衡。 # 距离 & 最近玩家缓存 (模块 1) # 基于网格的缓存,用于预算引擎和其他模块快速 # 近似最近玩家距离。参见设计文档 §6.1。 proximity: cell-size: 32 # 每个网格单元的方块 move-threshold: 1.25 # 触发单元更新的最小玩家移动量 neighbor-radius-cells: 2 # 要搜索的相邻环数 track-cross-world: false # 如果为 false,仅考虑同一个世界的玩家 # 动态 AI 预算器 (模块 3)。 将 AI 操作控制在刻预算内。 dab: enabled: true activation-dist-mod: 8 # 距离乘数,用于考虑实体相对于玩家的“活动” power: 2.0 # 优先级衰减的非线性形状;较高值更倾向于附近的实体 base-period-ticks: 1 # 未受约束时的默认周期 min-period-ticks: 1 # 下限;永远不要比这个更频繁地安排 AI max-period-ticks: 40 # 上限;永远不要延迟 AI 多于此 blacklist-entities: [] # 始终 throttling 的实体类型名称(即使已列入白名单) whitelist-entities: [] # 如果非空,仅这些实体类型被预算器考虑 exempt-nametagged: true # 带名称的生物被视为重要;不太可能被 throttling exempt-tamed: true # 驯服的生物被视为重要;不太可能被 throttling # 每个世界的预算系统 - 高级世界级资源分配 per-world-budgets: enabled: false # 启用每个世界的单独预算池 default-budget: 2500 # 未明确配置的默认世界预算 worlds: # 特定世界预算覆盖 # world: 5000 # 示例:主要世界较高的预算 # world_nether: 1500 # 示例:地狱较低的预算 # world_the_end: 1000 # 示例:末地最小预算 # 特定玩家的排除 - 高级玩家绕过系统 player-exemptions: enabled: false # 启用个人玩家排除系统 exempt-ops: true # 操作员自动排除 exempt-names: # 需要排除的特定玩家名称 # - "AdminPlayer" # - "BuilderUser" exempt-permissions: # 授予排除的权限 - "Kinetic.budget.exempt" # - "staff.moderator" exempt-patterns: # 玩家名称的正则表达式模式(不区分大小写) # - "^Admin.*" # 以“Admin”开头的玩家 # - ".*Builder$" # 以“Builder”结尾的玩家 hard-freeze: enabled: false min-player-distance: 64 # 超出此距离的实体可能被冻结(停止 AI) recheck-period-ticks: 40 # 重复评估冻结资格的时间 max-entities-per-tick: 400 # 每次传递处理的最大实体数 fov: enabled: true fov-degrees: 110 # 玩家视野角度大小用于可见性考虑 require-los: true # 确定可见性时需要视线 max-distance: 96 # 用于 FOV 检查的最大距离 wake-on-damage: enabled: true duration-ticks: 80 # 受损时暂时解冻 always-active-types: [] # 永远不会冻结的实体类型;例如,如果需要 VILLAGER per-action-multipliers: PATHFIND: 1.0 TARGET: 1.2 BREED: 2.0 REPLENISH: 2.0 ANGER: 1.5 tps-adaptation: enabled: true threshold: 18.5 # 在此 TPS 以下,增加 throttling 积极性 multiplier: 1.5 # 当 TPS 低于阈值时应用的比例 jitter: enabled: true percent: 0.1 # 稍微随机化周期以避免 burst 对齐 cleanup-interval-ticks: 1200 # 定期清除内部簿记 # 生成控制。 提供每个区块的软上限和距离/TPS 保护。 spawns: enabled: true per-chunk-soft-cap: MONSTER: 70 # 每个区块类别的近似软上限 CREATURE: 50 WATER_AMBIENT: 30 tps-guard: enabled: true threshold: 18.5 # 在此 TPS 以下,拒绝一部分否则允许的生成 denial-percent: 0.35 # 在 TPS 低于阈值时拒绝的生成比例 (0..1) far-deny: enabled: true min-player-dist: 96 # 拒绝玩家活动区域以外的生成 merging: entities: enabled: false # 搜索半径 (方块) 用于生物的 spawn radius: 8.0 # 除非在 per-type 下进行覆盖,否则每个实体类型的最大堆叠大小 max-stack-size: 32 # 可选的在堆叠生物上设置自定义名称(可选视觉)。 show-name: true # 不要堆叠已经有自定义名称的生物。 skip-named: true # 可选的允许/拒绝控制。 如果 whitelist 不为空,则仅会堆叠这些类型。 # 类型为 Bukkit EntityType 名称,例如,ZOMBIE、SKELETON、CREEPER 等。 whitelist-types: [] blacklist-types: [VILLAGER, ENDER_DRAGON, WITHER, WARDEN, ELDER_GUARDIAN, IRON_GOLEM] # 永远不要堆叠这些类型 # 每个类型的覆盖 per-type: SLIME: max-stack-size: 8 MAGMA_CUBE: max-stack-size: 8 hologram: enabled: true # 实体上方的垂直偏移量。 根据版本/模型进行调整。 offset: 0.75 # 没有 per-type 覆盖时使用的基本格式。 # 占位符: # - {amount}: 堆叠大小(支持以下样式) # - {type}: Bukkit EntityType 漂亮名称(例如,“僵尸”) format: "x{amount}" # {amount} 的格式样式: plain | thousands | compact # - plain: 1200 # - thousands: 1,200 # - compact: 1.2k format-style: plain # 可选的 per-实体类型覆盖。 Key 为 Bukkit EntityType 名称. # 示例: # per-type: # ZOMBIE: "{type} x{amount}" # SKELETON: "{type} x{amount}" per-type: {} items: enabled: true # 物品实体的搜索半径 (方块)。 radius: 2.5 # 如果为 true,则仅具有相同的元数据(lore、enchant、model data)的物品才能堆叠在一起。 respect-metadata: true # 以友好的方式在后台扫描附近的实体;世界修改仍然在主线程上。 async-scan: true # 允许物品实体在地面上超出经典堆叠大小(库存堆叠不受影响)。 allow-oversize: false # 合并计数上限(视觉 + 物理)用于一个物品实体。 库存堆叠不受影响。 max-entity-stack: 512 hologram: enabled: true # 实体上方的垂直偏移量。 根据版本/模型进行调整。 offset: 0.75 # 没有 per-material 覆盖时使用的基本格式。 # 占位符: # - {amount}: 堆叠大小(支持以下样式) # - {material}: Bukkit Material 漂亮名称(例如,“钻石”) # - {name}: 如果存在显示名称,否则为 {material} 的物品显示名称 format: "x{amount}" # {amount} 的格式样式: plain | thousands | compact format-style: plain # 可选的 per-material 覆盖。 Key 为 Bukkit Material 名称。 # 示例: # per-material: # DIAMOND: "{name} x{amount}" # COBBLESTONE: "{material} x{amount}" per-material: {} xp: enabled: true # XP 球的搜索半径 (方块)。 radius: 3.0 # 分裂/合并时最大经典 XP 球大小(典型的最大值为 11)。 max-orb-size: 11 hologram: enabled: true offset: 0.75 # 占位符: # - {amount}: 总 XP 值(支持以下样式) # - {type}: 常量 "XP" format: "{amount} xp" # {amount} 的格式样式: plain | thousands | compact format-style: plain blocks: # 对区块更新的节奏控制,以防止当玩家远离时出现级联。 # 更高的冷却时间降低了 churn 但延迟了传播。 physics-cooldown-ticks: 3 # 当玩家远离时,减慢流体更新速度以减少服务器负载。 throttle-fluids: true # 叶子腐烂的速度:立即 | 推迟 | 推迟_远。 推迟_远在玩家不靠近时延迟。 leaves-decay: defer_far # 植物生长节奏:立即 | 推迟 | 推迟_远。 plant-growth: defer_far pistons: # 限制每刻并发活塞动作以减轻机器负载。 limit-per-tick: 2 # 检测并抑制活塞引擎模式。可能影响红石装置;请谨慎使用。 anti-engines: false hoppers: # 漏斗优化模块:批量和限制每刻移动以减少每刻成本。 enabled: true # 在此刻窗口中批量执行拉动/推动操作以获得更好的局部性。 batch-window-ticks: 4 # 所有漏斗的每刻移动全局上限。 max-moves-per-tick: 128 # 漏斗周围扫描物品实体的半径。 pickup-scan-radius: 1.0 async: # 用于安全 async 任务的工作线程池大小。 通常 = CPU 核心 / 2.. 核心。 worker-threads: 2 # 增强型 WorkerPool 配置 core-threads: 4 # 核心线程数 max-threads: 8 # 繁忙时的最大线程数 max-queue-size: 100 # 队列中任务达到最大大小时的拒绝大小 # 任务超时设置 task-timeout-ms: 30000 # 默认任务超时 (30 秒) keep-alive-time-ms: 60000 # 线程存活时间 (1 分钟) queue-warning-threshold: 0.8 # 队列利用率警告阈值 (80%) # 监控和健康检查 monitoring: enabled: true # 启用全面的监控 health-check-interval-ms: 300000 # 定期健康检查 (5 分钟) # 超载时应重试的任务的后备执行 fallback-execution: true # 在池超载时执行拒绝的任务到主线程中作为后备 # 性能优化 allow-core-timeout: true # 允许核心线程超时并终止 thread-priority-offset: -1 # 线程优先级偏移量相对于正常 ( -1 = 略低于) packets: # 基于数据包的优化。 有些特性需要 ProtocolLib。 enabled: false # 如果为 true,则当缺少 ProtocolLib 时,需要 ProtocolLib 的功能将被禁用。 protocollib-required: true hide-far-entities: # 隐藏玩家以外的实体以减少客户端负载(服务器权威)。 enabled: true # 距离阈值,以方块为单位。 max-distance: 96 # 不要隐藏玩家实体。 exempt-players: true # 不要隐藏玩家拥有的驯服的生物。 exempt-tamed: true sound-throttle: # 限制重复相同的声音每刻的数量,以减少垃圾邮件。 enabled: true # 每个玩家每刻的声音包上限。 max-per-tick: 5 # 可选的 spatial 去重:限制每个刻时相同位置的重复相同声音 de-duplicate: enabled: true bucket-radius: 8 max-per-bucket: 2 particle-throttle: # 通过集群限制粒子包速率。 enabled: true # 每个刻时附近集群的最大包数。 max-per-cluster: 20 chunk-streaming: # 控制区块数据包,避免加入/快速旅行时的突发情况。 enabled: true # 允许每个刻时传输更多的区块以防止初始渲染或快速旅行受限 max-per-tick: 8 # 不要在新玩家加入时 throttling 区块包以保证世界引导 warmup-ticks: 200 prioritize-player-heading: true # 仅当 TPS 低于此阈值时启用 throttling tps-guard: enabled: true threshold: 18.5 # 逐渐提升加入后的每个玩家配额,以避免突发 ramp: enabled: true base: 4 max: 8 step: 1 period-ticks: 40 metadata-rate-limit: # 限制频繁的实体元数据更新;白名单关键索引以避免 desync enabled: false # 实体之间的时间间隔 (刻数),用于元数据更新。 interval-ticks: 5 # 始终通过率限制的元数据索引(跳过正常速率限制),以避免 desync。 # 常见索引:0=标志,1=空气,2=自定义名称,3=自定义名称可见,4=静音,5=无重力,等等。 # 根据需要调整版本。 将空白留空不绕过任何内容。 whitelist-indexes: [0, 1] player-idle-compression: # 当玩家在阈值之外不活动时,缩放响亮/视觉包预算。 enabled: true # 在阈值之外被认为是空闲的秒数。 idle-threshold-seconds: 60 # 当玩家空闲时,缩放每个刻时的包上限 sound-scale: 0.5 # 0.05..1.0,乘以声音 max-per-tick particle-scale: 0.5 # 0.05..1.0,乘以粒子 max-per-cluster performance: # 每个刻的全局工作预算(内部单位)。 较低 = 更严格的 throttling。 tick-budget-per-tick: 5000 priorities: # 每个子系统的相对预算份额。 较高 = 分配更多时间。 AI: 40 HOPPERS: 30 PHYSICS: 30 shared-budget: # 如果启用,一个子系统中未使用的预算可以被其他子系统借用。 enabled: false AI: 40 debug: # 额外的日志记录用于诊断;增加了控制台垃圾邮件。 verbose: false # 在启用时,采样事件的概率 [0..1]。 sampling-rate: 0.05 # 启用游戏内管理员命令进行调试。 commands-enabled: true # 插件级别的实体可见性剔除(近似 async 追踪器行为) tracker: visibility: enabled: false radius: 96.0 exempt-players: true include-types: [] # 如果非空,则仅将这些 Bukkit EntityType 名称 considered exclude-types: [ITEM_FRAME, PAINTING] # 永远不要考虑用于 hide/show 决策 max-players-per-tick: 4 # 每个刻处理的最大隐藏/显示操作数 max-ops-per-tick: 400 # 运行可见性传递的频率。 period-ticks: 20 # 如果为 true,全息图 ArmorStands 也会遵循相同的规则进行隐藏/显示。 # 这可以防止为正在剔除的玩家呈现全息图。 integrate-holograms: true # 区域配置文件和集成 regions: worldguard: # WorldGuard 区域 ID 列表,在此处禁用数据包抑制 exempt-packets: [] # TickService 配置 tick-service: # TPS 监控设置 tps-monitoring: # 启用实时 TPS 监控和计算 enabled: true # 当低于此阈值时发出警告的 TPS 阈值 (默认:15.0) warning-threshold: 15.0 # 健康检查设置 health-checks: # 启用 tick 服务的全面健康监控 enabled: true # 在触发健康警告之前允许丢失的最大刻数 (默认:100) max-missed-ticks: 100 ```