Unity3D :实现自定义本机容器

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

实现自定义本机容器

若要实现自定义本机容器,必须使用 NativeContainer 属性批注类型。您还应该了解原生容器如何与安全系统集成。

要实现两个主要元素:

  • 使用情况跟踪:允许 Unity 跟踪使用实例的计划作业,以便检测和防止潜在的冲突,例如两个作业同时写入同一本机容器。NativeContainer
  • 泄漏跟踪:检测何时未正确处理。在此情况下,会发生内存泄漏,其中分配给 的内存在程序的整个剩余生存期内变得不可用。NativeContainerNativeContainer

实施使用情况跟踪

若要访问代码中的使用情况跟踪,请使用 AtomicSafetyHandle 类。 包含对安全系统为给定本地容器存储的中心信息的引用,并且是 a 的方法与安全系统交互的主要方式。因此,每个实例都必须包含一个名为 的字段。AtomicSafetyHandleNativeContainerNativeContainerAtomicSafetyHandlem_Safety

每个都存储一组标志,这些标志指示可以在当前上下文中对本机容器执行哪些类型的操作。当作业包含实例时,作业系统会自动配置中的标志,以反映本机容器在该作业中的使用方式。AtomicSafetyHandleNativeContainerAtomicSafetyHandle

当作业尝试从实例读取时,作业系统会在读取之前调用该方法,以确认作业是否具有对本机容器的读取访问权限。同样,当作业尝试写入本机容器时,作业系统会在写入之前调用,以检查作业是否具有对本机容器的写入访问权限。分配了同一实例的两个作业具有该本机容器的单独对象,因此,尽管它们都引用同一组中心信息,但它们都可以各自持有单独的标志,指示每个作业对本机容器的读写访问权限。NativeContainerCheckReadAndThrowCheckWriteAndThrowNativeContainerAtomicSafetyHandle

实施泄漏跟踪

DisposeSentinel 类提供泄漏跟踪。Unity 在垃圾回收器收集对象时报告内存泄漏。要创建 ,请使用该方法,该方法也会同时初始化 。使用此方法时,无需初始化 .释放 时,该方法在单个调用中同时释放 和 。DisposeSentinelDisposeSentinelCreateAtomicSafetyHandleAtomicSafetyHandleNativeContainerDisposeDisposeSentinelAtomicSafetyHandle

要确定泄漏的创建位置,您可以捕获最初分配内存的堆栈跟踪。为此,请使用 NativeLeakDetection.Mode 属性。您还可以在编辑器中访问此属性。为此,请转到首选项>作业>泄漏检测级别,然后选择所需的泄漏检测级别。NativeContainer

嵌套本机容器

安全系统不支持作业中的嵌套本机容器,因为作业系统无法为较大实例中的每个人正确配置 。AtomicSafetyHandleNativeContainerNativeContainer

要防止调度使用嵌套本机容器的作业,请使用当包含其他实例时,会将标记为嵌套。SetNestedContainerNativeContainerNativeContainer

安全 ID 和错误消息

安全系统会提供错误消息,指示代码何时不符合安全约束。为了帮助使错误消息更清晰,您可以将对象的名称注册到安全系统。NativeContainer

若要注册名称,请使用 NewStaticSafetyId,它将返回一个安全 ID,您可以将其传递给 SetStaticSafetyId。创建安全 ID 后,可以将其重用于 的所有实例,因此常见的模式是将其存储在容器类的静态成员中。NativeContainer

您还可以使用 SetCustomErrorMessage 覆盖特定安全约束冲突的错误消息。

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

上一篇:Unity3D :线程安全类型 (mvrlink.com)

下一篇:Unity3D :复制本机容器结构 (mvrlink.com)

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