理解游戏循环、游戏时间、ticks

Screeps 是个实时游戏。它游戏时间不等同于现实时间,而是自从开服以来所有 tick 的总和。当下的游戏时间可用(Game.time)获得,这个时间只会随着游戏的发展而增加。

就像其他大部分游戏一样, screeps 是由无穷无尽的 "tick"(循环、回合)拼接而成的。每 tick 内,服务器会轮番处理所有玩家写在 main 里的指令,只有当处理完后才会进入下 tick。

接下来我们来介绍单个 tick 的三个阶段,及初始、执行、结束阶段。

初始阶段,服务器会重建所有的游戏对象 (object) 和记录这 tick 的游戏状态。比如 creep 的位置,被下令拆除的建筑,或是 creep 及建筑资源的存量 (creep.carry() / StructureExtension.energy() / StructureContainer.store())。

执行阶段,玩家代码的 main 及它所调用的模块会被执行,但部分改变游戏状态的指令并不会立即执行。如果玩家在同 tick 内先用了 移动 (creep.move()) 再用了 攻击 (creep.attack()),creep 发出攻击的位置将会是移动前的位置,因为 creep 的位置属性 (creep.pos) 只能在初始阶段改变。

结束阶段,服务器会处理那些改变游戏状态的指令,然后被传达到下 tick 的初始阶段。如果玩家给了相互冲突的指令,像是多个 creep 尝试跑到同一位置,或是边修理边拆除,这些指令会按照优先级执行。但是玩家之间的指令并不一定会造成冲突,比如不同玩家的低血量 creep 相互攻击可能会导致他们同时战死。

更多

  • 玩家代码 main 的执行时间被 CPU 所限制(见Game.cpuLimit)

  • 已使用 CPU 可由Game.getUsedCpu获得。

  • 游戏内 tick 的耗时是由服务器吞吐量决定的。
  • 所有运行游戏对象及变量在每 tick 后都会被清除重建(见全局对象)
  • 由控制台输入的指令遵循同样的规则:所以控制台输入的指令会在 main 之后执行。

参见