Unity C# Job System介绍(一) Job System总览和多线程

旧巷老猫 提交于 2020-02-19 07:10:14

C# Job System 总览

Unity的C# Job System使用户可以编写与Unity其他部件交互的多线程代码,同时让编写正确的代码变得更容易。

编写多线程代码可以提供更好的性能表现。这包括非常明显的帧数提升。C# job协同Burst编译器可以提升代码生成的质量,这也会使得移动设备电量消耗大幅度降低。

C# Job System的一个非常关键的方面是它可以融入Unity内部的原生Job System。这使得用户的代码可以和Unity共享worker threads。这种合作避免了创建更多线程,因为这可能会造成对于CPU资源的争抢。

关于更多的信息,可以观看演讲Unity at GDC - Job System & Entity Component System

什么是多线程?

    What is multithreading?​docs.unity3d.com

在一个单线程的计算系统中,当输入指令的时候,结果会在同时计算产生。加载和运行程序的时间取决于你需要CPU处理的工作的数量。What is multithreading?在一个单线程的计算系统中,当输入指令的时候,结果会在同时计算产生。加载和运行程序的时间取决于你需要CPU处理的工作的数量。

多线程是一种编程技术,充分利用CPU的多个核心可以在同一时间处理多个不同线程的能力。任务或者指令会在同一时间执行,而不是一个接一个执行。

有一个线程会在程序开始的时候默认运行,被称为“主线程”。主线程创建新的线程来处理任务。这些新的线程会并发地执行,并在任务完成时向主线程同步自己的结果。

这种多线程的方法在你有几个需要较长时间运行的任务时表现良好。但是,游戏代码中通常包含很多需要同时执行的短指令。如果你为每一个指令都创建一个进程,你会因为拥有太多短生命周期的线程而失败。这会加剧CPU和操作系统处理能力的紧张。

线程生命周期的问题可能可以通过线程池的方式来解决。但是,即使你使用了线程池,你依然可能在同一时间拥有大量的活跃线程。CPU上运行更多的线程会导致彼此争抢CPU上的资源,这将会导致频繁的上下文切换(Context switching)。上下文切换是将正在执行的线程状态保存下来,然后执行另一个线程,随后再恢复到第一个线程并继续执行的过程。上下文切换会大量占用资源,所以需要尽可能避免需要用到它。

什么是Job System?

一个job system通过创建jobs而不是线程来管理多线程的代码。

一个job system管理运行在多个核心上的一组工人线程(worker threads)。通常一个逻辑CPU核心上会有一个工人线程,从而避免上下文切换(虽然可能会为操作系统或其他专有程序保留一些核心)。

一个job system会把jobs放到一个job队列中去执行。job system中的工人线程从job队列中取出内容并执行他们。一个job system会管理依赖性并确保jobs以正确的顺序被执行。

什么是一个Job?

一个job是小单位的工作,通常包含一个特定的任务。一个job接受参数并根据数据进行操作,接近于一个方法的工作方式。job可以是独立的,或者他们可以依赖于其他jobs完成后再执行。

什么是Job的关联性?

在复杂的系统中,像是游戏开发需要的系统,不太可能每一个job都是独立的。一个job通常会准备下一个job所需要的数据。jobs了解并支持这种依赖来确保可以正常工作。如果jobA依赖于jobB,那么job system会确保jobB执行完毕后才开始执行jobA。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!