はじめに
Unity2019.3からJob Systemが使用しているWorker Threadの数を変更出来るAPIが追加されていたことにお気付きでしょうか。
自身で用意したThreadやサードパーティー製のミドルウェアがThreadを使用している場合、Worker Thradの数を減らし、逆にWorker Threadの数を増やすことで、Job Systemが受けも持つTaskを短い時間で終わらせるこが期待できます。
API
Worker Threadの数を指定するAPIは
JobsUtility.JobWorkerCountです。
このプロパティに設定可能な値は1以上、JobsUtility.JobWorkerMaximumCount以下です。
範囲外の値を指定した場合は例外がThrowされます。
Note
一部のプラットフォーム(確認した限りではAndroid)では、OSからのイベント(例えば、省電力モードのON・OFF)に応じて、Worker Threadの数はUnity内で自動的に制御されていますが、このAPIを使用した場合は、この値が優先されることに注意が必要です。
JobsUtility.JobWorkerMaximumCount
JobsUtility.JobWorkerMaximumCountの値はプラットフォーム毎に異なります。
多くのプラットフォームではコア数-1が使用されます。
Androidの場合、CPUがBig-Little構成の場合、Big側のコア数が使用され、それ以外の場合、コア数ー1が使用されます。
※最近はBig-Middle-Little構成の端末もありますが、その場合どうなるんですかね。
検証
CandyRockStart Projectを用いてJobsUtility.JobWorkerMaximumCountの値を1~3に変更することで実際のWorker Threadの数が変わるのかsystraceで検証を行いました。
検証に使用した端末はPixel3XLです。
JobsUtility.JobWorkerCount = 1
JobsUtility.JobWorkerCount = 2
JobsUtility.JobWorkerCount = 3
確かにWorker Threadの数が変わっているので正しく動作しているようです。
(Unityにしては珍しい・・・)
まとめ
基本的にWorkerThreadの数はUnityに任せておいた方が良いケースが多いと思いますが、AnimatorやC# Jobsystemを使用していないなど、Unity Profilerを見た時に殆ど使用していないのであれば、Worker Threadの数を減らした方が良いケースもありますし、その逆で増やした方が良いケースもあると思います。
そういった場合は、こちらのAPIでWorkerThreadの数を変更してみることをお勧めします。