跳转到主要内容

GPU渲染

针对移动端TBDR架构GPU特性的渲染优化

TBDR是现代移动端gpu的设计架构,它同传统pc上IR架构的gpu在硬件设计上是差别很大的。手游正是运行在这些移动端的TBDR架构上,所以手游的渲染优化在硬件的角度上讲有其独特之处,甚至一些特点和优化点与PC是大相径庭的,基于硬件的优化是应用程序优化很重要的一部分,最近阅读了一些tbdr的硬件设计的文档,本文试图对TBDR的特点做些介绍并基于这些特点的优化做个简单的总结。

渲染管线的三个概念阶段

渲染流水线可以分为三个概念性阶段:应用阶段,几何阶段,光栅化阶段。游戏场景中的物体渲染都是基于可编程流水线实现的,其实就是把绘制的3D物体通过可编程流水线绘制在2D的屏幕上的过程。渲染简单的理解可能可以是这样:就是将三维物体或三维场景的描述转化为一幅二维图像,生成的二维图像能很好的反应三维物体或三维场景.

GPU渲染流水线的简单概括

GPU流水线主要分为两个阶段:几何阶段和光栅化阶段

<strong>几何阶段</strong>

顶点着色器 ——&gt; 曲面细分着色器(可选)-----&gt;几何着色器(可选)-----&gt;裁剪——&gt;屏幕映射

<font color="Purple">顶点着色器</font>
流水线的第一个阶段,输入来自于CPU,处理的基本单位为单个顶点,输入的每个顶点都会调用一次顶点着色器。

主要工作是:坐标变换(比如改变顶点位置模拟水面、布料等)和逐顶点光照,并输出后续阶段需要的数据(常见的输出路径是经光栅化后交给片元着色器处理)。

<font color="Purple">曲面着色器</font>
一个可选的着色器,用于细分图元。

<font color="Purple">几何着色器</font>
用于执行逐图元操作,或者用于产生更多的图元

GPU渲染流水线

GPU的渲染流水线的主要任务是完成3D模型到图像的渲染(render)工作。常用的图形学API编程模型中的渲染过程被分为几个可以并行处理的阶段,分别由GPU中渲染流水线的不同单元进行处理。GPU输入的模型是数据结构(或语言)定义的对三维物体的描述,包括几何、方向、物体表面材质以及光源所在位置等;而GPU输出的图像则是从观察点对3D场景观测到的二维图像。在GPU渲染流水线的不同阶段,需要处理的对象分别是顶点(vertex)、几何图元(primitive)、片元(fragment)、像素(pixel)。

如图1-6所示,典型的渲染过程可以分为以下几个阶段:

<font color="Purple"><strong>1.顶点生成</strong></font>

图形学API用简单的图元(点、线、三角形)表示物体表面。每个顶点除了(x,y,z)三维坐标属性外还有应用程序自定义属性,例如位置、颜色、标准向量等。

<font color="Purple"><strong>2.顶点处理</strong></font>

GPU屏幕渲染的两种方式——On-Screen Rendering、Off-Screen Rendering

<strong>GPU渲染机制:</strong>

CPU 计算好显示内容提交到 GPU,GPU 渲染完成后将渲染结果放入帧缓冲区,随后视频控制器会按照 VSync 信号逐行读取帧缓冲区的数据,经过可能的数模转换传递给显示器显示。

<strong>GPU屏幕渲染有以下两种方式:</strong>

On-Screen Rendering
意为当前屏幕渲染,指的是GPU的渲染操作是在当前用于显示的屏幕缓冲区中进行。

Off-Screen Rendering
意为离屏渲染,指的是GPU在当前屏幕缓冲区以外新开辟一个缓冲区进行渲染操作。

特殊的离屏渲染:
如果将不在GPU的当前屏幕缓冲区中进行的渲染都称为离屏渲染,那么就还有另一种特殊的“离屏渲染”方式: CPU渲染。如果我们重写了drawRect方法,并且使用任何Core Graphics的技术进行了绘制操作,就涉及到了CPU渲染。整个渲染过程由CPU在App内 同步地完成,渲染得到的bitmap最后再交由GPU用于显示。

备注:CoreGraphic通常是线程安全的,所以可以进行异步绘制,显示的时候再放回主线程