产品分类
联系我们

销售直拨
     025-85550202;
     025-85550520;
     025-84311092

master@csch.com.cn

技术咨询:
     025-85550520

duan@csch.com.cn

售后服务专线:

     13814544738    

wu_yuyang@csch.com.cn

传 真:025-85550303


深圳市中霍电子技术有限公司
地址:深圳市龙华新区龙华街道牛地埔村美满圆小区
联系人:颜安军/副总
Mobile:18038070895
E-mail: szyanaj@csch.com.cn  
 
首页  >  新闻中心  >  其它

在渲染工作的一帧中,CPU与GPU都做了些什么?

 针对渲染导致的性能问题,这个世界上是没有一套万能的解决方案的。渲染的性能问题涉及到许多因素,不仅仅是游戏本身,它也很大程度上取决于运行游戏的硬件和操作系统。重要的是我们要通过不断的研究和实验来解决这些性能问题。
知道了渲染工作的流程以及阶段可以帮我们更好的研究和解决渲染方面的性能问题。这篇文章主要是介绍在渲染工作的一帧中,我们的CPU与GPU都做了些什么?
我们这里提到的 Object 指我们游戏中会被渲染的对象,任何挂有渲染组件 (Renderer Component) 的 GameObject 都将被引擎作为 Object 进行渲染。
基本上,渲染工作可以分解为以下步骤:
① 中央处理器(CPU)进行准备工作,比如哪些对象要被绘制,需要如何被绘制。
② CPU向图形处理器(GPU)发送指示。
③ GPU根据CPU的指示进行图形的绘制。
接下来我们会针对这些步骤进行更详细的研究,这里主要是说明一下在渲染工作中CPU与GPU所扮演的角色。
渲染工作我们也常称之为渲染管线。

在每一帧的渲染流程中, CPU 主要做了这些事:
① 确认场景中哪些对象需要被渲染,一个object只要在符合特定的规则才会被渲染。例如,当处于相机的视锥体内的对象可以被渲染,而超出(不在视锥体内)的部分则被剔除(Culled),不进行渲染。
② CPU会收集这些将要被渲染的每一个对象的数据,并且整合成指令,即我们常说的Draw Calls。一个Draw Call包含一个单独的网格(mesh)数据和它将如何进行渲染的信息。比如,需要对材质使用哪些贴图等。在某些情况下,使用相同的设置的object数据会被合并进一个Draw Call。将不同的object数据合并到一个Draw Call的行为我们称之为 合批(Batching)。
③ CPU会为每一个Draw Call创建一个数据包叫做 batch,然而,batch中包含的数据不仅仅是draw call,还有一些数据由于与我们探讨的渲染性能问题无关,因此就不在这里展开。
一旦完成了batch工作,CPU接着会进行如下工作:
④ 发送一条指令给到GPU变更渲染状态(Render State)。这个指令我们称为 SetPass Call。SetPass Call的作用是告诉GPU在渲染下一个材质的时候该使用哪一种设置。SetPass Call仅当从前一个材质到下一个材质确实需要变更渲染状态的情况下CPU才会发出。
⑤ CPU发送一条Draw Call指令给到GPU。Draw Call指示GPU按照SetPass Call定义的设置来对具体的材质进行渲染。
⑥ 某种情况下,你的batch可能包含不止一个渲染通道(pass),这取决于你的 shader 代码中pass的代码块,一个pass代码块就需要GPU变更一次渲染状态。所以,一个batch中每多包含一个pass,CPU就要新发送一次SetPass Call到GPU,然后再把Draw Call发送一次到GPU。
与此同时, GPU 会进行如下工作:
① GPU按照CPU的要求完成渲染任务。
② 如果当前任务是一个SetPass Call,那么GPU会变更当前的渲染状态(Render State)。
③ 如果当前任务是一个Draw Call, GPU就渲染指定的材质。这部分工作是分阶段进行,由shader 代码中不同的部分决定。这部分比较复杂,在这里不进行详述,感兴趣的朋友可以去看一下《Unity Shader 入门精要》这本书,对于入门shader的同学比较有用,推荐一下。我们这里只需要知道shader中有一部分代码叫做顶点着色器(vertex shader),告诉GPU如何处理材质的顶点数据,还有一部分代码叫做片元着色器(fragment shader),告诉GPU如何进行逐像素工作(individual pixels)。
④ 以上GPU这部分工作会一遍遍重复执行直到完成CPU这一次渲染工作的全部指令。
那么现在大家懂了CPU 与 GPU 如何分工了吗?