跳到正文

DoesPotatoTick?

作者:_nArUTo_

一种让远离玩家的实体停止运行的性能优化模组。

收藏

介绍

介绍由机器翻译自 CurseForge 原页面,仅供参考。

DoesPotatoTick — 概览

DoesPotatoTick 通过暂停(“冻结”)不需要每个 tick 都更新的远处实体来提升性能。借助可配置的规则和安全检查,它可以降低服务器 CPU 负载,并且还可能提高客户端 FPS,同时保持正常的游戏行为。


1. 用途

Minecraft 每秒会更新每个实体 20 次,这可能会让拥有大型世界、众多玩家或大型整合包的服务器负载过高。原版设置无法区分重要实体和无关实体。
DoesPotatoTick 引入了一个受控系统,只更新必要的内容。


2. 核心机制

每个实体都会被分配一个 可更新 状态。服务器会根据位置、类别和上下文在每个 tick 评估该状态;客户端则可以选择跳过不可更新实体的渲染。

2.1 基于距离的激活

  • 玩家会定义一个活跃区域(可配置的区块半径)。
  • 位于该区域之外的实体会成为暂停候选对象。
  • 只有当玩家在区块之间移动、登录或切换维度时,区域才会更新。

2.2 维度与领地支持

  • 可以将优化限制在选定的维度中。
  • 已声明区域(FTB Chunks、OpenPartiesAndClaims)中的实体始终会更新。
  • 如果未安装领地模组,玩家会收到通知。

2.3 实体例外

某些实体永远不会被冻结:

  • 玩家、下落中的方块、原版 Boss
  • 大量模组 Boss 和机械系统
  • 整个模组都可以加入白名单
    配置发生变化时,列表会自动重新加载。

2.4 筛选规则

可配置的规则允许忽略或包含以下对象:

  • 敌对生物、动物、灾厄
  • 掉落物
  • 投射物(可选逻辑会强制命中目标进行更新)
    正在死亡的实体可以完成其死亡过程。

2.5 刷怪塔检测

系统会定期扫描区块中的实体密度;如果检测到类似刷怪塔的模式,就会强制相关实体进行更新,以确保刷怪塔继续正常运行。

2.6 袭击处理

在进行中的袭击期间,可以根据配置禁用或调整优化。


3. 客户端功能

3.1 跳过渲染

不可更新的实体可能会被隐藏,以提高 FPS。
拉弓时会临时重新启用渲染,从而避免瞄准问题。

3.2 Embeddium 集成

安装 Embeddium 后,会添加一个专用的配置界面。

3.3 同步

轻量级数据包会告知客户端哪些实体应该显示。


4. 配置

  • doespotatotick-common.toml:服务器核心行为
  • doespotatotick-client.toml:渲染控制
  • 默认设置优先考虑安全性和兼容性。
  • 所有逻辑都在服务器线程上运行;更改会在各个 tick 和重新加载过程中保持一致地生效。

5. 让 DPT 变得更好

如果你:

  • 觉得某种特定的实体类型不应该停止更新
  • 有配置选项方面的需求
  • 因实体更新被冻结而遇到意外情况

欢迎通过 GitHub Issues 或电子邮件 [email protected] 联系我


6. 设计考量

该模组旨在:

  • 降低服务器负载,同时不改变游戏玩法
  • 保留 Boss 战、农场和模组机制
  • 继续兼容现有的模组生态

它的行为更像是一套受控且具备上下文感知能力的调度系统,而不是简单的“禁用远处实体”开关。


7. 一点历史与演变

DoesPotatoTick 并不是一开始就拥有如今这样完善的表现。

它最初是 Txni 的 DoesItTick 的一个分支,纯粹是为了给锂/RoadRunner 生态提供临时兼容性修复。最初的版本说实话相当粗糙:只有少数几个配置选项,而且每一个实体在每一次 tick 中,都会遍历所有在线玩家,检查“有没有人在足够近的地方?”
这意味着每 tick 都要执行 O(实体数量 × 玩家数量) 次操作——在一台拥有 2 万个实体和 50 名玩家的服务器上,仅这一项每秒就会额外增加数百万次不必要的迭代。简直是纯粹的暴力。

旧版的 dpt$checkAlwaysTick() 同样令人头疼:它每 tick 都会对每个实体执行开销很高的配置和标签检查,而且完全没有缓存。
客户端也没有任何渲染修复——被冻结的实体只会在原地卡顿并“鬼影”般闪烁,看起来就像坏掉了一样。

当我们更新这个模组后,一切都发生了改变:

  • 用现在的 PlayerTracker 替换了天真的玩家遍历逻辑:它使用维度 → 区块 → Y 范围的空间映射,并且只在玩家移动时延迟更新。复杂度从 O(n×m) 降低到了每次更新基本为 O(玩家数量)。
  • 现在,alwaysTick 标志会在实体类型注册时计算一次,并永久缓存。
  • 加入了完善的网络数据包和客户端实体剔除机制(以及拉弓保护机制),因此被冻结的实体会干净利落地消失,而不是出现故障。
  • 生物农场检测、袭击感知、领地模组集成、Embeddium GUI……这些功能在当时全都不存在。

如今的 DoesPotatoTick 已经不再只是“又一个实体剔除模组”。它经历了多次完整重构,凝聚了我们对正确实现这一目标的执着——同时绝不破坏你的 Boss、农场或机械动力装置。

感谢 Txni 带来的最初灵感,也感谢每一位测试者和贡献者,以及帮助我设计、编写和润色这篇介绍的 Grok 和 ChatGPT(我一个人写 README 的时候真的已经累得不行了,哈哈)。


享受黄油般顺滑的 tick 吧(或者说,享受没有 tick 的顺滑感)!

评论

登录后评论和评分

_nArUTo_ 的其他作品

查看全部 →