今回は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をジョブ終了時に自動的に開放してくれるみたいです。
下のサンプルコードでも、Allocator.TempJobで生成したNativeArrayは投げっぱなしで開放してませんが、ちゃんとDeallocateOnJobCompletion
が片付けてくれます。
コレが使えるのはあくまで.TempJobで生成したNativeArrayのみで、Tempで作ったものは開放出来ません。
またジョブが終わったら速やかに開放されてしまうので、中身をジョブ外で受け取りたい場合にはTempを使うのが良いです。