Unity学习笔记:Job system

Unity的job system可以让我们编写简单且安全的多线程代码,从而让我们的游戏可以使用所有可用的CPU内核来执行代码。这样可以提升我们的游戏的性能。

Job system概述

Unity的job system可以帮助我们写出多线程代码,从而我们的游戏可以使用所有可用的CPU内核来执行代码。job system为我们提供了更好的游戏性能,因为我们的游戏可以更高效的使用所有正在运行的CPU内核的容量,而不是将所有的代码运行在一个CPU内核上。

我们可以单独使用job system,但为了追求更好的性能,我们应该同时使用Burst编译器,它是专门为了编译job system中的jobs而设计的。Burst编译器改进了代码的生成,从而提高了性能并减少了移动设备上的电池消耗。

我们还可以使用job system配合Unity的ECS来创建高性能的面向数据的代码。

多线程

Unity使用它原生的job system在多个工作线程上处理它的原生代码,这取决于运行我们游戏的设备上可用的CPU内核数量。通常情况下Unity只在一个线程上执行我们的代码,默认在程序开始时运行,这个线程被称为主线程。然而,当我们使用了job system,Unity就会在多个工作线程上执行我们的代码,这个被称为多线程。

多线程利用了CPU在多个内核上同时处理大量线程的能力。任务或指令不是一个接一个地执行,而是同时运行。工作线程彼此并行运行,并在完成后与主线程同步它们的结果。

Unity的job system可以确保有足够的线程来匹配多个CPU内核的容量,这意味着我们无需关心有多少CPU内核可用,就可以尽可能多的调度任务。这和其他的一些依赖诸如线程池技术的作业系统不同,那样的作业系统很容易出现无效地创建出多于CPU内核数的线程的情况。

工作窃取机制

Unity的job system使用了工作窃取机制作为其调度策略的一部分,通过这一机制,以实现均匀分配跨工作线程共享的任务。每一个工作线程都有可能比其他线程更快的处理好任务,因此,一旦一个工作线程完成了所有任务的处理,它就会查看其他工作线程的任务队列,然后去处理原本分配给其他工作线程的任务。

安全系统

为了让开发者更便捷的写出多线程代码,Unity的job system有一个安全系统,它可以检测所有潜在的race condition并且保护我们的代码避开他们可能导致的bug。race condition指的是两个或多个线程或进程在竞争访问共享资源的时候,因为时序上的差异,导致程序的执行结果出现不确定性的情况。例如,如果job system将我们代码中主线程的一个数据引用发送给了一个工作线程,那么就无法确定工作线程在写入数据的同时主线程是否正在读取数据,这个情景就构成了一个race condition。为了解决这个问题,Unity的job system向每一个工作线程发送的是它所要操作的数据的拷贝,而不是主线程中对该数据的引用,这个拷贝隔离了数据,从而消除了race condition。

job system的这种拷贝数据的方式意味着一个job只能访问blittable类型的数据。这些类型的数据在托管代码和原生代码之间传递时不需要转换。job system使用memcpy的方式来拷贝blittable类型的数据,并在托管代码和Unity原生代码之间传输数据。它在调度job时使用memcpy将数据存放到原生内存中,并在执行job时允许托管端访问该副本。

Collections包

除了Unity engine核心包里提供的job system,作为补充,Collections包还扩展了许多job类型和本地容器。

Jobs概述

一个job是完成某项特定任务的工作的一小部分,一个job接收参数并对数据进行操作,这个行为类似于方法的调用。job可以是独立,也可以依赖于其他job完成后才能运行。在Unity中,job指的是任何实现了IJob接口的结构体。

只有主线程可以调度和完成jobs。它不能访问任何正在运行的job的内容,两个job不能同时访问一个job的内容。为了确保job的有效运行,我们可以使它们互相依赖。Unity的job system允许我们创建复杂的依赖链,以确保我们的job以正确的顺序完成工作。

Job的类型

IJob: 在一个job线程上运行单个任务。

IJobParallelFor: 并行运行任务。每个并行运行的工作线程都有一个唯一的索引,以便安全地访问工作线程之间的共享数据。

IJobParallelForTransform: 这是专门用于并行处理Transform组件的Job接口。

IJobFor: 与IJobParallelFor相同,但允许我们调度job,使其不会并行运行。

  • 17
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值