한국어English日本語简体中文繁體中文DeutschไทยTiếng ViệtРусскийPortuguês (Brasil)EspañolBahasa Indonesia

遊戲 Lag 白皮書 › L2 用戶端 OS 與裝置

手機 App 切到背景 App suspended in background

原因 ID co-mobile-bg · 主要負責 遊戲開發團隊(用戶端開發) · 協同 遊戲開發團隊(伺服器開發)

在含圖解與實驗的完整版中開啟卡片 →

為了看通知而把 App 暫時切到背景時,OS 會在幾秒後暫停(suspend)App,這段期間伺服器就會切斷玩家的連線。

為什麼 為了看訊息、接電話把遊戲切到背景 → 於是 遊戲引擎暫停遊戲進行,OS 很快也會停止 App 與網路 → 畫面上 回到遊戲時早已斷線,只能重新連線

症狀
斷線
因素
停滯, 遺失
誰會遇到
只有我
何時
閒置一段時間後, 做特定動作時
負責單位
主要負責 遊戲開發團隊(用戶端開發) · 協同 遊戲開發團隊(伺服器開發)
遊戲開發團隊要做的事
用戶端:回到前景時不要等待已中斷的連線,直接用 session token 自動重新連線(不必重新登入就能接續),並一次取得最新狀態同步。伺服器:心跳封包中斷時先清理連線,但角色 session 在短暫的寬限時間內保留(不立刻踢出),在這段時間內重新連線就用 session token 接續。
數值參考
遊戲引擎通常在切到背景的瞬間就暫停。iOS 會在幾秒後暫停 App,即使申請了額外時間,通常也在數十秒內暫停;Android 14 以上則會在 App 離開畫面約 10 秒後將其凍結(freeze)。
圖表上
連線同時大量中斷 · 斷線次數(心跳逾時)、App 暫停紀錄
查看位置
以 session ID 對照用戶端 log 中 App 暫停與恢復的時間(Unity 為 OnApplicationPause)和伺服器端的斷線原因與時間。Android 也一併查看 ApplicationExitInfo 留下的處理程序結束原因(REASON_LOW_MEMORY 等)
符合的跡象
伺服器因心跳逾時斷線之前,用戶端剛進入暫停狀態,恢復後隨即重新連線
不符合的跡象
App 在前景時就斷線的話,是「NAT mapping 過期」、「電信業者共用 IP(CGNAT)」或「Wi-Fi ↔ LTE/5G 切換」
確認方式
需要遊戲伺服器/用戶端的 log 與指標
深入了解
手機記憶體不足時,有時會直接結束切到背景的遊戲。這就是切去相機或付款、驗證 App 再回來時,遊戲會從頭重新啟動的原因。越低階的裝置越常見。

出處

  1. Extending your app’s background execution time Apple
    切到背景時 applicationDidEnterBackground 有 5 秒可用,之後很快就會暫停;需要更多時間時以 beginBackgroundTask 申請(剩餘時間為 backgroundTimeRemaining)
  2. Cached apps freezer Android (Google)
    Android 14 以上會在 App 處理程序進入快取狀態 10 秒後將其凍結,凍結後所有執行緒都停止
  3. Application.runInBackground Unity
    預設值為 false,在背景時暫停;Android 在背景時不論設定為何都會暫停,iOS 則忽略這項設定
  4. MonoBehaviour.OnApplicationPause(bool) Unity
    App 暫停或恢復執行時,對所有 MonoBehaviour 送出 OnApplicationPause(true/false)
  5. ApplicationExitInfo Android (Google)
    REASON_LOW_MEMORY:系統的 low memory killer 結束了 App 處理程序(不支援的裝置會回報為 REASON_SIGNALED、SIGKILL)

相關原因

同一層:L2 用戶端 OS 與裝置

同一症狀(斷線)在其他層的原因

查看含圖解與實驗的完整版卡片