块调度器

块调度器

高效且可控的区块加载(对服务器友好)。

游戏机制

Chunk Schedudeler

高效且可控的区块加载(对服务器友好)。

bisecthosting

区块加载器方块(“Schedudeler”)

Schedudeler 合成配方

Schedudeler 是本模组添加的唯一方块。它能够加载其周围区域内的区块,但会随着时间缓慢流失充能。


Schedudeler 方块默认状态

Schedudeler 放置后为空,但可以通过右键点击为其充能。只要有玩家在附近(24 格半径内)或其所有者在线(稍后详述),它也会自动充能。Schedudeler 的默认容量为 576000 刻(8 小时)。

在默认状态下,Schedudeler 不属于任何人(公开),区块半径为 0,即它只会加载自己所在的区块。

Schedudeler 只有在主动加载其区块时才会流失充能。


Schedudeler 方块 - 激活状态

当 Schedudeler 有充能/处于激活状态时,其中央的染色玻璃方块会点亮其角落并缓慢脉动。


Schedudeler 方块 - 已充满

当尝试手动为一个已满的 Schedudeler 充能时,它会释放粒子。


Schedudeler 方块铁升级

可以通过对 Schedudeler 应用铁升级(手持铁锭右键点击)来升级它。这会将 Schedudeler 的最大充能提升至总共 1728000 刻(24 小时)。

各项升级可以独立应用。


Schedudeler 方块铁/金升级

金升级(手持金锭右键点击)会将 Schedudeler 的区块半径提升至总共 1(3x3 区块区域)。

最大半径 1 之所以这么低,是为了鼓励玩家使用更多小型区块加载器(而不是单个大型加载器),这有助于调度算法在多个玩家之间公平地分配区块加载器(参见区块调度部分)。铁升级和金升级所提供的增益可以配置。


Schedudeler 方块铁/金/末影升级

玩家可以通过应用末影升级(手持末影之眼右键点击)来获得 Schedudeler 的所有权。这有几个好处:

  • 只要所有者在线,Schedudeler 就会自动充能(无论距离多远)。
  • 区块加载器的调度会考虑一个玩家拥有的区块加载器数量与其他玩家以及公开区块加载器(不属于任何玩家)的关系。更多信息请查看区块调度部分。

Schedudeler 方块铁/锁链升级

锁链升级(手持锁链右键点击)会锁定 Schedudeler,防止玩家(误)应用任何进一步的升级。


Schedudeler 方块铁升级 - 区域预览

玩家可以手持红石火把右键点击任意 Schedudeler,以显示加载区域(区块边界)的预览,该预览仅对该玩家在短时间内可见。红石火把不会被消耗。


Schedudeler 方块 - 被破坏

一旦被破坏,所有之前应用的升级也会掉落。

区块调度

本模组的一个核心功能是调度算法。这意味着每个维度同时始终只有可配置数量的区块加载器处于激活状态(默认为 8 个)。为实现这一点,区块加载器会排入队列,每组 8 个区块加载器会激活一小段时间(默认为 80 刻)。

此外,该算法会考虑每个所有者拥有的区块加载器数量(以及公开区块加载器的数量),并确保每一方获得相同的激活其区块加载器的时间。


举个例子: 为简单起见,假设同时始终只有 2 个区块加载器处于激活状态。如果玩家 Red 放置了单个区块加载器,而玩家 Blue 放置了 100 个区块加载器,那么在每次调度中,玩家 Red 的单个区块加载器以及玩家 Blue 的下一个区块加载器会被激活。总共需要 100 次调度(8000 刻)才能将玩家 Blue 的每个区块加载器恰好激活一次。与此同时,玩家 Red 的区块加载器将被激活 100 次。


以下动画展示了该算法的运作方式(基于一个稍复杂但紧凑的例子)。你可以查看此仓库以了解有关该主题的更多信息。

调度器动画

配置

可用的配置选项及其默认值:

名称 描述 默认值
maxActiveChunkLoaders 定义同时可以处于激活状态的区块加载器的最大数量。 8
maxChunkLoaderCharge 定义区块加载器总共可以处于激活状态的最大刻数。 576000
ticksOfActiveChunkLoading 定义每组排队的区块加载器保持激活的刻数。注意:如果此值过低,某些(方块)实体更新可能会被跳过(例如“阳光传感器”每 20 个世界刻更新一次)。 80
rechargeFactorRightClick 定义区块加载器每次右键点击充能的百分比。 0.1
rechargeFactorPlayersNearby 定义当玩家在附近时,区块加载器每刻充能的百分比。 0.05
rechargeFactorOwnerOnline 定义当其所有者在线时,区块加载器每个激活周期充能的百分比。 0.1
rechargeRadiusPlayersNearby 定义区块加载器扫描附近玩家以确定是否应充能的半径。 24
ironUpgradeBonusCharge 定义铁升级区块加载器的充能所增加的额外最大充能。 1152000
ironUpgradeBonusRadius 定义铁升级区块加载器的半径所增加的额外区块半径。 0
goldUpgradeBonusCharge 定义为金升级区块加载器的半径所增加的额外区块半径。 0
goldUpgradeBonusRadius 定义为金升级区块加载器的半径所增加的额外区块半径。 1
logChunkStateChange 如果启用,区块“强制”状态的任何变化都会被记录。 false
logChunkLoaderUpdates 如果启用,区块加载器方块实体的更新会被记录。 false
logChunkLoaderRegistration 如果启用,区块加载器的(取消)注册会被记录。 false

命令

所有命令都需要至少 1 的权限等级:

  • chunkschedudeler get <blockPos> [charge|radius|owner|locked]:获取指定位置处 Schedudeler 的信息。

常见问题

区块加载器是否按玩家数量限制?

不。


如果存在无限多的区块加载器,性能会如何?

始终相同,因为同时处于激活状态的区块加载器永远不会超过配置的数量(默认为 8)。


区块加载器有可能永远不激活吗?

不。只要它们有充能,最终都会轮到它们。


玩家能否通过在同一区域放置大量区块加载器来“钻空子”?

不能。由于认领这些区块加载器对他们有利,玩家拥有的区块加载器总数会上升,这将导致该玩家拥有的每一个区块加载器被激活的频率降低(更多信息请参见区块调度)。

免责声明

在我的测试中我注意到,紧邻区块加载器强制加载的区块旁边的区块也会被加载。我也在其他模组的区块加载器上注意到了这种行为。总之,这意味着一个半径为 0 的区块加载器(即 1x1 区块区域)实际上会加载 3x3 区域,一个半径为 1 的区块加载器(即 3x3 区块区域)会加载 5x5 区块区域,以此类推。由于我并不 100% 确定这些额外区块是否可靠加载,它们被视为额外开销而忽略不计。