テラシュールブログ

旧テラシュールウェアブログUnity記事。主にUnityのTipsやAR・VR、ニコニコ動画についてのメモを残します。

【Unity】JobSystemが使うワーカースレッドの数を制限する

たぶんUnity 2019.3から、ワーカースレッドの数を制限出来るようになったっぽいです。

ワーカースレッドの数を制限する

UnityのJobSystemは基本的に「使用できる全てのスレッドを使用」します。これは例えばゲーム機がコアを1~2個専有してしまっていたり、もしくは何らかのシステムがスレッドを一つ専有してしまう場合でも同様です。
こうなると使用中にのスレッドにジョブを依頼する形になるので、コンテキストスイッチが発生し、効率が低下します。

ジョブの動作数を制限する場合JobsUtility.JobWorkerCountを使用します。これでジョブが発生する数を制限出来ます。例えば下のように記述すれば、ジョブが割り振る数は制限されます。

using Unity.Jobs.LowLevel.Unsafe;

(中略)

void Awake()
{
    JobsUtility.JobWorkerCount = 2;
}

実際の動作は下のような感じです。左が通常のジョブで、右がWorkerの数を制限した場合です。ジョブを処理しているワーカースレッドの数が減っている事が確認出来ます。

f:id:tsubaki_t1:20191202232746j:plain

ワーカースレッドの数

ワーカースレッドの数ですが、ハードコーディングで記述するにはゲームの環境は複雑に過ぎます。例えばモバイルのコア数は既に8だし、AMDのCPUは32個(64スレッド)です。コア数は現状すごく上昇しやすい項目なので、そのまま使うのは辛そうです。

とりあえず自分的には JobsUtility.JobWorkerMaximumCountから-1~-2辺りするのが良さそうに見えますが、実際にどの程度減らすのかは他のスレッドをどの程度使用しているのかに依存しそうです。