安全系统复制数据过程的缺点是它还隔离了每个副本中作业的结果。要克服此限制,您需要将结果存储在一种名为NativeContainer的共享内存中。

什么是NativeContainer?

NativeContainer是托管值类型,为本机内存提供相对安全的C#包装器。它包含指向非托管分配的指针。与Unity C#作业系统一起使用时,a NativeContainer允许作业访问与主线程共享的数据,而不是使用副本。

有哪些类型的NativeContainer?

Unity附带一个NativeContainer名为NativeArray的程序。您还可以NativeArray使用NativeSlice操作a 以获取NativeArray从特定位置到特定长度的子集。

注意:实体组件系统(ECS)包扩展了Unity.Collections命名空间以包括其他类型NativeContainer

  • NativeList- 可调整大小NativeArray
  • NativeHashMap - 键和值对。
  • NativeMultiHashMap - 每个键有多个值。
  • NativeQueue先进先出FIFO)队列。

NativeContainer和安全系统

安全系统内置于所有NativeContainer类型。它跟踪什么是读写任何内容NativeContainer

注意:所有NativeContainer类型的安全检查(例如越界检查,重新分配检查和竞争条件检查)仅在Unity 编辑器和播放模式下可用。

该安全系统的一部分是DisposeSentinelAtomicSafetyHandle。该DisposeSentinel检测内存泄漏,给你一个错误,如果你没有正确地释放你的记忆。泄漏发生后很久就会发生内存泄漏错误。

使用AtomicSafetyHandle转移NativeContainer代码的所有权。例如,如果两个预定作业写入相同NativeArray,则安全系统会抛出异常,并显示明确的错误消息,说明解决问题的原因和方法。安排违规工作时,安全系统会抛出此异常。

在这种情况下,您可以安排具有依赖关系的作业。第一个作业可以写入NativeContainer,一旦完成执行,下一个作业就可以安全地读取和写入相同的作业NativeContainer。从主线程访问数据时,读写限制也适用。安全系统允许多个作业并行读取相同的数据。

默认情况下,当作业有权访问a时NativeContainer,它具有读写访问权限。此配置可能会降低性能。C#作业系统不允许您计划与写入其中的NativeContainer另一个作业同时具有写访问权限的作业。

如果作业不需要写入a NativeContainer,请NativeContainer使用[ReadOnly]属性标记,如下所示:

[ReadOnly]
public NativeArray<int> input;

在上面的示例中,您可以与其他对第一个也具有只读访问权限的作业同时执行作业NativeArray

注意:无法防止从作业中访问静态数据。访问静态数据会绕过所有安全系统,并可能导致Unity崩溃。有关更多信息,请参阅C#作业系统提示和故障排除

NativeContainer分配器

创建时NativeContainer,必须指定所需的内存分配类型。分配类型取决于作业运行的时间长度。通过这种方式,您可以定制分配以在每种情况下获得最佳性能。

内存分配和释放有三种Allocator类型NativeContainer。在实例化你的时候需要指定合适的一个NativeContainer

  • Allocator.Temp分配最快。它适用于寿命为一帧或更少的分配。您不应将NativeContainer分配Temp用于作业。您还需要Dispose在从方法调用返回之前调用该方法(例如MonoBehaviour.Update,或从本机代码到托管代码的任何其他回调)。
  • Allocator.TempJob是一个比较慢的分配,Temp但速度比Persistent。它适用于四帧生命周期内的分配,并且是线程安全的。如果Dispose在四帧内没有,则控制台会打印一条警告,该警告是从本机代码生成的。大多数小型工作都使用此NativeContainer分配类型。
  • Allocator.Persistent是最慢的分配,但只要你需要它,并且如果有必要,可以持续整个应用程序的生命周期。它是直接调用malloc的包装器。较长的作业可以使用此NativeContainer分配类型。你不应该使用Persistent性能至关重要的地方。

例如:

NativeArray<float> result = new NativeArray<float>(1, Allocator.TempJob);

注意:上例中的数字1表示的大小NativeArray。在这种情况下,它只有一个数组元素(因为它只存储一个数据result)。

NativeContainer的更多相关文章

  1. C#作业系统提示和故障排除

    使用Unity C#作业系统时,请确保遵守以下内容: 不要从作业访问静态数据 从作业访问静态数据会绕过所有安全系统.如果您访问错误的数据,您可能会以意想不到的方式崩溃Unity.例如,访问MonoBe ...

  2. JobHandle和依赖项

    要当您调用作业的Schedule方法时,它将返回JobHandle.您可以在代码中使用一个JobHandle作为其他作业的依赖项.如果作业取决于另一个作业的结果,您可以将第一个作业JobHandle作 ...

  3. 移动app

    什么是移动App开发[重点] 苹果上的软件是如何开发出来的:使用IOS平台的开发工具和开发语言进行设计开发的!苹果上的开发语言:OC.Swift 安卓平台上的软件又是如何开发出来的:使用Java这么语 ...

  4. ECS 系统 Entity-Component-System

    已经推出了很久了, 貌似也有一些人开始使用, 我是在看守望先锋的程序设计相关文章的时候看到 ECS 的, 从它的设计逻辑上看, 核心就是 Composition over inheritance (o ...

  5. Unity-JobSystom

    什么是Job System? 一个job system通过创建jobs而不是线程来管理多线程的代码.Job是一个小的工作单元,不等同线程.管理运行在多个核心上的一组工人线程(worker thread ...

  6. Unity-JobSystem

    NativeContainer 为什么 为解决Job之间数据处理结果的隔离问题. 是什么 NativeContainer是托管的值类型,可以相对安全的操作native内存. 注意 不能两个job同时写 ...

随机推荐

  1. php类知识---接口

    <?phpinterface wenwa{ function eat();}interface duwa{ function drink();}class cpc implements duwa ...

  2. 第十一章 前端开发-bootstrap

    11.5.0 bootstrap 11.5.1 bootstrap的介绍和响应式 http://book.luffycity.com/python-book/95-bootstrap/951-boot ...

  3. BZOJ 1692: [Usaco2007 Dec]队列变换 (后缀数组/二分+Hash)

    跟BZOJ 4278: [ONTAK2015]Tasowanie一模一样 SA的做法就是把原串倒过来接在原串后面,O(nlogn)O(nlogn)O(nlogn)做后缀数组,就能O(1)O(1)O(1 ...

  4. CentOS 安装oracle client

    下载Oracle Client 1.通过下载地址下载 下载地址:https://www.oracle.com/database/technologies/instant-client/linux-x8 ...

  5. php+列出目录文件

    用过浏览器的开发人员都对大文件上传与下载比较困扰,之前遇到了一个php文件夹上传下载的问题,无奈之下自己开发了一套文件上传控件,在这里分享一下.希望能对你有所帮助.此控件PC全平台支持包括mac,li ...

  6. Visio:为什么按下方向键,选中的目标不动,绘图区(页面)却在移动

    造冰箱的大熊猫,本文适用于Microsoft Visio 2007@cnblogs 2018/12/12 检查下键盘的“Scroll Lock”键是不是被激活了(键盘上对应的指示灯被点亮).Scrol ...

  7. 路由器配置——单臂路由实现VLAN间通信

    一.实验目的:用路由器使同和不同vlan可以通信 二.拓扑图如下: 三.具体步骤: (1)R1路由器配置: Router>en  --进入特权模式Router#conf t  --进入全局配置模 ...

  8. 【原创】谈一个数学教育专业的IT职业生涯

    2003年,有许多值得记住,第一个是非典,第二个就是高考数学卷.直到今年2019年,时隔16年,有人说2019年高考数学卷难度堪比2003年,但还没难到2003年的程度. 我,2003年高考,进考场先 ...

  9. 51 Nod 1629 B君的圆锥

    1629 B君的圆锥  基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题  收藏  关注 B君要用一个表面积为S的圆锥将白山云包起来. B君希望包住的白山云体积尽量大 ...

  10. TCP被动打开 之 第二次握手-发送SYN+ACK

    假定客户端执行主动打开,发送syn包到服务器,服务器执行完该包的第一次握手操作后,调用af_ops->send_synack向客户端发送syn+ack包,该回调实际调用tcp_v4_send_s ...