テラシュールブログ

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

【Unity】Allocator.TempJobで作ったNativeArrayを自動的に開放する

今回はNativeArrayの開放の方法についてです

 

NativeArrayの削除

NativeArrayでコンテナを作る際、アロケータのモードに「Temp」「TempJob」「Persistent」の3つを選択することが出来ます。

 

Persistentは普通にComponentやComponentSystemのAwake的なタイミングで作ってOnDestroy的なタイミングで消せば良いんですが、TempやTempJobのように一時割当するタイプはどう消せばよいのか。

 

.Tempは普通に開放

.Tempは基本的に自身で開放する必要があります。開放を忘れると「A Native Collection has not been disposed, resulting in a memory leak.」とコンソールに表示されます(エディターならば)

 

で、この開放のタイミングですが自分で開放する必要があるので、フレームの終わりやメソッドの終わりのタイミングでDisposeします。

Allocator.Tempは「ジョブの結果を受け取りたい」みたいな場合に使用します。結果を抽出したら用済みなので始末して下さい。

 

.TempJobは少し楽

TempJobこちらはC# Job Systemで使う前提の一時割当で、実は少し楽に開放が出来ます。
DeallocateOnJobCompletion属性をJobSystemのフィールドにセットしておくと、そのNativeArrayをジョブ終了時に自動的に開放してくれるみたいです。

f:id:tsubaki_t1:20180521100416j:plain

下のサンプルコードでも、Allocator.TempJobで生成したNativeArrayは投げっぱなしで開放してませんが、ちゃんとDeallocateOnJobCompletionが片付けてくれます。

 

コレが使えるのはあくまで.TempJobで生成したNativeArrayのみで、Tempで作ったものは開放出来ません。

またジョブが終わったら速やかに開放されてしまうので、中身をジョブ外で受け取りたい場合にはTempを使うのが良いです。

 

サンプル

gist.github.com