创建:时钟控制

创建:时钟控制

创建Tick控制优化智能方块实体,使tick优化在服务端和客户端生效。

创建

Create Tick Controller

Create 模组的高级性能优化

Create Tick Controller 是一款强大的服务端性能优化模组,可动态控制 Create 模组机械组件的 Tick 速率。专为大型工厂建设和服务器环境设计,通过智能节流方块实体更新来防止 TPS 下降,同时保持客户端的视觉同步。


目录

  1. 功能概览
  2. 工作原理
  3. 性能基准测试
  4. 安装方法
  5. 命令参考
  6. 配置指南
  7. 技术深入解析
  8. 最佳实践
  9. 常见问题解答

功能概览

核心功能

功能 描述
全局 Tick 除数 一次性降低所有 Create 方块实体的 Tick 频率
按类型除数 针对特定机器类型微调 Tick 速率(例如,仅降低磨盘的速度)
黑名单系统 保护关键机器免受全局节流影响
动态 TPS 控制 使用可配置公式根据服务器 TPS 自动调整 Tick
紧急 MSPT 保护 服务器负载过高时激活的安全网
客户端动画同步 动画在视觉上反映实际 Tick 速率——无不同步问题
网络同步 所有设置自动同步到连接的客户端

支持的方块实体(80+ 种)

类别 示例
动力系统 传送带、齿轮箱、传动轴、离合器、换挡器、飞轮……
加工设备 磨盘、粉碎轮、锯片、搅拌器、动力压制机……
物流系统 漏斗、滑槽、机械臂、投掷器、打包机……
流体系统 泵、管道、软管卷筒、喷口、流体储罐……
动态装置 轴承、滑轮、活塞、龙门架、升降机……
红石系统 辉光管、显示链接、红石链接……
列车系统 车站、信号灯、轨道、列车控制……

工作原理

Tick 除数概念

游戏 Tick 1 2 3 4 5 6
正常(无除数) TICK TICK TICK TICK TICK TICK
除数 = 3 TICK SKIP SKIP TICK SKIP SKIP
除数 执行的 Tick 跳过的 Tick CPU 负载降低
3 1 / 3 2 / 3 ~66%

关键洞察:除数为 3 意味着方块实体仅每 3 个 Tick 处理一次,将该实体类型的 CPU 负载降低约 66%。

分布式 Tick 调度

为防止延迟峰值,所有实体不会在同一帧进行 Tick。相反,它们使用基于位置的偏移进行分布:

除数 = 4,四个传送带段位于不同位置:

游戏 Tick 1 2 3 4 5 6 7 8 9 10 11 12
传送带 A TICK TICK TICK
传送带 B TICK TICK TICK
传送带 C TICK TICK TICK
传送带 D TICK TICK TICK

结果:负载均匀分布在所有 Tick 上!

客户端动画同步

该模组使用 Mixins 在客户端拦截动画计算:

服务器:方块以 1/4 速度 Tick(除数=4)
   ↓
网络:除数同步到客户端
   ↓
客户端:动画速度 = 原始速度 / 4
   ↓
视觉效果:齿轮转动速度慢 4 倍,与实际处理速度一致

性能基准测试

测试环境

硬件:       Intel i7-10700K, 32GB RAM, NVMe SSD
Minecraft:      1.21.1 (NeoForge)
Create 模组版本: 6.0.8 和 6.0.9
测试世界:     超平坦世界,配有受控工厂布局

基准测试 1:大型传送带网络

设置:500 个传送带段循环运送物品

除数 MSPT TPS CPU 使用率 物品/秒 效率
1 78.5 12.7 94% 1000 100.00%
2 52.3 19.1 71% 500 50.00%
4 38.1 20.0 52% 250 25.00%
8 31.2 20.0 43% 125 12.50%
16 27.8 20.0 38% 62 6.25%

基准测试 2:加工工厂

设置:50 个磨盘 + 50 个机械压制机 + 100 个漏斗

除数 MSPT TPS 吞吐量 备注
1 89.2 11.2 100.00% 无法游玩的延迟
2 58.7 17.0 50.00% 明显改善
4 41.3 20.0 25.00% TPS 完全恢复
8 33.6 20.0 12.50% 对此设置过大

基准测试 3:混合工厂(真实场景)

设置:带有列车、加工和物流系统的完整工厂

  • 200 个传送带段
  • 30 个机械臂
  • 40 个漏斗
  • 20 个磨盘
  • 10 个粉碎轮
  • 5 个有活跃列车的车站

*优化配置:

配置 MSPT TPS 描述
无模组 125.4 8.0 严重延迟,无法游玩
全局除数 = 4 45.2 20.0 可游玩,处理速度慢
优化的按类型配置 38.7 20.0 最佳平衡
紧急模式激活 42.1 20.0 负载高时自动调整

示例:优化的按类型除数

组件 除数
传送带 2
机械臂 4
磨盘 8
粉碎轮 4
漏斗 2

MSPT 降低图表

MSPT 按除数的改进(200 个方块实体)
125 ─┤ ██████████████████████████████████████████ 基准线
     │
100 ─┤ ██████████████████████████████████ 除数=2 (-20%)
     │
 75 ─┤ ████████████████████████████ 除数=3 (-40%)
     │
 50 ─┤ ██████████████████████ 除数=4 (-56%)
     │
 40 ─┤ █████████████████ 除数=6 (-68%)
     │
 30 ─┤ █████████████ 除数=8 (-76%)
     │
 25 ─┤ ██████████ 除数=12 (-80%)
     │
 20 ─┤ ████████ 除数=16 (-84%)
     ├──────────────────────────────────────────────
        0    25    50    75   100   125  MSPT
除数 MSPT 备注
1 125 基准线
2 100 除数=2 (-20%)
3 75 除数=3 (-40%)
4 50 除数=4 (-56%)
6 40 除数=6 (-68%)
8 30 除数=8 (-76%)
12 25 除数=12 (-80%)
16 20 除数=16 (-84%)

CPU 时间分布

类别 无模组 (%) 除数=4 (%)
Create 方块实体 45% 12%
世界 Tick 22% 22%
实体处理 18% 18%
其他 15% 15%
余量 0% 33%

安装方法

系统要求

  • Minecraft 1.21.1
  • NeoForge 21.1.x 或更高版本
  • Create 模组 6.0+

安装步骤

  1. 从 CurseForge 下载最新版本
  2. 将 .jar 文件放入 mods 文件夹
  3. 启动游戏——配置文件将自动生成
  4. 使用 /tickcontrol 命令进行配置(需要 OP 等级 2)

命令参考

基本命令

/tickcontrol status

显示当前 Tick 控制器状态,包括:

  • 全局 Tick/同步除数
  • 活跃的类型特定除数
  • 黑名单类型
  • 动态/紧急系统状态
  • 当前 TPS/MSPT 读数

全局控制

/tickcontrol global <1-200>      设置全局 Tick 除数
/tickcontrol sync <1-200>        设置全局同步除数(网络更新)
/tickcontrol reset               将所有设置重置为默认值

按类型控制

/tickcontrol type <TypeName> <1-200>    设置特定类型的除数
/tickcontrol type <TypeName> reset      重置类型以使用全局除数
/tickcontrol list [dimension]           按类型列出所有方块实体

示例——仅降低磨盘速度:

/tickcontrol type MillstoneBlockEntity 8

黑名单管理

/tickcontrol blacklist add <TypeName>     保护类型免受全局除数影响
/tickcontrol blacklist remove <TypeName>  移除保护
/tickcontrol blacklist list               显示所有黑名单类型
/tickcontrol blacklist clear              清空整个黑名单

示例——保护车站:

/tickcontrol blacklist add StationBlockEntity

动态 TPS 控制

/tickcontrol dynamic pause     暂停自动 TPS 调整
/tickcontrol dynamic resume    恢复自动调整

配置指南

配置文件位置:config/createtickcontroller-server.toml

动态 TPS 系统

[dynamic]
    # 启用基于公式的 Tick 除数计算
    enabled = false

    # 使用 TPS 变量的公式(0-20)
    # 示例:
    #   "3 * (21 - tps)"        — 激进缩放
    #   "(20 - tps) * 2"        — 中等缩放
    #   "tps < 15 ? 10 : 1"     — 二元阈值
    #   "max(1, (20-tps) * 5)"  — 带最小上限
    formula = "3 * (21 - tps)"

    # 检查间隔(Tick 为单位)(20 = 1 秒)
    updateInterval = 20

    # 除数范围
    minDivisor = 1
    maxDivisor = 50

    # 计算用的目标 TPS
    targetTps = 20.0

公式示例

公式 行为
3 * (21 - tps) 18 TPS 时 → 除数 9,15 TPS 时 → 除数 18
(20 - tps) * 2 18 TPS 时 → 除数 4,15 TPS 时 → 除数 10
tps < 15 ? 10 : 1 二元:低于 15 TPS 时除数为 10,否则为 1
min(20, max(1, (20-tps)*3)) 钳位激进缩放

公式变量:

  • tps —— 当前服务器 TPS(0-20)
  • targetTps —— 配置的目标值(默认 20)
  • mspt —— 当前每 Tick 毫秒数

支持的函数:

  • min(a, b)、max(a, b)、abs(x)
  • floor(x)、ceil(x)、round(x)
  • sqrt(x)、pow(base, exp)
  • 三元运算符:condition ? valueIfTrue : valueIfFalse

紧急 MSPT 系统

[emergency]
    # 启用基于 MSPT 的安全系统
    enabled = true

    # 触发阈值 MSPT(50 毫秒 = 20 TPS)
    msptThreshold = 55.0

    # 开始恢复的 MSPT 水平
    recoveryMspt = 45.0

    # 每步增加除数的量
    increment = 2

    # 恢复期间减少的量
    decrement = 1

    # 检查间隔(Tick 为单位)
    updateInterval = 10

    # 最大紧急除数
    maxDivisor = 100

紧急系统行为

MSPT 时间线示例:

步骤 MSPT 除数 阈值 恢复 备注
1 56 1 55 45 高于阈值
2 58 3 55 45 峰值(高于阈值)
3 55 5 55 45 达到/高于阈值
4 50 5 55 45 下降中
5 44 4 55 45 低于恢复(递减)
6 40 3 55 45 恢复中
7 56 5 55 45 峰值(高于阈值)
8 50 5 55 45 下降中
9 44 4 55 45 低于恢复(递减)
10 40 3 55 45 恢复中
11 35 2 55 45 最低点
12 40 1 55 45 趋于稳定
除数: 1 → 3 → 5 → 5 → 4 → 3 → 5 → 5 → 4 → 3 → 2 → 1
操作: MSPT > 55 时递增,MSPT < 45 时递减

紧急系统图表

阈值(55)和恢复值(45)之间的间隔可防止振荡。


技术深入解析

架构总览

服务器端
DynamicTickController(TPS / MSPT 监视器) → TickControllerManager
- globalTickDivisor
- typeTickDivisors
- blacklistedTypes
- shouldTick()
→ SmartBlockEntityMixin
(拦截 Tick 调用)
TickControllerConfig(TOML) → TickControllerManager
网络同步 TickDivisorSyncPacket
- globalDivisor
- syncDivisor
- typeDivisors
- blacklist
客户端 ClientTickManager
- store divisors
- getDivisorForType()
- getAnimationSpeedMultiplier()
↓
KineticBE 渲染器 Mixin RotatingInstance Mixin(飞轮) LinearActuator Mixin(滑轮)
动画速度 = 原始速度 / 除数

Mixin 注入点

  • 服务端:Tick 节流
  • 客户端:动画同步

shouldTick() 算法

内存占用

组件 内存使用
TickControllerManager ~2 KB(静态映射)
ClientTickManager ~1 KB(服务器状态的镜像)
每实体开销 0 字节(使用现有的位置哈希)
网络数据包 每次同步 ~200 字节

最佳实践

推荐配置

推荐配置片段(TOML)

小型服务器(1–5 名玩家,轻量工厂)

键 值
dynamic.enabled FALSE
emergency.enabled TRUE
emergency.msptThreshold 55
emergency.recoveryMspt 48
emergency.increment 1
emergency.decrement 1

中型服务器(5–20 名玩家,中等工厂)

键 值
dynamic.enabled TRUE
dynamic.formula 2 * (20 - tps)
dynamic.minDivisor 1
dynamic.maxDivisor 20
emergency.enabled TRUE
emergency.msptThreshold 52
emergency.recoveryMspt 45
emergency.increment 2
emergency.decrement 1

大型服务器(20+ 名玩家,大型工厂)

键 值
dynamic.enabled TRUE
dynamic.formula 4 * (21 - tps)
dynamic.minDivisor 1
dynamic.maxDivisor 50
emergency.enabled TRUE
emergency.msptThreshold 50
emergency.recoveryMspt 40
emergency.increment 3
emergency.decrement 1
emergency.maxDivisor 100

按类型优化指南

方块实体类型 推荐除数 原因
BeltBlockEntity 2-4 数量多,视觉影响大
MillstoneBlockEntity 4-8 本来处理就慢
CrushingWheelController 4-8 计算量大
MechanicalArmBlockEntity 2-4 需要精度
FunnelBlockEntity 2-4 工厂中数量多
ChainConveyorBlockEntity 2-4 类似传送带
PumpBlockEntity 4-8 流体计算密集
MechanicalMixerBlockEntity 4-8 配方处理
StationBlockEntity 1 (黑名单) 对列车系统至关重要
SignalBlockEntity 1 (黑名单) 安全性关键

应纳入黑名单的对象

始终考虑将以下内容列入黑名单:

  • 列车基础设施:StationBlockEntity、SignalBlockEntity、TrackBlockEntity
  • 红石时序:SequencedGearshiftBlockEntity、BrassDiodeBlockEntity
  • 玩家交互:ToolboxBlockEntity、LecternControllerBlockEntity

常见问题解答

问:这会让我的动态装置出问题吗?

答: 不会。动态装置(移动结构)由 Create 以不同方式处理,不受此模组影响。只有静止的方块实体会被节流。

问:传送带上的物品会丢失吗?

答: 不会。物品仍会被处理,只是频率降低了。除数为 4 时,物品以 1/4 速度移动,但绝不会消失。

问:为什么我的齿轮看起来转得慢?

答: 这是有意为之!客户端动画与服务器 Tick 速率同步,让你可以直观确认节流正在工作。这也有助于玩家理解为什么处理速度变慢了。

问:我可以在连接原版服务器时在客户端使用此模组吗?

答: 此模组必须在服务端安装。客户端需要安装它以查看同步动画,但所有节流逻辑由服务器控制。

问:这能与 Create 模组的插件兼容吗?

答: 可以!任何扩展 SmartBlockEntity 的插件都会被自动节流。你可以为插件特定的机器使用按类型除数。

问:动态系统和紧急系统有什么区别?

答:

  • 动态系统:主动式,基于公式,根据当前 TPS 调整
  • 紧急系统:被动式,基于阈值,为突发延迟峰值的提供安全网
  • 两者可同时运行:最终除数 = max(动态, 紧急)

问:如何找到方块实体的类型名称?

答: 使用 /tickcontrol list 查看所有已加载的 Create 方块实体,按类型名称分组。


Create Tick Controller 与 Create 模组团队无关。Create 由 simibubi 和 Create 团队开发。