NativeContainer 構造体のコピー
Copy and reference multiple native containers.
読み終わるまでの所要時間 9 分最終更新 1ヶ月前
ネイティブコンテナ は値型です。変数に割り当てられると、Unityは 構造体をコピーします。この構造体にはネイティブコンテナのデータを格納する場所へのポインター ( など) が含まれます。 のコンテンツ全体をコピーするわけではありません。
NativeContainerAtomicSafetyHandleNativeContainerこれは、同じメモリ領域を参照する 構造体のコピーが複数存在し、そのすべてに同じ主要レコードを参照する オブジェクトが存在する可能性があるということです。
NativeContainerAtomicSafetyHandle
NativeContainer オブジェクトのコピーの仕組み
上図に示す 構造体の 3 つの異なるコピーは、同じ実際のコンテナを表しています。各コピーは保存された同じデータ、および元の と同じ安全データを指しています。ただし、 の各コピーは、ジョブがそのコピーで実行できる内容を示す互いに異なるフラグを持っています。安全データへのポインターは、フラグとの組み合わせで、 を構成します。
NativeArrayNativeArrayNativeArrayAtomicSafetyHandleバージョン番号
NativeContainerNativeContainerNativeContainerNativeContainerNativeContainerNativeContainerAtomicSafetyHandleNativeContainer代わりに、各レコードにはバージョン番号が追加されます。バージョン番号のコピーは、そのレコードを参照する各 内に格納されます。NativeContainer が破棄されると、Unity は を呼び出し、主要レコードのバージョン番号を更新します。こうすることで、このレコードは他の インスタンスに再利用できるようになります。
AtomicSafetyHandleRelease()NativeContainer残りの各 は、保存されているバージョン番号と主要レコードのバージョン番号を比較して、 が破棄されたかどうかをテストします。Unity は、 や などのメソッドの呼び出しの一部として、このテストを自動的に実行します。
AtomicSafetyHandle NativeContainerCheckReadAndThrowCheckWriteAndThrow動的ネイティブコンテナの静的ビュー
動的ネイティブコンテナは、可変サイズのコンテナです。 (Collections パッケージで使用可能) などの要素を継続的に追加できます。これは、 などの静的ネイティブコンテナがサイズを変更できないのとは対照的です。
NativeList<T>NativeArray<T>動的ネイティブコンテナを使用する場合、ビューと呼ばれる別のインターフェースからデータに直接アクセスすることもできます。ビューを使用すると、 オブジェクトのデータをコピーしたり所有権を取得したりすることなく、エイリアスを作成できます。ビューの例として、ネイティブコンテナの要素ごとにデータにアクセスできる Enumerator (列挙子) オブジェクトがあります。また、 を のように扱うために使用できる などのメソッドもあります。
NativeContainerNativeListNativeArrayNativeList<T>.AsArray動的ネイティブコンテナのサイズを変更する場合、ビューは通常スレッドセーフではありません。これは、ネイティブコンテナのサイズを変更すると、Unity がメモリ内のデータの格納場所を変更し、ビューの格納するポインターが無効になるためです。
補助バージョン番号
動的ネイティブコンテナのサイズの変更に対応するため、安全システムには に補助バージョン番号が記録されています。バージョン更新の仕組みと似ていますが、ここでは主要レコードに格納された 2 つ目のバージョン番号を使用し、1 つ目のバージョン番号とは別に更新します。
AtomicSafetyHandle補助バージョン番号を使用するには、 を使用して、ビューを に保存されているデータに設定します。ネイティブコンテナのサイズを変更する操作や、既存のビューを無効にする操作には、 ではなく を使用します。また、ネイティブコンテナへ書き込むジョブがスケジュールされるたびにビューが自動的に無効になるよう、 に を設定する必要があります。
UseSecondaryVersionNativeContainerCheckWriteAndThrowCheckWriteAndBumpSecondaryVersionNativeContainerSetBumpSecondaryVersionOnScheduleWriteビューを作成して をコピーする場合は、 を使用して、ネイティブコンテナのメモリーへのポインターをビューにコピーしても安全であることを確認します。
AtomicSafetyHandleCheckGetSecondaryDataPointerAndThrow特殊フォルダー
一時的なネイティブコンテナで作業するときに使える特別なハンドルが 2 つあります。
- :
GetTempMemoryHandleで割り当てられたネイティブコンテナで使用できるAllocator.Tempを返します。現在の一時メモリ範囲が終了すると、Unity はこのハンドルを自動的に無効にするため、自分で解除する必要はありません。特定のAtomicSafetyHandleがAtomicSafetyHandleによって返されるハンドルかどうかをテストするには、GetTempMemoryHandleを使用します。IsTempMemoryHandle - : 安全でないメモリで保持された一時的なネイティブコンテナに使用できるグローバルハンドルを返します。例えば、スタックメモリから構築された
GetTempUnsafePtrSliceHandleなどです。このハンドルを使用するコンテナをジョブに渡すことはできません。NativeSlice