Unity优化丨渲染篇:CPU/GPU

提示:选中右侧目录,可快速找到所需内容

本系列博客链接:传送门

提示:GPU(图像处理器)显卡的功能,负责渲染画面。

一、确定渲染优化对象

首先,我们应确定优化CPU渲染还是GPU渲染。为什么还要关心CPU呢?我们看下下面CPU和GPU在每一帧渲染中分别起的作用是什么。

  1. CPU检查场景中每个对象,决定他们是否应该被渲染。
  2. CPU收集即将被渲染的对象信息,并把这些信息分类为渲染指令(也称为draw calls命令)。一个draw call包含网格数据以及网格如何被渲染。在某些场景,共享设置的一些对象可能会被合并为一个draw call。合并不同对象的数据到同一个draw call被称作batching。
  3. CPU给每个draw call渲染指令创建一个数据包,称为batch数据包。每一个batch必须包含一个draw call。
  4. CPU会发出指令,使GPU改变一些渲染状态。这个指令被称为SetPass call。SetPass call通知GPU,如何去渲染下一个网格。
  5. CPU把draw call渲染指令发送给GPU。draw call渲染指令通知GPU使用最近的SetPass call去渲染指定的网格。
  6. 有时,数据包batch可能包含不止一个的pass(pass是shader代码的一部分,新的pass需要改变渲染状态)。对于数据包batch中的每个pass,CPU必须发送一个新的SetPass call,然后必须要再次发送draw call渲染指令
  7. GPU按照CPU发送的指令顺序处理这些指令。
  8. 如果当前任务是SetPass call,那么GPU更新渲染状态。
  9. 如果当前任务是draw call渲染指令,那么GPU渲染网格。渲染网格发生在很多阶段,不同阶段的shader代码可以定义渲染。其中:顶点着色器vertex shader告诉GPU怎么处理网格的顶点。片元着色器fragment shader告诉GPU怎么绘制单独的像素。
  10. 以上过程会重复执行,直到这一帧中所有CPU发送的任务都被GPU完成。

为了渲染一帧,CPU和GPU必须都完成他们的任务。他们中的任何一个花费了过长的时间去完成任务,都会造成渲染延迟。

二、CPU渲染优化

发送命令到GPU花费时间过长是引起CPU限制的最常见的原因,其最耗时的操作是SetPass call。降低SetPass数量是最好的改善性能的方式。

降低SetPass call和batches数量,我们通常可以从以下几个方面来进行:

  1. 降低要渲染的对象数量。【减少SetPass call、batches】
  2. 降低每个要渲染的对象的渲染次数。【减少SetPass call】
  3. 合并要渲染的对象的数据。【降低batches】

1、降低要渲染的对象数量

1).手动减少场景中物体的数量

2).遮挡剔除

原理:在摄像机视野内的物体显示,在视野外的物体不显示。

Occlusion bake的三个属性:

  • Smallest Occluder:设置最小遮挡物的尺寸,当遮挡物的长度或者宽大于设定值时,该物体才能够遮挡住后面的物体。
  • Smallest Hole:设置最小孔的尺寸,当穿过物体内部的孔或者多个物体堆叠形成的孔的大小小于设定的值时,遮挡剔除烘焙将忽略该孔的存在。
  • Backface Threshold:设置背面移除阈值,用于优化场景,当该值为100时,摄像机拍摄不到的背面信息也会完整保留;当该值较小时,系统将对背面信息进行优化甚至去掉背景信息。

实现方法:

Windows-Rendering-OculusionCulling,在右侧标签栏:

Object:选择Mesh,选择所有物体,勾选OcculerStatic(静态遮挡物)、OccludeeStatic(静态被遮挡物)

也可自己挨个勾选物体,选择他是不是遮挡别人的物体,还是被别人遮挡的物体,亦或者都勾选都是。这样挨个做的好处是减少烘焙生成物体积、减少烘焙时间。

Bake:设置合适Occulder大小(小一点,能包住场景中大多数小物体即可单个物体即可)

Visuslization:选择所有相机都进行遮挡剔除计算,还是只有指定的Camera进行遮挡剔除计算。

Bake~

   

3).摄像机Clipping Planes

我们可以通过摄像机的Clipping Planes 的Far裁剪远端,从而降低摄像机的绘制范围。我们可以用雾来掩盖不被渲染的远端。

2、减少渲染对象的渲染次数

在游戏中,实时的光照、阴影、反射可以极大的提升观感,但这些操作需要耗费极高的性能。

1.Lightmap(光照贴图)/烘焙

Unity灯光默认是实时光照,也就是说物体在灯光下不同位置会产生不同灯光效果,由于动态光源在实时光照下会有大量的Setpass Calls(CPU发给GPU改变渲染状态的指令),为了减小Setpass Calls,我们可以烘焙灯光效果,Unity会为我们生成光照贴图,这样大大减少了Setpass Calls。

 烘焙方法:

此功能篇幅较大,教程传送门

参数含义与用途:

参考链接1

参考链接2

参考链接3

三、GPU渲染优化

导致GPU渲染的问题有两个基本原因:

  1. 低效的渲染管线。当渲染管线中一步或者多步花费了太长时间,打断了平滑的数据流时,渲染管线会很低效。
  2. 渲染管线被塞入了太多的数据。即使是最高效的渲染管线,对于一帧中可以处理的数据量也是有限的。

所以渲染优化的主要目标就是减少渲染的工作量减少每帧渲染的顶点数

  • 设备的CPU和GPU决定每帧可渲染的顶点数
  • 通常PC游戏每帧渲染的顶点个数应<2M移动游戏每帧渲染的顶点数量应<0.1M

Stats(渲染数据统计窗口)属性讲解:传送门

下文将讲解可以用哪些方法优化GPU的处理速度。

一、LOD层级

当模型离视野近时,显示比较精细的模型,离视野比较远时显示比较粗糙的模型。

实现方法:
新建一个空物体,添加LOD Group组件,将模型拖进精细度按下图提示拖进对应位置,可根据实际情况调节每个LOD的占比。

二、资源设置

1、图片纹理导入设置:

开启必要的3D物体上的Generate Mipmaps(开启会减少显存GPU带宽,减少渲染),关闭2DUI上的Generate Mipmaps

20200227:注意,截图代码中生成新Texture2D,mipmap要设限成false,避免使用mipmap,导致看到的截图不清晰。

对3D物体,关闭Mipmap会导致远处的纹理有闪烁感,而且渲染性能较低,因此开启3D物体上纹理的Mipmap。开启Mipmap的缺点是会导致纹理的内存占用更大。对2D物体,Mipmap并不会导致闪烁和性能问题,所以建议关闭2D以及UI纹理上的Mipmap选项。

使用Mipmap后,贴图会根据摄像机距离的远近,选择使用不同精度的贴图。

  • 缺点:会占用内存,因为mipmap会根据摄像机远近不同而生成对应的八个贴图,所以必然占内存!

  • 优点:会减少显存GPU带宽,减少渲染,因为可以根据实际情况,会选择适合的贴图来渲染,距离摄像机越远,显示的贴图像素越低,反之,像素越高!

三、Camera不用HDR、抗锯齿MSAA

四、光照与阴影设置

这样做会减少CPU/GPU的消耗

1、尽量少光照

2、光照烘焙

a、打开Windows-Rendering-LightingSettings:MixedLighting(否则灯光的烘焙选项是灰的,不可选择 )

b、要被烘焙的物体标记为Static-LightmapStatic

c、要烘焙的灯光Mode:Baked

d、LightingSettings面板:

  • 取消AutoGenerate
  • Generate Lighting

e、取消激活要烘焙灯光的Light组件

3、不使用实时光照、软阴影,用假阴影替代

参考链接

4、关闭物体不必要的接收阴影

七、Mesh设置

1、合并Mesh

合并Mesh,降低Batches(既是DrawCalls)【Batches是什么,为什么要降低它

使用插件MeshBaker:教程传送门

发布了329 篇原创文章 · 获赞 85 · 访问量 19万+

猜你喜欢

转载自blog.csdn.net/weixin_38239050/article/details/104328307