最適なパフォーマンスを実現するためにゲームプロセス スレッドが適切に利用され、スケジュールされているかどうかを判断するには、考慮すべきことがいくつかあります。
- フレーム ペーシング
- マルチスレッド処理とスレッド並列化
- CPU コア アフィニティ
マルチスレッド処理
多くのゲームやゲームエンジンは、マルチスレッド処理を使用して CPU の処理を論理タスクに分割します。論理タスクはある程度独立して実行される可能性があります。一般的な構成の 1 つは、入力とゲームロジック用のゲームスレッド、描画するオブジェクトを準備して送信するレンダリング スレッド、アニメーションや音声などの他のサブタスク用のワーカー スレッドです。
マルチスレッドのパフォーマンス向上を活用するために、スレッドを並列化することをおすすめします。このシナリオは、ゲーム スレッドとレンダリング スレッドが異なるコアで部分的または完全に同時に実行されているシナリオです。これは、共有データの依存関係の場合など、常に可能になるとは限りません。ただし、可能であれば CPU 時間が短くなって、フレームレートが高くなる可能性があります。
![適切に並列化されたメイン スレッドとレンダリング スレッド、ワーカー スレッド、オーディオ スレッドを備えたゲーム](https://developer.android.com/static/images/agi/threads-scheduling-images/sample_multithreading.png?authuser=1&hl=ja)
CPU コア アフィニティ
CPU ワークロードのパフォーマンスに大きく影響する要因の一つは、コアでのワークロードのスケジュール方法です。これは次の 2 つの要素に分けられます。
- ゲームスレッドがパフォーマンスに最適なコアで実行されているかどうか
- ゲームスレッドのコア間が頻繁に切り替わるかどうか
トレースの取得時にプロファイル構成で CPU を有効にすると、[CPU 使用率] で CPU スレッドの動作を調査できます。トレース内の 200 ミリ秒未満のセクションにズームインすると、デバイスの CPU コアで実行されている個々のプロセスを表示できます。通常、小さいコアは小さいインデックス(CPU 0
~3
など)に対応し、大きいコアは高いインデックス(CPU 6
~7
など)に対応します。
一般的に、ゲームがフォアグラウンドにあるときは、ゲームスレッドやレンダリング スレッドなどの永続スレッドは高パフォーマンスの大きなコアで実行し、他のプロセスやワーカー スレッドはより小さなコアでスケジュールします。
![水色で示されたメインスレッドとレンダリング スレッドが主に大きなコア(CPU 6 ~ 7)で実行されているゲーム](https://developer.android.com/static/images/agi/threads-scheduling-images/sample_bigcores.png?authuser=1&hl=ja)
また、メイン スレッドとレンダリング スレッドが単一の CPU フレーム内または連続する 2 つの CPU フレーム間でコアを変更した場合など、ゲームスレッドがコア間を頻繁に切り替わるかどうかを確認することもできます。この CPU の動作は、ゲームスレッドが適切にアフィニティ化されていないことを示している可能性があります。このようなコア切り替えでは、コンテキスト切り替えによるオーバーヘッドが発生し、コアのキャッシュやレジスタで状態が失われ、CPU フレームの長さが長くなります。
![コアを切り替えるメイン(Thread-7)とレンダリング スレッド(Thread-8)を使用したゲーム(紫色で表示)](https://developer.android.com/static/images/agi/threads-scheduling-images/sample_coreswitching.png?authuser=1&hl=ja)