本系列是基于Unity 2019.3的官方文档翻译的。原文比较生硬,我在个人觉得需要解释的地方增加了自己理解和批注。欢迎留言讨论。
原文地址
https://docs.unity3d.com/Manual/JobSystem.html
C#Job System
Unity C#Job System使您可以编写与Unity Engine交互的简单且安全的多线程代码,以增强游戏性能。您可以将C#Job System与Unity Entity Component System(ECS)结合使用,该体系结构使为所有平台创建高效的机器代码变得简单。
索引
- C#Job System概述(本章内)
- 什么是多线程?(本章内)
- 什么是Job System?(本章内)
- C#Job System中的安全系统
- NativeContainer
- 创建Job(Creating jobs)
- 安排Job(Scheduling jobs)
- JobHandle和依赖
- ParallelFor类型的Job
- ParallelForTransform类型的Job
- C#Job System的Tips和故障排除
C#Job System概述
C#Job System如何工作
Unity C#Job System允许用户编写与Unity的其他部分良好交互的多线程代码,并使编写正确代码的过程变得更加容易。编写多线程代码可以提供高性能的好处。这些包括显着提高帧速率。将Burst编译器与C#Job System一起使用可以提高代码生成质量(这里是指编译后生成的机器代码),这也可以大大减少移动设备上的电池消耗。
C#Job System的一个重要方面是,它与Unity内部使用的内容(Unity’s native job system)集成在一起。用户编写的代码和Unity共享工作线程。这种合作避免了创建比CPU内核更多的线程,这将导致CPU资源争用。
有关更多信息,请观看在GDC上谈论Unity的内容-Job System&Entity Component System
什么是多线程?
在单线程计算系统中,一次执行一条指令,一次产生一条结果。加载和完成程序的时间取决于您需要CPU完成的工作量。多线程是一种编程类型,它利用CPU的功能跨多个内核同时处理多个线程。它们不是同时执行任务或指令,而是同时运行。
默认情况下,一个线程在程序的开头运行。这是“主线程”。主线程创建新线程来处理任务。这些新线程彼此并行运行,并且通常在完成后将其结果与主线程同步。
如果您有一些长时间运行的任务,则这种多线程方法很好用。但是,游戏开发代码通常包含许多小的指令,可以立即执行。如果为每个线程创建一个线程,则最终可能会有很多线程,每个线程的生存期都很短。这可能会限制CPU和操作系统的处理能力。
有一个线程池(Thread Pool)可以减轻线程寿命的问题。但是,即使您使用线程池,也可能同时有大量活动的线程。具有比CPU核心更多的线程会导致线程彼此争用CPU资源,从而导致频繁的上下文切换。上下文切换是以下过程:在执行过程中部分保存线程的状态,然后在另一个线程上工作,然后重建第一个线程,以继续对其进行处理。上下文切换会占用大量资源,因此应尽可能避免使用它。(我想凡是有过多线程开发经历的同学看完这一段后会默默的点个赞,表示认同)
什么是Job System?
Job System通过创建Job而不是线程来管理多线程代码。Job System管理跨多个核心的一组工作线程。通常每个逻辑CPU内核只有一个工作线程,以避免上下文切换(尽管它可能为操作系统或其他专用应用程序保留一些内核)。Job System将Job放入Job队列中以执行。Job System中的工作线程从Job队列中获取项目并执行它们。Job System管理依赖关系(Job之间的),并确保Job以适当的顺序执行。
什么是Job?
一项Job是完成一项特定任务的一小部分工作。Job接收参数并对数据进行操作,类似于方法调用的行为。Job可以是独立的,也可以依赖其他Job才能运行。
什么是Job依赖性( job dependencies)?
在复杂的系统(如游戏开发所需的系统)中,每个Job不太可能是独立的。一个Job通常是为下一个Job准备数据。Jobs知道并支持依赖项才能完成这项工作。如果jobA依赖于jobB,Job System确保JobA直到JobB完成才开始执行。
延展阅读
https://www.howtogeek.com/194756/cpu-basics-multiple-cpus-cores-and-hyper-threading-explained/