スレッド スケジューリングを分析する

ゲーム プロセス スレッドが適切に利用され、最適なパフォーマンスになるようにスケジュールされているかを判断するために、考慮すべき点がいくつかあります。

  • フレーム ペーシング
  • マルチスレッドとスレッド並列化
  • CPU コア アフィニティ

マルチスレッド処理

多くのゲームやゲームエンジンは、マルチスレッド処理を使用して CPU 処理を論理タスクに分割し、論理タスクはある程度独立して実行されることもあります。典型的な構成の一つは、入力とゲームロジック用のゲームスレッド、描画するオブジェクトを準備して送信するためのレンダリング スレッド、アニメーションや音声などの他のサブタスク用のワーカー スレッドです。

マルチスレッドによるパフォーマンスの向上を活かせるよう、スレッドの並列化をおすすめします。この例は、ゲーム スレッドとレンダリング スレッドが異なるコアで部分的または完全に同時に実行されるシナリオです。これは、共有データの依存関係がある場合など、常に可能とは限りません。ただし、可能な場合には CPU 時間が短くなるため、フレームレートが高くなる可能性があります。

適切に並列化されたメインスレッドとレンダリング スレッド、ワーカー スレッド、音声スレッドがあるゲーム
図 1. 適切に並列化されたメインスレッド、レンダリング スレッド、ワーカー スレッド、音声スレッドを使用するゲーム

CPU コア アフィニティ

CPU ワークロードのパフォーマンスに大きく影響する要因の一つは、コアでのスケジューリング方法です。これは次の 2 つの要素に分かれています。

  • パフォーマンスのためにゲームスレッドが最適なコアで実行されているかどうか
  • ゲームスレッドがコア間を頻繁に切り替えるかどうか

トレースを取得するときにプロファイル構成で CPU を有効にすると、CPU 使用率での CPU スレッドの動作を調査できます。トレースの 200 ミリ秒未満の部分にズームインすると、デバイスの CPU コアで実行されている個々のプロセスを表示できます。通常、小さいコアは小さいインデックス(CPU 03 など)に対応し、大きいコアは高いインデックス(CPU 67 など)に対応します。

一般的に、ゲームがフォアグラウンドにある場合、ゲームスレッドやレンダリング スレッドなどの永続スレッドは高パフォーマンスの大型コアで実行され、他のプロセスやワーカー スレッドは小さいコアでスケジュールされます。

メインスレッドとレンダリング スレッドが主に大きなコア(CPU 6 ~ 7)で実行されているゲーム(水色で表示)
図 2. メイン スレッドとレンダリング スレッドが主に大きなコア(CPU 6 ~ 7)で実行されるゲーム(水色で表示)

また、ゲームスレッドでコアが頻繁に切り替わるかどうか、メインスレッドとレンダリング スレッドが単一 CPU フレーム内または連続する 2 つの CPU フレーム間でコアを変更しているかどうかも確認できます。この CPU の動作は、ゲームスレッドが適切にアフィニティ化されていないことを示す可能性があります。このようなコアスイッチでは、コンテキスト スイッチによるオーバーヘッドとコアのキャッシュ/レジスタの状態の損失が発生し、CPU フレームの長さが長くなります。

コアを切り替えるメイン スレッド(Thread-7)とレンダリング スレッド(Thread-8)があるゲーム(紫色で表示)
図 3. コアを切り替えるメイン スレッド(Thread-7)とレンダリング スレッド(Thread-8)が紫色で表示されているゲーム