Unity3D :复制本机容器结构

推荐:将NSDT场景编辑器加入你的3D工具链
3D工具集:NSDT简石数字孪生

复制本机容器结构

本机容器是值类型,这意味着当它们分配给变量时,Unity 会复制结构,其中包含指向本机容器数据存储位置的指针,包括其 AtomicSafetyHandle。它不会复制 .NativeContainerNativeContainer

此方案意味着结构的多个副本可能都引用相同的内存区域,并且都包含引用同一中心记录的对象。NativeContainerAtomicSafetyHandle

本机容器对象的副本如何工作
本机容器对象的副本如何工作

上图显示了结构的三个不同副本,它们都表示相同的实际容器。每个副本都指向与原始 相同的存储数据以及相同的安全数据。但是,每个副本都有不同的标志,指示允许作业对该副本执行的操作。指向安全数据的指针与标志相结合,构成了 .NativeArrayNativeArrayNativeArrayAtomicSafetyHandle

版本号

如果 a 被处理掉,则该结构的所有副本都必须识别出原件无效。释放原始数据意味着用于保存 数据的内存块已被解除分配。在此情况下,指向存储在 的每个副本中的数据的指针无效,如果使用它可能会导致访问冲突。NativeContainerNativeContainerNativeContainerNativeContainerNativeContainerNativeContainer

还指向一个中心记录,该记录对实例无效。但是,安全系统从不为中央记录解除分配内存,因此避免了访问违规的风险。AtomicSafetyHandleNativeContainer

相反,每条记录都包含一个版本号。版本号的副本存储在引用该记录的每个版本中。释放本机容器时,Unity 将调用 ,这会递增中心记录上的版本号。在此之后,该记录可以重用于其他实例。AtomicSafetyHandleRelease()NativeContainer

每个剩余部分将其存储的版本号与中央记录中的版本号进行比较,以测试是否已释放。Unity 在调用 CheckReadAndThrow 和 CheckWriteAndThrow 等方法时自动执行此测试。AtomicSafetyHandleNativeContainer

动态本机容器的静态视图

动态本机容器是具有可变大小的容器,您可以继续向其添加元素,例如 NativeList<T>(在集合包中可用)。这与像 NativeArray<T> 这样的静态本机容器形成对比,后者具有无法更改的固定大小。

使用动态本机容器时,还可以通过另一个接口(称为视图)直接访问其数据。视图允许您为对象的数据设置别名,而无需复制或获取数据的所有权。视图的示例包括枚举器对象(可用于逐个元素访问本机容器中的数据)和 NativeList<T> 等方法。AsArray,您可以使用它来将 视为 .NativeContainerNativeListNativeArray

如果动态本机容器的大小发生更改,视图通常不是线程安全的。这是因为当本机容器的大小发生变化时,Unity 会重新定位数据存储在内存中的位置,这会导致视图存储的任何指针变得无效。

辅助版本号

为了支持动态本机容器大小发生变化的情况,安全系统在 .此机制类似于版本控制机制,但使用存储在中央记录中的第二个版本号,该版本号可以独立于第一个版本号递增。AtomicSafetyHandle

要使用辅助版本号,可以使用 UseSecondaryVersion 将视图配置为存储在 中的数据。对于更改本机容器大小或使现有视图无效的操作,请使用 CheckWriteAndBumpSecondaryVersion 而不是 。您还需要将 SetBumpSecondaryVersionOnScheduleWrite 设置为 在 上,以便在计划写入本机容器的作业时自动使视图失效。NativeContainerCheckWriteAndThrowNativeContainer

创建视图并将其复制到该视图时,请使用 CheckGetSecondaryDataPointerAndThrow 来确认将指向本机容器内存的指针复制到视图中是安全的。AtomicSafetyHandle

特殊手柄

有两个特殊句柄,可以在使用临时本机容器时使用:

  • GetTempMemoryHandle:返回可在分配有 .当当前临时内存范围退出时,Unity 会自动使此句柄失效,因此您无需自行释放它。要测试某个特定是否是 返回的句柄,请使用 。AtomicSafetyHandleAllocator.TempAtomicSafetyHandleGetTempMemoryHandleIsTempMemoryHandle
  • GetTempUnsafePtrSliceHandle:返回可用于由不安全内存支持的临时本机容器的全局句柄。例如,从堆栈内存构造的。不能将使用此句柄的容器传递到作业中。NativeSlice


3D建模学习工作室整理翻译,转载请注明出处!

上一篇:Unity3D :实现自定义本机容器 (mvrlink.com)

下一篇:Unity3D :自定义本机容器示例 (mvrlink.com)

NSDT场景编辑器 | NSDT 数字孪生 | GLTF在线编辑器 | 3D模型在线转换 | UnrealSynth虚幻合成数据生成器 | 3D模型自动纹理化工具
2023 power by nsdt©鄂ICP备2023000829号