Closed4

【Unity】JobSystemを用いた並列処理の実装に向けた調査記録

GucchiGucchi

目的

Unityで並列処理を実装し,CPUリソースを最大限活用したい

解決したい課題

複数のゲームオブジェクトの更新(Update)に時間がかかることで,FPSが急激に低下(上下が激しい)してしまう。これをマルチスレッドで解消したい。

GucchiGucchi

C#JobSystemの概要①

「大量のデータを高速に処理」するUnityのJobSystem

  • Unity社が開発した,Unityでマルチスレッド処理を行うための仕組み
  • メモリ上に連続的にデータを配置するコンパイラ(Brust)
  • ジョブ:1つの特定のタスクを実行する小さな作業ユニット

C#JobSystemは安全なシステムを提供

  • マルチスレッドは常に,「競合状態のリスク」が存在する
    →競合状態はマルチスレッドコードを書く上で最も重要な課題
  • JobSystemは上記の危険性を回避する

【参考】

https://docs.unity3d.com/ja/2018.4/Manual/JobSystem.html

GucchiGucchi

C#JobSystemの概要②

  • 元々、UnityエンジンではWorkerThreadをコア数-1(例外あり)で持っていた、それをユーザーにも開放した形
  • 1フレームで収まる処理を並行的に行うのに適している
  • 通信やI/O待ちが発生する非同期的な処理には向かない
    →await, Taskを用いた方法
  • C#のコレクションはメモリ上に離散的に存在するのでキャッシュヒット率がとても悪い
    →JobSystemではNativetiveArrayを使用することでメモリ上に連続的に展開を行いキャッシュヒット率を上げる
  • メインスレッド制約のあるUnityの通常のAPIは使えない【メインスレッド制約】

【参考】
https://orange-lily27.hatenablog.com/entry/2018/04/26/224319

GucchiGucchi

JobSystemの制約

  1. Brustコンパイラ→値型しか使えない(JobSystemに則った構造体のみ)
  2. Jobの外にあるクラスへのアクセス禁止
    →UnityのAPIへもほとんどアクセスできない(UnityにAPIへのアクセスはメインスレッド限定)
  3. メインスレッドを起点にしてワーカースレッドに処理を分散させた後,メインスレッドに必ず戻る必要がある
    →複数のフレームにJobは跨ぐことができない
    JobSystem + Brustは1フレームに収まる処理(Update関数内の処理等)にしか使えない

【参考】
https://qiita.com/waiwaiunity/items/55038fa546ad16ec360b

このスクラップは4ヶ月前にクローズされました