This document is about: QUANTUM 3
SWITCH TO

ワーカースレッド数の変更

プラットフォームごとにワーカースレッド数を変更

デフォルトでは、シミュレーションはSimulationConfig.ThreadCount設定と同じ総数(メインスレッド含む)のスレッドの使用を試みます。
更新ループ中、シミュレーションはIDeterministicPlatformTaskRunnerに追加のワーカースレッド数(つまりSimulationConfig.ThreadCount - 1)と同じ数のデリゲートをスケジュールするようにリクエストします。
メインスレッドは常にシミュレーションタスクグラフを実行するため、デリゲートがスケジュールされていなくても、シミュレーションは更新を続けることができます。

例えば、アプリケーションを実行しているプラットフォームに基づいて、効率的にワーカースレッド使用数を変更する(あるいは、全く使用しない)ことが可能です。
これはモバイルとPCを両方ターゲットにする際に便利です。通常、PCはモバイル端末より高速なコアを多く持ちます。PCクライアントではSimulationConfig.ThreadCountを最大限に活用し、高速なコアを2つしか持たないモバイル端末では最大2スレッドに制限することができます。

Unityでは、デフォルトのIDeterministicPlatformTaskRunnerQuantumTaskRunnerJobsで実装されています。Unityのジョブを使用してワーカースレッドを起動し、メインスレッドと並行してWork-Stealing方式でシミュレーションタスクグラフを実行します。

デフォルトでは、タスクランナーはスケジュールされたワーカースレッド(ここではUnityジョブ)数をJobsUtility.JobWorkerCount - 1に調整します。
これによって、シミュレーションの更新ループ中にUnityジョブスレッドが枯渇することがなくなり、潜在的なデッドロックを回避することができます。

以下のスニペットのようにQuantumTaskRunnerJobsを拡張して、シーン上のゲームオブジェクトにカスタムMonoBehaviourを追加することで、値をさらにカスタマイズしたりオーバーライドしたりすることが可能です。
このようなオブジェクトをHubやメニューシーンに追加して、DontDestroyOnLoadにするのが一般的な方法になります。

スニペット

C#

public class CustomQuantumTaskRunnerJobs : QuantumTaskRunnerJobs {
  private void Awake() {
    // 独自カウントの使用を保証するため、Customモードにする
    quantumJobsMaxCountMode = QuantumJobsMaxCountMode.Custom;
  }

  protected override Int32 CustomQuantumJobsMaxCount {
    get {
#if !UNITY_EDITOR && UNITY_IOS
      // 例:シングルスレッドのシミュレーションを強制する
      // (これはワーカースレッド数なので、メインスレッドが常にタスクグラフを実行することになる)
      return 0;
#elif !UNITY_EDITOR && UNITY_ANDROID
      // 例:マルチスレッドが利用可能な場合に、ワーカースレッド数を1に制限する
      return Math.Min(1, DefaultQuantumJobsMaxCount);
#else
      return DefaultQuantumJobsMaxCount;
#endif
    }
  }
}
Back to top