Unity C# Job System介绍(三) Job的创建和调度

创建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();

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/246227.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

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

并行化job ParallelFor jobs​docs.unity3d.com 当调度Jobs时&#xff0c;只能有一个job来进行一项任务。在游戏中&#xff0c;非常常见的情况是在一个庞大数量的对象上执行一个相同的操作。这里有一个独立的job类型叫做IJobParallelFor来处理此类问题。ParallelFor jobs当调…

C# Job System

概述 设计目的&#xff1a;简单安全地使用多线程&#xff0c;随便就能写出高性能代码 收益&#xff1a;FPS更高&#xff0c;电池消耗更低&#xff08;Burst编译器&#xff09; 并行性&#xff1a;C# Job System和Unity Native Job System共享工作线程worker threads&#xf…

Unity游戏开发——C#特性Attribute与自动化

这篇文章主要讲一下C#里面Attribute的使用方法及其可能的应用场景。 比如你把玩家的血量、攻击、防御等属性写到枚举里面。然后界面可能有很多地方要根据这个枚举获取属性的描述文本。 比如你做网络框架的时候&#xff0c;一个协议号对应一个类的处理或者一个方法。 比如你做…

Unity c#中Attribute用法详解

举两个例子&#xff0c;在变量上使用[SerializeFiled]属性&#xff0c;可以强制让变量进行序列化&#xff0c;可以在Unity的Editor上进行赋值。 在Class上使用[RequireComponent]属性&#xff0c;就会在Class的GameObject上自动追加所需的Component。 以下是Unity官网文档中找…

attribute的用法--C#

一直以来都没理解attribute是个什么东西&#xff0c;也没怎么用&#xff0c;但是看msdn或者git上源码使用的还是蛮频繁的&#xff0c;今天好好整理了下&#xff0c;写下自己的理解和例子&#xff1a; attribute主要用来说明代码段的的信息&#xff0c;标志等&#xff1b;可以一…

走进LWRP(Universal RP)的世界

走进LWRP&#xff08;Universal RP&#xff09;的世界 原文&#xff1a;https://connect.unity.com/p/zou-jin-lwrp-universal-rp-de-shi-jie LWRP自Unity2018发布以来&#xff0c;进入大家视野已经有一段时间了&#xff0c;不过对于广大Unity开发者来说&#xff0c;依然相对…

Unity Fine Prued Tiled Light (FPTL)

Fine Prued Tiled Light Lists 视频讲解&#xff1a;https://www.bilibili.com/video/av90517615 FPT是在Tile裁剪的基础上在进行一次剔除 可用于Forward Render和Deferred Shading两种渲染管线 利用了并行架构进行优化 将线程分为线程组再分为多个线程&#xff0c;Thread Gro…

Unity 2017 Game Optimization 读书笔记(1)Scripting Strategies Part 1

1.Obtain Components using the fastest method Unity有多种Getcomponet的方法&#xff1a; GetComponent(string), GetComponent<T>() GetComponent(typeof(T)) 哪种效率最高会跟随Unity版本的变化而变化&#xff0c;对于Unity 2017&#xff0c;本书作者的测试是Ge…

C# 多态相关的文章

一 C# 多态的实现 封装、继承、多态&#xff0c;面向对象的三大特性&#xff0c;前两项理解相对容易&#xff0c;但要理解多态&#xff0c;特别是深入的了解&#xff0c;对于初学者而言可能就会有一定困难了。我一直认为学习OO的最好方法就是结合实践&#xff0c;封装、继承在…

C++ 虚函数和虚表

几篇写的不错的文章&#xff0c;本文是整合了这几篇文章&#xff0c;感谢这些大佬 https://www.jianshu.com/p/00dc0d939119 https://www.cnblogs.com/hushpa/p/5707475.html https://www.jianshu.com/p/91227e99dfd7 多态: 多态是面相对象语言一个重要的特性,多态即让同一…

Unity 2017 Game Optimization 读书笔记(2)Scripting Strategies Part 2

1. Share calculation output 和上一个Tip很像&#xff0c;可以缓存计算结果或者各种信息&#xff0c;避免多次重复的计算&#xff0c;例如在场景里查找一个物体&#xff0c;从文件读取数据&#xff0c;解析Json等等。 容易忽略的点是常常在基类了实现了某个方法&#xff0c;在…

Unity 2017 Game Optimization 读书笔记(3)Scripting Strategies Part 3

1.Avoid retrieving string properties from GameObjects 通常来讲&#xff0c;从C#的object中获取string 属性没有额外的内存开销&#xff0c;但是从Unity中的Gameobject获取string属性不一样&#xff0c;这会产生上一篇讲到的 Native-Managed Bridge&#xff08;Native内存和…

Unity 2017 Game Optimization 读书笔记(4)Scripting Strategies Part 4

1.Avoid Find() and SendMessage() at runtime SendMessage() 方法和 GameObject.Find() 相关的一系列方法都是开销非常大的。SendMessage()函数调用的耗时大约是一个普通函数调用的2000倍&#xff0c;GameObject.Find() 则和场景的复杂度相关&#xff0c;场景越复杂&#xff0…

团队行为心理学读书笔记(1)

阿伯拉罕马斯洛需求五个层次&#xff1a; &#xff08;1&#xff09;生理需要&#xff1a;食物、水、住所、性满足等方面的需要。 &#xff08;2&#xff09;安全需要&#xff1a;保护自己免受身体和情感伤害的需要。 &#xff08;3&#xff09;爱和归属的需要&#xff1a;渴…

团队行为心理学读书笔记(2)招聘背后的心理学

招聘时&#xff0c;不要只看应聘者的知识和技能 美国著名心理学家麦克利兰1973年提出了一个著名的素质冰山模型。所谓“冰山模型”&#xff0c;就是将人员个体素质的不同表现形式划分为表面的“冰山以上部分”和深藏的“冰山以下部分”。其中&#xff0c;冰山以上部分包括基本…

团队行为心理学读书笔记(3)领导力背后的行为心理学

有小缺点的主管&#xff0c;在下属眼里更有魅力 一位心理学教授曾做了一个关于管理者魅力的实验&#xff0c;他给被测试的对象播放了四段情节类似的访谈录像&#xff1a;出现在第一段录像里的是一个非常优秀的成功人士&#xff0c;他成就辉煌&#xff0c;面对主持人的采访&…

团队行为心理学读书笔记(4)带队伍背后的行为心理学

成就高效团队的基础&#xff1a;信任 信任具有三个特征&#xff1a;第一&#xff0c;信任者承担着一定的风险&#xff0c;信任者要承受被信任者失信的损失&#xff1b;第二&#xff0c;被信任者的行为不在信任者的控制之内&#xff1b;第三&#xff0c;如果某一方违约&#xf…

Unity HDRP中的光照烘焙测试(Mixed Lighing )和间接光

部分内容摘抄自&#xff1a;https://www.cnblogs.com/murongxiaopifu/p/8553367.html 直接光和间接光 大家都知道在Unity中&#xff0c;我们可以在场景中布置方向光、点光、聚光等类型的光源。但如果只有这些光&#xff0c;则场景内只会受到直接光的影响&#xff0c;而所谓的…

聊聊Unity项目管理的那些事:Git-flow和Unity

感谢原作者https://www.cnblogs.com/murongxiaopifu/p/6086849.html 0x00 前言 目前所在的团队实行敏捷开发已经有了一段时间了。敏捷开发中重要的一个话题便是如何对项目进行恰当的版本管理。项目从最初使用svn到之后的Git One Track策略再到现在的GitFlow策略&#xff0c;中…

聊聊网络游戏同步那点事

写的非常好的一篇博文&#xff0c;转载自https://www.cnblogs.com/murongxiaopifu/p/6376234.html 0x00 前言 16年年底的时候我从当时的公司离职&#xff0c;来到了目前任职的一家更专注于游戏开发的公司。接手的是一个platform游戏项目&#xff0c;基本情况是之前的团队完成…