ワーカースレッド数の変更
プラットフォームごとにワーカースレッド数を変更
デフォルトでは、シミュレーションはSimulationConfig.ThreadCount
設定と同じ総数(メインスレッド含む)のスレッドの使用を試みます。
更新ループ中、シミュレーションはIDeterministicPlatformTaskRunner
に追加のワーカースレッド数(つまりSimulationConfig.ThreadCount - 1
)と同じ数のデリゲートをスケジュールするようにリクエストします。
メインスレッドは常にシミュレーションタスクグラフを実行するため、デリゲートがスケジュールされていなくても、シミュレーションは更新を続けることができます。
例えば、アプリケーションを実行しているプラットフォームに基づいて、効率的にワーカースレッド使用数を変更する(あるいは、全く使用しない)ことが可能です。
これはモバイルとPCを両方ターゲットにする際に便利です。通常、PCはモバイル端末より高速なコアを多く持ちます。PCクライアントではSimulationConfig.ThreadCount
を最大限に活用し、高速なコアを2つしか持たないモバイル端末では最大2スレッドに制限することができます。
Unityでは、デフォルトのIDeterministicPlatformTaskRunner
はQuantumTaskRunnerJobs
で実装されています。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