跳到主要内容

游戏流程与生命周期文档

目录

  1. GameInstance 状态机
  2. 完整游戏流程
  3. 主游戏循环(game() 每 tick)
  4. 结束流程
  5. 联机对战流程
  6. 并发控制机制

GameInstance 状态机

GameInstance.LifecycleState 定义了游戏实例的全生命周期:

状态方法速查:

状态isActive()supportsGameplay()
INITIALIZINGtruefalse
PREPAREDtruetrue
START_PENDINGtruetrue
RUNNINGtruetrue
STOPPINGfalsefalse
ENDEDfalsefalse

完整游戏流程

单人游戏启动时序


主游戏循环

game() 方法每 tick(约 50ms)由 BukkitTask 调用:

判定流水线(单个 NoteObject)


结束流程

正常结束时序

强制结束(forceEnd)

restart() 重启流程

  • 仅单人局允许 restart();存在 rival 的对战局会直接拒绝重开并向玩家发送提示,避免本地状态与联机对局状态机脱节。

联机对战流程

  • 对战局仍然会完整经历结果结算与 end_game 清理,但不会允许中途重开,也不会允许通过对战选歌 GUI 开启自动播放。

并发控制机制

GameInstance 使用 版本号(lifecycleVersion)+ volatile 状态 解决异步初始化与生命周期竞争问题:

关键并发原语:

机制用途
synchronized beginLifecycle()原子性地递增版本号
synchronized invalidateLifecycle()使当前版本失效(+1后旧任务自动中止)
volatile lifecycleState状态跨线程可见性
volatile lifecycleVersion版本号跨线程可见性
volatile gameplayCompleted游戏完成标志跨线程可见性
CloudRivalPlayer.volatile online/latestGameData网络线程写入,游戏线程读取