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

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

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

マルチスレッド処理

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

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

メインスレッドとレンダリング スレッド、ワーカー スレッド、オーディオ スレッドが適切に並列化されているゲーム
図 1. メイン スレッドとレンダリング スレッド、ワーカー スレッド、オーディオ スレッドが適切に並列化されたゲーム

CPU コア アフィニティ

CPU ワークロードのパフォーマンスに大きな影響を与える要因の 1 つは、コアでのスケジューリング方法です。これは、次の 2 つのコンポーネントに分割できます。

  • ゲームスレッドがワークロードに最適なコアで実行されているかどうか。
  • ゲームスレッドがコア間で頻繁に切り替わるかどうか。

最新のデバイスでは、ヘテロジニアス コンピューティングと呼ばれるアーキテクチャが使用されることが多く、コアのパフォーマンス レベルが異なります。

  • 1 つまたは少数のコアで最高のピーク パフォーマンスを発揮しますが、消費電力は多くなります。これらは「ビッグ」コアと呼ばれることもあります。
  • 他のコアはピーク パフォーマンスは低いものの、電力効率は優れています。これらは「リトル」コアと呼ばれることもあります。
  • 省略可: 1 つ以上のコアでパフォーマンスと電力のバランスを実現します。これらは「ミッド」コアと呼ばれることもあります。

トレースを取得するときにプロファイル構成で CPU を有効にすると、[CPU 使用率] で CPU スレッドの動作を調べることができます。トレースの 200 ミリ秒未満のセクションを拡大すると、デバイスの CPU コアで実行されている個々のプロセスを確認できます。通常、小さいコアは小さいインデックス(CPU 0 ~ 3 など)に対応し、大きいコアは大きいインデックス(CPU 6 ~ 7 など)に対応します。ミドルコアがある場合は、その間のインデックス(CPU 5 ~ 6 など)を占有します。これは一般的な慣例ですが、保証されるものではありません。

特定のスレッドが、パフォーマンスや電力のニーズを満たしていない CPU でスケジュールされている場合は、それらのスレッドの CPU アフィニティを手動で設定することを検討してください。

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

スレッドがコア間で切り替わるかどうかを確認することもできます。このようなコアスイッチでは、コンテキストの切り替えとコアのキャッシュ/レジスタでの状態の損失により、オーバーヘッドが発生します。

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

スレッドの CPU アフィニティを設定すると、ゲームがフォアグラウンドにあるときに、指定されたコアでスレッドをスケジュールするようシステムに指示します。この作業を行う際には、次の要素を考慮する必要があります。

  • プラットフォーム ソフトウェアは、負荷やサーマル スロットリングなどのランタイム要因に基づいてタスクの配置を動的に調整できません。
  • デバイスが価格帯やリリース日で大きく異なる場合、デバイスごとにパフォーマンス テストを行うと、パフォーマンス特性が大きく異なることがあります。

    新しいデバイスや高価なデバイスでは、特定のワークロードをリトルコアで快適に実行できるかもしれませんが、古いデバイスや手頃な価格のデバイスでは、同じワークロードの締め切りを満たすために大きなコアが必要になる可能性があります。

  • アフィニティをビッグコアに強制すると、バッテリーの消耗と熱負荷が不必要に増加する可能性があります。

これらの理由から、通常は CPU アフィニティを手動で設定しないことをおすすめします。