テラシュールブログ

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

【Unity】C# Job SystemからECSのEntityやComponentDataを追加・削除・変更する指示を出す

今回はECSのComponentDataの追加や削除・変更といった動作をJobSystem上から指示する方法についてです。

 

 

C# Job SystemからComponentDataの追加・削除等を指示する

ECSは処理を並列処理しやすいように作られています。ただしEntityの追加や削除、ComponentDataの付け替えといった動作はメインスレッド上で行われなければいけません。
ただしEntityの追加や削除の判定は非同期でも問題ないので、そういった判定自体は非同期で行いEntityの削除等はメインスレッドで行う…をやってみます。

考え方的には、非同期でEntityに対するタスクを溜め込んでおき、後で一気に処理するといった感じです。

 

試しに作ったのは下のような感じで、マウスの近くにあるEntityを削除するだけの簡単なモノです。ただしチェックは総当たりしているのでEntityの数によっては非常に長い時間がかかりそうな物です。
(例えば40万個のEntityで試した所、毎秒80msのチェックコストが発生しました)

f:id:tsubaki_t1:20180614223808g:plain

BarrierSystem

この部分をバックグラウンドに持っていくため、BarrierSystemを使用します。BarrierSystemでEntityCommandBufferを作成し、EntityCommandBufferにコマンドを詰め込んでおけば後で実行してくれます。

EntityCommandBufferを実行するタイミングですが、BarrierSystemの実行タイミングに依存するみたいです。例えばBarrierSystemを継承したクラスを用意してUpdateAfter等をすれば好きなタイミングで実行できるといった感じ。

f:id:tsubaki_t1:20180614230529j:plain

面倒ならば、事前に3つのタイミングのBarrierSystemがあるので、そのタイミングで処するのが良さそうです。できるだけSyncPointは少ない方が良いという感じ。

  • EndFrameBarrier
  • MeshCullingBarrier
  • TransformInputBarrier

なおEndFrameBarrierはフレームの最後ではなく最初です(どちらも同じと言えば同じですが)

f:id:tsubaki_t1:20180614225954j:plain

 

サンプルコード

 

gist.github.com

IjobParallelFotやIJobProcessComponentDataで使用するには?

使用できません。基本的にIJobのみ使用できるみたいです。

https://forum.unity.com/threads/how-to-get-an-entity-in-ijobprocesscomponentdata.532573/#post-3505943