最適なパフォーマンスを実現するためにゲームプロセス スレッドが適切に利用され、スケジュールされているかどうかを判断するには、考慮すべきことがいくつかあります。
- フレーム ペーシング
- マルチスレッド処理とスレッド並列化
- CPU コア アフィニティ
マルチスレッド処理
多くのゲームやゲームエンジンは、マルチスレッド処理を使用して CPU の処理を論理タスクに分割します。論理タスクはある程度独立して実行される可能性があります。一般的な構成の 1 つは、入力とゲームロジック用のゲームスレッド、描画するオブジェクトを準備して送信するレンダリング スレッド、アニメーションや音声などの他のサブタスク用のワーカー スレッドです。
マルチスレッドのパフォーマンス向上を活用するために、スレッドを並列化することをおすすめします。このシナリオは、ゲーム スレッドとレンダリング スレッドが異なるコアで部分的または完全に同時に実行されているシナリオです。これは、共有データの依存関係の場合など、常に可能になるとは限りません。ただし、可能であれば CPU 時間が短くなって、フレームレートが高くなる可能性があります。
![適切に並列化されたメイン スレッドとレンダリング スレッド、ワーカー スレッド、オーディオ スレッドを備えたゲーム](https://developer.android.com/static/images/agi/threads-scheduling-images/sample_multithreading.png?authuser=8&hl=ja)
CPU コア アフィニティ
CPU ワークロードのパフォーマンスに大きく影響する要因の一つは、コアでのワークロードのスケジュール方法です。これは次の 2 つの要素に分けられます。
- ゲームスレッドがワークロードに最適なコアで実行されているかどうか。
- ゲームスレッドのコア間が頻繁に切り替わるかどうか。
最新のデバイスでは、ヘテロジニアス コンピューティングと呼ばれるアーキテクチャがよく使用されます。このアーキテクチャでは、コアによってパフォーマンス レベルが異なります。
- 1 個または数個のコアが最高のピーク パフォーマンスを発揮しますが、消費電力は多くなります。これらは「ビッグ」コアと呼ばれることもあります。
- その他のコアはピーク パフォーマンスが低いものの、電力効率はより優れています。これらは「リトル」コアと呼ばれることもあります。
- オプション: 1 つ以上のコアでパフォーマンスと消費電力のバランスを取ることができます。これらは「中核」と呼ばれることもあります。
トレースの取得時にプロファイル構成で CPU を有効にすると、[CPU 使用率] で CPU スレッドの動作を調査できます。トレース内の 200 ミリ秒未満のセクションにズームインすると、デバイスの CPU コアで実行されている個々のプロセスを表示できます。通常、小さいコアは小さいインデックス(たとえば、CPU「0」~「3」)に対応し、大きいコアは高いインデックス(たとえば、CPU「6」~「7」)に対応し、中央のコアが存在する場合、その間のインデックスを占有します(たとえば、CPU「5」~「6」)。これは一般的な規則ですが、保証されるものではありません。
パフォーマンスや電力のニーズを満たさない CPU で特定のスレッドがスケジュールされている場合は、そのスレッドの CPU アフィニティを手動で設定することを検討してください。
![水色で示されたメインスレッドとレンダリング スレッドが主に大きなコア(CPU 6 ~ 7)で実行されているゲーム](https://developer.android.com/static/images/agi/threads-scheduling-images/sample_bigcores.png?authuser=8&hl=ja)
また、スレッドがコア間で切り替わるかどうかを確認することもできます。このようなコア切り替えでは、コンテキスト切り替えによるオーバーヘッドが発生し、コアのキャッシュやレジスタで状態が失われます。
![コアを切り替えるメイン(Thread-7)とレンダリング スレッド(Thread-8)を使用したゲーム(紫色で表示)](https://developer.android.com/static/images/agi/threads-scheduling-images/sample_coreswitching.png?authuser=8&hl=ja)
スレッドに CPU アフィニティを設定すると、ゲームがフォアグラウンドにある場合に、特定のコアで CPU アフィニティのスケジュールを設定するようシステムに指示します。その際、考慮すべき点がいくつかあります。
- プラットフォーム ソフトウェアでは、負荷やサーマル スロットリングなどのランタイム要因に応じてタスクの配置を動的に調整することはできません。
デバイスによってパフォーマンス テストを行うと、パフォーマンス特性が大きく異なる場合があります。特に、価格帯やリリース日によってデバイスが大きく異なる場合はなおさらです。
新しいデバイスや高価なデバイスでは、特定のワークロードを小さなコアで快適に実行できますが、古いデバイスや手頃な価格のデバイスでは、同じワークロードの期限を守るためにより大きなコアが必要になる場合があります。
大きなコアにアフィニティを適用すると、バッテリーの消耗と熱負荷が不必要に増加する可能性があります。
このような理由から、通常は CPU アフィニティは手動で設定しないことをおすすめします。