Unity C# Job System介绍(三) Job的创建和调度
创建Jobs
Unity - Manual: Creating jobsdocs.unity3d.com
为了在Unity中创建一个job你需要实现IJOb接口。IJob允许你调度一个job,和其他jobs并发执行。Unity - Manual: Creating jobs为了在Unity中创建一个job你需要实现IJOb接口。IJob允许你调度一个job,和其他jobs并发执行。
注意:“job”是Unity中所有实现了IJob接口的结构的总称。
为了创建一个job,你需要: 创建一个实现IJob的结构体 添加job需要使用的成员变量(可以是blittable类型或NativeContainer类型) * 在结构体中添加一个叫Execute的方法并将job的具体逻辑实现放在里面
当job执行的时候,Excute方法在单个核心上运行一次
注意:当设计你的job时,记住你是在一份数据的拷贝上进行操作的,除了在使用NativeContainer的情况下。所以,在主线程访问一个job中数据的唯一方法就是将数据写入NativeContainer。
一个简单job定义的例子
// Job adding two floating point values together
public struct MyJob : IJob
{public float a;public float b;public NativeArray<float> result;public void Execute(){result[0] = a + b;}
}
调度Jobs
Unity - Manual: Scheduling jobsdocs.unity3d.com
为了在主线程中调度一个job,你必须: 实例化一个job 填充job中的数据 * 调用Schedule方法
在合适的时间调用Schedule将job放入到job的执行队列中。一旦job被调度,你不能中途打断一个job的执行。
注意:你只能从主线程中调用Schedule
调度一个job的例子
// Create a native array of a single float to store the result. This example waits for the job to complete for illustration purposes
NativeArray<float> result = new NativeArray<float>(1, Allocator.TempJob);// Set up the job data
MyJob jobData = new MyJob();
jobData.a = 10;
jobData.b = 10;
jobData.result = result;// Schedule the job
JobHandle handle = jobData.Schedule();// Wait for the job to complete
handle.Complete();// All copies of the NativeArray point to the same memory, you can access the result in "your" copy of the NativeArray
float aPlusB = result[0];// Free the memory allocated by the result array
result.Dispose();
JobHandle和依赖关系
当你调用Schedule方法时会返回一个JobHandle。你可以在代码中使用JobHandle作为其他jobs的依赖关系。如果一个job依赖于另一个job的结果,你可以将第一个job的JobHandle作为参数传递给第二个job的Schedule方法,像这样:
JobHandle firstJobHandle = firstJob.Schedule();
secondJob.Schedule(firstJobHandle);
组合依赖关系
如果一个job有多个依赖项,你可以使用JobHandle.CombineDependencies方法来合并他们。CombineDependencies允许你将他们传递给Schedule方法。
NativeArray<JobHandle> handles = new NativeArray<JobHandle>(numJobs, Allocator.TempJob);// Populate `handles` with `JobHandles` from multiple scheduled jobs...JobHandle jh = JobHandle.CombineDependencies(handles);
在主线程中等待jobs结束
使用JobHandle来让你的代码在主线程等待直到你的job执行完毕。为了做到这样,需要在JobHandle上调用Complete方法。这样的话,你就确定主线程可以安全访问job之前使用的NativeContainer。
注意:jobs不是在你调度他们的时候就立刻开始执行。如果你在主线程中等待job,并且你需要访问job正在使用的NativeContainer,你可以调用JobHandle.Complete方法。这个方法会刷新内存缓存中的jobs并开始执行。调用JobHandele的Complete会将job的NativeContainer类型数据的归属权交还给主线程。你需要在JobHandle上调用Complete来在主线程再次安全地访问这些NativeContainer类型。你也可以调用一个由job依赖产生的JobHandle的Complete方法来将数据的归属权交还给主线程。举例来说,你可以调用jobA的Complete方法,或者你可以调用依赖于jobA的jobB的Complete方法。两种方法都可以让你在调用Complete后在主线程安全访问jobA使用的NativeContainer类型。
否则,如果你不需要对数据的访问,但你需要明确地刷新这个批次的job。为了做到这点,调用静态方法JobHandle.ScheduleBatchedJobs。注意这个调用会对性能产生负面的影响。
一个关于多重job和依赖的例子
job的代码:
// Job adding two floating point values together
public struct MyJob : IJob
{public float a;public float b;public NativeArray<float> result;public void Execute(){result[0] = a + b;}
}// Job adding one to a value
public struct AddOneJob : IJob
{public NativeArray<float> result;public void Execute(){result[0] = result[0] + 1;}
}
主线程代码:
// Create a native array of a single float to store the result in. This example waits for the job to complete
NativeArray<float> result = new NativeArray<float>(1, Allocator.TempJob);// Setup the data for job #1
MyJob jobData = new MyJob();
jobData.a = 10;
jobData.b = 10;
jobData.result = result;// Schedule job #1
JobHandle firstHandle = jobData.Schedule();// Setup the data for job #2
AddOneJob incJobData = new AddOneJob();
incJobData.result = result;// Schedule job #2
JobHandle secondHandle = incJobData.Schedule(firstHandle);// Wait for job #2 to complete
secondHandle.Complete();// All copies of the NativeArray point to the same memory, you can access the result in "your" copy of the NativeArray
float aPlusB = result[0];// Free the memory allocated by the result array
result.Dispose();
Unity C# Job System介绍(三) Job的创建和调度相关推荐
- Unity C# Job System介绍(二) 安全性系统和NativeContainer
C# Job System中的安全性系统 https://docs.unity3d.com/Manual/JobSystemSafetySystem.htmldocs.unity3d.com 资源竞 ...
- Unity C# Job System介绍(四) 并行化Job和故障排除(完结)
并行化job ParallelFor jobsdocs.unity3d.com 当调度Jobs时,只能有一个job来进行一项任务.在游戏中,非常常见的情况是在一个庞大数量的对象上执行一个相同的操作. ...
- Unity C# Job System介绍(一) Job System总览和多线程
C# Job System 总览 Unity的C# Job System使用户可以编写与Unity其他部件交互的多线程代码,同时让编写正确的代码变得更容易. 编写多线程代码可以提供更好的性能表现.这包 ...
- Unity 面试题汇总(三)Unity 基础相关
Unity 面试题汇总(三)Unity 基础相关 目录 Unity 面试题汇总(三)Unity 基础相关 0.FSM(状态机).HFSM(分层状态机).BT(行为树)的区别 1.什么是协同程序? 2. ...
- {Django基础九之中间件} 一 前戏 二 中间件介绍 三 自定义中间件 四 中间件的执行流程 五 中间件版登陆认证...
Django基础九之中间件 本节目录 一 前戏 二 中间件介绍 三 自定义中间件 四 中间件的执行流程 五 中间件版登陆认证 六 xxx 七 xxx 八 xxx 一 前戏 我们在前面的课程中已经学会了 ...
- Unity UGUI控件介绍
UGUI UGUI是Unity官方的UI实现方式,自从Unity4.6以后,Unity官方推出了新版UGUI系统.新版UGUI系统相比于OnGUI系统更加人性化,而且是一个开源系统,利于游戏开发人员进 ...
- Unity中的shadows(三)receive shadows
Unity中的shadows(三)receive shadows SHADOW_COORDS TRANSFER_SHADOW 平行光的SHADOW_ATTENUATION 聚光灯的SHADOW_ATT ...
- NoSQL介绍(三)
NoSQL介绍(三) Redis数据类型-string string为最简单的类型,与Memcached一样的类型,一个key对应一个value,其支持的操作与Memcached的操作类似,它的功能更 ...
- Unity4.x 2D游戏开发基础教程第1章Unity及其组成的介绍
Unity4.x 2D游戏开发基础教程第1章Unity及其组成的介绍 本书主要讲解的是,如何使用Unity开发2D游戏.但在开始讲解之前,最好先熟悉一下Unity这个工具.本章会首先介绍Unity的下 ...
最新文章
- 3星|《终身成长》:成长型思维让人进步,固定型思维让人固步自封。有新意的励志书,但有锤子模式的嫌疑。...
- 张苗 清华大学 计算机,2011222229张苗组件局域网及搭建服务器技术分析.doc
- Python图像处理库PIL -- 学习资源
- rabbitMq简介及docker安装
- 定义和使用含有泛型的接口
- css3小球坠落,CSS3 圆球体内的小球碰撞运动
- 简明易懂的c#入门指南_统计假设检验的简明指南
- 上河南星海科技_揭秘丨赣江新区网红打卡点,为你按下科技快进键!
- java将map输出到d盘_java后台的“/”相对路径不是代表webroot吗,为什么在这里代表了d盘,测试的文件都传到了d盘呀?...
- matlab dsolve函数构造微分方程
- Vue实现购物车功能
- stm32F1规避浮点运算
- 考研英语——长难句语法
- 把自己做的网站进行app封包
- PB9核心之——数据窗口对象使用
- css之如何清除浮动
- 如何对电脑里越来越多的文件进行管理,分类最重要
- echarts常用配置项整合之xAxis,yAxis
- 解决idea 搜狗输入法 光标不跟随问题
- 破解行Android apk 逆向工程研究﹣破解 MyTV HD 機種限制手記
热门文章
- php更新svn,利用php进行svn更新的php代码及php执行svn更新注意事项
- [蓝桥杯][2013年第四届真题]带分数
- 广告深度学习计算:异构硬件加速实践
- ROS2学习(十六).ROS概念 - 构建系统
- linux7怎么安装yum,centos7下怎么安装yum
- c++如何获取文件时间_如何在Windows 10上获取文件或文件夹的所有权
- 图神经网络(二)GCN的性质(2)GCN能够对图数据进行端对端学习
- python二分法编程_python基础18——二分法面向过程匿名函数
- 如何设置运行在Virtualbox内的Ubuntu虚拟机的静态ip地址
- linux-shell命令之rmdir(remove dir)【删除目录】