创建Jobs

Unity - Manual: Creating jobs​docs.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 jobs​docs.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的创建和调度相关推荐

  1. Unity C# Job System介绍(二) 安全性系统和NativeContainer

    C# Job System中的安全性系统 https://docs.unity3d.com/Manual/JobSystemSafetySystem.html​docs.unity3d.com 资源竞 ...

  2. Unity C# Job System介绍(四) 并行化Job和故障排除(完结)

    并行化job ParallelFor jobs​docs.unity3d.com 当调度Jobs时,只能有一个job来进行一项任务.在游戏中,非常常见的情况是在一个庞大数量的对象上执行一个相同的操作. ...

  3. Unity C# Job System介绍(一) Job System总览和多线程

    C# Job System 总览 Unity的C# Job System使用户可以编写与Unity其他部件交互的多线程代码,同时让编写正确的代码变得更容易. 编写多线程代码可以提供更好的性能表现.这包 ...

  4. Unity 面试题汇总(三)Unity 基础相关

    Unity 面试题汇总(三)Unity 基础相关 目录 Unity 面试题汇总(三)Unity 基础相关 0.FSM(状态机).HFSM(分层状态机).BT(行为树)的区别 1.什么是协同程序? 2. ...

  5. {Django基础九之中间件} 一 前戏 二 中间件介绍 三 自定义中间件 四 中间件的执行流程 五 中间件版登陆认证...

    Django基础九之中间件 本节目录 一 前戏 二 中间件介绍 三 自定义中间件 四 中间件的执行流程 五 中间件版登陆认证 六 xxx 七 xxx 八 xxx 一 前戏 我们在前面的课程中已经学会了 ...

  6. Unity UGUI控件介绍

    UGUI UGUI是Unity官方的UI实现方式,自从Unity4.6以后,Unity官方推出了新版UGUI系统.新版UGUI系统相比于OnGUI系统更加人性化,而且是一个开源系统,利于游戏开发人员进 ...

  7. Unity中的shadows(三)receive shadows

    Unity中的shadows(三)receive shadows SHADOW_COORDS TRANSFER_SHADOW 平行光的SHADOW_ATTENUATION 聚光灯的SHADOW_ATT ...

  8. NoSQL介绍(三)

    NoSQL介绍(三) Redis数据类型-string string为最简单的类型,与Memcached一样的类型,一个key对应一个value,其支持的操作与Memcached的操作类似,它的功能更 ...

  9. Unity4.x 2D游戏开发基础教程第1章Unity及其组成的介绍

    Unity4.x 2D游戏开发基础教程第1章Unity及其组成的介绍 本书主要讲解的是,如何使用Unity开发2D游戏.但在开始讲解之前,最好先熟悉一下Unity这个工具.本章会首先介绍Unity的下 ...

最新文章

  1. 3星|《终身成长》:成长型思维让人进步,固定型思维让人固步自封。有新意的励志书,但有锤子模式的嫌疑。...
  2. 张苗 清华大学 计算机,2011222229张苗组件局域网及搭建服务器技术分析.doc
  3. Python图像处理库PIL -- 学习资源
  4. rabbitMq简介及docker安装
  5. 定义和使用含有泛型的接口
  6. css3小球坠落,CSS3 圆球体内的小球碰撞运动
  7. 简明易懂的c#入门指南_统计假设检验的简明指南
  8. 上河南星海科技_揭秘丨赣江新区网红打卡点,为你按下科技快进键!
  9. java将map输出到d盘_java后台的“/”相对路径不是代表webroot吗,为什么在这里代表了d盘,测试的文件都传到了d盘呀?...
  10. matlab dsolve函数构造微分方程
  11. Vue实现购物车功能
  12. stm32F1规避浮点运算
  13. 考研英语——长难句语法
  14. 把自己做的网站进行app封包
  15. PB9核心之——数据窗口对象使用
  16. css之如何清除浮动
  17. 如何对电脑里越来越多的文件进行管理,分类最重要
  18. echarts常用配置项整合之xAxis,yAxis
  19. 解决idea 搜狗输入法 光标不跟随问题
  20. 破解行Android apk 逆向工程研究﹣破解 MyTV HD 機種限制手記

热门文章

  1. php更新svn,利用php进行svn更新的php代码及php执行svn更新注意事项
  2. [蓝桥杯][2013年第四届真题]带分数
  3. 广告深度学习计算:异构硬件加速实践
  4. ROS2学习(十六).ROS概念 - 构建系统
  5. linux7怎么安装yum,centos7下怎么安装yum
  6. c++如何获取文件时间_如何在Windows 10上获取文件或文件夹的所有权
  7. 图神经网络(二)GCN的性质(2)GCN能够对图数据进行端对端学习
  8. python二分法编程_python基础18——二分法面向过程匿名函数
  9. 如何设置运行在Virtualbox内的Ubuntu虚拟机的静态ip地址
  10. linux-shell命令之rmdir(remove dir)【删除目录】