NativeContainer
安全系统复制数据的过程的缺点是它还隔离了每个副本中作业的结果。要克服此限制,您需要将结果存储在一种名为NativeContainer的共享内存中。
什么是NativeContainer?
A 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 编辑器和播放模式下可用。
该安全系统的一部分是DisposeSentinel和AtomicSafetyHandle。该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的更多相关文章
- C#作业系统提示和故障排除
使用Unity C#作业系统时,请确保遵守以下内容: 不要从作业访问静态数据 从作业访问静态数据会绕过所有安全系统.如果您访问错误的数据,您可能会以意想不到的方式崩溃Unity.例如,访问MonoBe ...
- JobHandle和依赖项
要当您调用作业的Schedule方法时,它将返回JobHandle.您可以在代码中使用一个JobHandle作为其他作业的依赖项.如果作业取决于另一个作业的结果,您可以将第一个作业JobHandle作 ...
- 移动app
什么是移动App开发[重点] 苹果上的软件是如何开发出来的:使用IOS平台的开发工具和开发语言进行设计开发的!苹果上的开发语言:OC.Swift 安卓平台上的软件又是如何开发出来的:使用Java这么语 ...
- ECS 系统 Entity-Component-System
已经推出了很久了, 貌似也有一些人开始使用, 我是在看守望先锋的程序设计相关文章的时候看到 ECS 的, 从它的设计逻辑上看, 核心就是 Composition over inheritance (o ...
- Unity-JobSystom
什么是Job System? 一个job system通过创建jobs而不是线程来管理多线程的代码.Job是一个小的工作单元,不等同线程.管理运行在多个核心上的一组工人线程(worker thread ...
- Unity-JobSystem
NativeContainer 为什么 为解决Job之间数据处理结果的隔离问题. 是什么 NativeContainer是托管的值类型,可以相对安全的操作native内存. 注意 不能两个job同时写 ...
随机推荐
- veeValidate实战
说在前面 vee-validate 版本2.0.4的学习github地址我的项目地址第一次认真的在git上写一个demo教程,喜欢的可以star一下~^o^~ (^-^) (^o^) 后续会有一个完整 ...
- Android蓝牙操作
1.添加蓝牙权限 <uses-permission android:name = "android.permission.BLUETOOTH"/> <!--启用应 ...
- CentOS 7 下Emacs无法录入中文的问题
Emacs下的各种快捷键操作,实在是太方便了,像毒药一样让人上瘾! 问题描述: 最近重装了系统以及各种软件,但是碰到一个奇怪的问题,安装了极点五笔中文输入法,系统语言也设置为中文,结果在vim.ged ...
- 在linux 安装python
wget https://www.python.org/ftp/python/3.7.1/Python-3.7.1.tgz tar -zxvf Python-3.7.1.tgz cd Python-3 ...
- JVM(一),谈谈你对java的理解
一.谈谈你对java的理解 1.Java特性 (1)平台无关性 一次编译到处运行 (2)GC 垃圾回收机制 (3)语言特性 泛型-反射机制-lambda表达式 (4)面向对象 面向对象语言-三大特性( ...
- LabVIEW:可执行文件运行缺少运行库问题
造冰箱的大熊猫@cnblogs 2018/5/11 上周调试设备网口犯了一个低级错误,今天又搞出一个笑话 目标机上没有LabVIEW开发环境,于是在开发机上将VI打包成可执行程序.在目标机上运行可执行 ...
- RabbitMQ安装遇到的问题及解决记录
提示:若是win10 请注意计算机名称不能有中文 安装Rabbit MQ 需要先安装 Erlang 这里下载版本Erlang OTP22.0 http://www.erlang.org/downloa ...
- 【BZOJ4671】 异或图
Description 定义两个结点数相同的图 G1 与图 G2 的异或为一个新的图 G, 其中如果 (u, v) 在 G1 与 G2 中的出现次数之和为 1, 那么边 (u, v) 在 G 中, 否 ...
- flask框架(七): flask模板
1.模板的使用 Flask使用的是Jinja2模板,所以其语法和Django无差别 2.自定义模板方法 Flask中自定义模板方法的方式和Bottle相似,创建一个函数并通过参数的形式传入render ...
- 2019icpc南京网络赛 A 主席树
题意 给一个\(n\times n\)的螺旋矩阵,给出其中的\(m\)个点的值分别为各个点上数字的数位之和,给出\(q\)个询问,每次询问从\((x1,y1)\)到\((x2,y2)\)的子矩阵的和. ...