ゲームラグ白書 › 一部のユーザーだけに起きる問題
バックグラウンドウィンドウの処理制限 Background window throttling
原因ID pt-background · 主担当 ゲーム開発チーム・クライアント開発 · 副担当 外部・外部
図と実験のあるメインページでこのカードを開く →
バックグラウンドウィンドウのクライアントでは、ゲーム・エンジン・OSがフレームと処理を減らします。受け取ったパケットを時間内に処理できず、詰まったりあふれたりします。
なぜ ゲームのオプションやグラフィックスドライバーのバックグラウンドのフレーム制限(例:NVIDIAドライバーでは毎秒20〜200の間で指定)、省電力、エンジンのバックグラウンド停止設定。OSも前面のウィンドウ(フォアグラウンド)にCPU・GPUを優先的に割り当てる → すると フレームごとに処理するパケット数が減ってキューがたまり、受信バッファがあふれると破棄される → 画面では ウィンドウを前面に出すとまとめて現れるか、一部のNPCが最後まで表示されない
- 症状
- 表示されない・ゴースト, 早送り, 切断
- 要因
- ストール, パケットロス
- 誰に起きるか
- 同じPCの片方のクライアントだけ
- いつ
- しばらく放置した後, 常に
- 担当
- 主担当 ゲーム開発チーム・クライアント開発 · 副担当 外部・外部
- ゲーム開発チームの対応
- ネットワーク受信はゲームループとは別のスレッドで継続、バックグラウンドでも最低限の処理量を保証、エンジンのバックグラウンド実行設定(UnityではrunInBackground)を有効にする。
- 外部の対応
- ユーザーに、グラフィックスドライバーのバックグラウンドのフレーム制限とPCの省電力モードを切るよう案内。
- 数値の目安
- Unityは、runInBackgroundの設定が無効だと、ウィンドウがフォーカスを失った瞬間にゲームループが止まります。受信をそのループの中だけで行っていると、その間パケットがまったく処理されません。
- グラフでは
- 途切れた後にまとめて到着 · クライアントのフレーム間隔、フレームあたりの処理パケット数
- 確認箇所
- 同じPCで片方のウィンドウを前面、もう片方を背面に置き、役割を入れ替えながら比較。PresentMonで2つのプロセスのフレーム間隔を測り、ゲーム側のログがあれば、ウィンドウのフォーカス状態とフレームごとに処理したパケット数を確認
- 該当する場合
- バックグラウンドウィンドウのときだけフレーム間隔が大きく延びるか(ドライバーの制限なら、設定したフレームレートに対応する間隔で頭打ちになる)処理が止まり、ウィンドウを切り替えると問題もほかのクライアントへ移る
- 該当しない場合
- 前面のウィンドウでも同じように起きるなら、バックグラウンドの制限のせいではない。ウィンドウの位置に関係なくいつも同じクライアントだけがおかしいなら、表示オプションかバージョンの違い
- 確認手段
- ユーザー側の環境で確認
出典
- Application.runInBackground Unity
runInBackgroundのデフォルトはfalseで、このときアプリはバックグラウンドで一時停止 - Manage 3D Settings (reference) — NVIDIA Control Panel Help NVIDIA
Background Application Max Frame Rate:バックグラウンドのゲームの最大フレームレートを毎秒20〜200に制限 - Priority Boosts Microsoft
Windowsはフォアグラウンドウィンドウのプロセスの優先度を、バックグラウンドのプロセス以上に引き上げる - PresentMon README Intel
WindowsのグラフィックスアプリのCPU・GPU・ディスプレイのフレーム時間をアプリごとに収集するツール
あわせて読みたい原因
同じ層:一部のユーザーだけに起きる問題
同じ症状(表示されない・ゴースト)を起こすほかの層の原因
図と実験のあるメインページでこのカードを見る