你是否想知道如何编写安全的多线程代码?本文将介绍Job System背后的原理,以及它如何与实体组件系统ECS和Burst编译器一起使用。

  在Unity 2017.3中,我们可以通过C#代码来使用Job System。Job System与Burst编译器,实体组件系统ECS结合使用,可以编写出高性能多线程系统,让游戏完全利用多核处理器的强大功能。

  Job System的目的

  Job System的目的是允许游戏在运行时可以使用所有当前可用的CPU内核。几乎所有现代CPU拥有多个内核,而且该趋势仍在增长,然而许多游戏和应用仍只使用一个内核。

  当我们将处理过程分解为多个较小部分,并在多个内核上运行时,就能够同时并行处理它们,而不用一个一个按顺序处理。这样可以更高效地使用多个内核,从而带来性能的大幅提升。

  更具体的说,使用所有可用内核会减少模拟过程使用的实际时间,而无需优化线程时间即计算结果所需要用到的CPU指令数。

  减少实际运行时间

  通过Job System减少实际运行时间最简单的方法是使用ParallelFor作业。在以相同方式处理大量数值时,会使用到ParallelFor作业。

  本质上,Job System对数组中的每个元素都单独使用一个作业进行处理,这意味着如果可以的话,所有数组元素会利用多个CPU内核进行并行处理。

  实际情况中,作业的数量远低于数组中的元素数量,每个CPU内核会被分配到一个作业,每个作业会处理均等数量的元素。

  由于部分工作线程比其它线程的处理速度快,我们使用Work-stealing算法来平衡每个内核所花的时间。当一个工作线程完成自己所有的任务时,它会查看其它工作线程的队列,尝试处理一些被分配到其它线程的元素。

  ParallelFor外的其它作业

  如果要处理带有多个相似元素的繁重系统,使用ParallelFor的效果会很好。不过即使每个类型只有少量元素,仍可使用Job System。在高级层面上,Job System的设计是为了将整个应用程序分解为小型独立工作单元,称为作业。

  每一个CPU内核都有自己的线程执行这些作业,从而让所有作业并行处理。所以只要不同元素不互相依赖,只需为它们调度作业即可,不用等待其它作业,这样它们就能并行运行。

  早调度,晚完成

  谈到Job System时,我们经常提到“早调度,晚等待”的概念。该模式的目的是确保主线程不必等待作业完成。当主线程需要作业结果时,理想情况下该作业应该已完成执行。一个没有简单答案的常见问题是:哪个更新通道是“早”,哪个是“晚”?

  当我们提到“早调度,晚等待”时,意思是说应该给作业尽可能多的时间来运行。在帧的哪个部分做调度和等待并不重要,只要它们相隔较远即可。

  如果一帧延迟可以接受,甚至可以在下一帧等待作业。每次看到性能分析器中主线程的“Wait”信息时,都应该调查它在等待什么,如果可以的话,就更早地调度该作业或晚些完成作业,从而避免让主线程等待。

  Job System无法解决的问题

  Job System不是为了解决长时间运行的低优先级任务而设计的解决方案,并且它也不是为了让操作等待而不是使用CPU资源而设计的。它可以完成这些任务,但这不是Job System的主要目的,因此这些任务带有一些需要注意的限制。

  合作多任务处理

  JobSystem中的每个工作线程都绑定到一个物理或虚拟CPU内核。一旦其中一个工作线程开始执行作业时,作业将运行完成而不会出现任何中断。

  如果想要共享CPU内核,需要手动声明等待,唯一方法是将一个作业分解成二个具有依赖关系的作业。由于该系统不会进行任何上下文切换,因此正在运行的作业将占用CPU的一整个内核,即使该作业并不重要。

  与ECS和Burst结合使用

  使用C# Job System可以提高整体性能,尤其与实体组件系统ECS和Burst编译器技术等Unity新功能一起使用的时候,尤为明显。

  实体组件系统ECS专注于减少计算所需的线程时间,它通过将数据以适合缓存的方式进行组织来实现。Burst专注于通过优化Job System中运行的代码来减少线程时间。这些系统的目标是提高Unity中的基本性能,同时支持现有工作流程,让过渡过程更简单。

  结语

  现代硬件架构的趋势是配备多个内核,然而许多进程只使用一个内核。通过在多个内核运行多个进程,我们可以同时并行运行进程,而不用一个接一个运行,从而更高效地利用多个内核并大幅提高性能。

  全新的C# Job System会以安全简单的方式利用多个内核。Job System很简单,因为它被设计成可以让你用C#来编写作业化代码;并且保证安全,因为它能避免多线程处理的陷阱,例如:竞态条件。

  我们可以使用多线程系统来开发在多种硬件上运行的游戏,也可以通过利用性能增益,开发拥有更多怪物和更复杂模拟效果的丰富游戏世界。

  更多关于Job System的内容和资源,请访问:

  https://unity3d.com/unity/features/job-system-ECS

  更多Unity新功能介绍,尽在Unity官方中文论坛(UnityChina.cn) !

  使用Unity ECS开发《我的世界》

  详解实体组件系统ECS

  Unite LA|AutoTech Summit精彩回顾

  Unity FPS示例项目介绍

  使用粒子实现Logo消融效果

  Unity亮剑2018世界VR产业大会

  Unite LA精彩回顾:Visual Effect Graph、CineCast和FPS Sample

  官方活动

  双十一提前到 | Unity超值订阅,更有限时活动送惊喜

  现在访问Unity在线商店(store.unity.com)参加双十一狂欢,享受订阅优惠的同时,可获赠Unite China 2019技术门票以及限量Unity礼品![了解详情...]

查看原文 >>
相关文章