微信号:Unity-GreaterChina

介绍:Unity官方开发者平台,分享最前沿的技术文章和开发经验,精彩的Unity活动和社区相关信息.

Job System介绍

2018-11-03 13:15 Unity

你是否想知道如何编写安全的多线程代码?本文将介绍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超值订阅,更有限时活动送惊喜 

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




点击“阅读原文”访问Unity官方中文论坛

 
Unity官方平台 更多文章 Unite LA|AutoTech Summit精彩回顾 双十一提前到 | Unity超值订阅,更有限时活动送惊喜 使用Unity的反射探针制作伪内饰效果 使用粒子实现Logo消融效果 Unity FPS示例项目介绍
猜您喜欢 java初学者,如何学习java? Linux运维工程师需要掌握什么才能胜任工作呢 【数说11.11】当女汉子和软妹子、小鲜肉和萌大叔遇上京东11.11 《开发者头条》2 月 19 日最受欢迎文章 Top 3 10月课程结束