shader入门精要读书笔记44 Untiy中的 渲染优化技术(一)

一、渲染优化技术

几个方面

  1. CPU方面:使用批处理技术减少draw call数目
  2. GPU方面:
    (1)减少需要处理的顶点数目:
    —优化结合体
    —使用模型的LOD技术
    —使用遮挡剔除技术
    (2)减少需要处理的片元数目
    —控制绘制顺序
    —警惕透明物体
    —减少实时光照
    (3)减少计算复杂度
    —使用Shader的LOD技术
    —代码方面的优化
  3. 节省内存带宽
    (1)减少纹理大小
    (2)利用分辨率缩放

二、分析工具

P312

三、批处理技术(batching)

实现原理就是为了减少每一帧需要的draw call数目。
优化思想就是每次调用draw call时尽可能地处理多个物体。

利用批处理,CPU会把RAM多个网格合并成一个更大的网格,再发送给GPU,然后在一个Draw Call中渲染他们,
但要注意的是,使用批处理合并的网格将会使用同一种渲染状态,如果网格是不同的渲染状态,那么他们就无法使用批处理技术。

使用同一种材质的物体才可以一起进行批处理,因为这时他们之间仅仅在于顶点数据的差别。我们可以把这些顶点数据合并在一起,再一起发送给GPU,就可以完成一次批处理。

所以我们为了减少Draw Call数目,我们要:

  1. 避免使用很小的网格,当不可避免使用很小的网格时,那我们就要考虑是否可以合并他们。
  2. 避免使用过多的材质,尽量在不同的网格中使用同一种材质。

Unity的两种批处理方式:

  1. 动态批处理P315,优点是 一切都是Unity自己完成的,不需要我们进行任何操作,而且物体是可以移动的,缺点是限制较多(模型的顶点个数属性规模限制、缩放尺度、光照纹理、多个Pass的Shader,等等),一不小心就会破坏这种机制,导致Untiy无法动态批处理一些使用了相同材质的物体。

  2. 静态批处理P316,优点在于自由度很高,限制较少,缺点就是可能会占用更多的内存(导致VBO顶点缓冲对象数目变大),而且经过静态批处理后的物体就不能移动了,即使在脚本中更改位置信息也是无效的。静态批处理适用于适用于任何规模的几何模型,实现原理就是在运行开始阶段,把需要的静态批处理模型合并到一个新的网格结构中,这意味着这些模型不可以在运行时候被移动。实现方法就是把物体面板上的Static复选框勾选上(只勾选Batching Static也可),

静态批处理内部实现上就是把这些静态物体变换到世界空间下,然后为他们构建一个更大的顶点和索引缓存。对于使用同一个材质的物体,Unity只需要调用一个draw call就可以绘制全部物体,而对于没有使用同一个材质的物体,静态批处理同样也可以提升渲染性能。

增加点光源对静态批处理和动态批处理都会有部分影响,动态批处理的话会导致破坏其限制机制,导致动态批处理失效。而对静态批处理来说其仍然会静态批处理其允许的部分。

例:如果我们使用了1000个相同的树组成森林使用静态批处理,那么内存会增加1000倍,所以我们就要考虑是否需要节省内存,如果更内存重要,那我们就使用动态批处理技术(要注意顶点数限制),或者自己编写批处理的方法。

合并材质、共享材质:共享一个材质对于静态动态来说都是非常重要的,但是不同的模型之间总会需要不同的渲染属性,例如纹理、颜色等等。所以使用一些策略进行合并材质。

  1. 如果两个材质只有纹理不同,那么我们可以把它们的纹理合并到一张更大的纹理中,这张更大的纹理我们称作图集(atlas),使用时我们就使用不同的采样坐标对纹理采样即可。
  2. 有时除了纹理,材质上还有区别,颜色、浮点属性等等,材质改变会导致所有使用这个材质的地方都变,所以我们不能改变shader参数。但我们可以使用网格的顶点数据来对其进行存储参数,之前说的VBO(静态批处理后形成很大的顶点缓冲)我们可以对其数据进行相应改变,使之传入顶点着色器,从而产生相应变化。

一些批处理注意、建议事项:
尽可能选择静态批处理,同时关心内存相关情况。
如果无法进行静态批处理,那就使用动态批处理,但要小心限制条件(顶点数目),
对于游戏中使用的金币等,可以使用动态批处理。
对于动画部分物体,我们无法全部使用静态批处理,但其中有不动的部分,可以标识static。
如果相关物体存在在模型空间下的坐标运算,往往会得到错误结果,这是我们可以使用DisableBatching标签强制物体不进行批处理,
使用半透明材质的物体经常会使用严格的从后往前的绘制顺序,这是如果绘制顺序无法满足,那么批处理也会无法应用。

四、减少顶点数

1.优化几何体尽可能减少三角面片数目,建议:移除不需要的硬边和纹理衔接,避免边界平滑和纹理分离。

2.模型的LOD技术,就是允许摄像机原理物体时,细节因为无法注意到,所以这时可以允许减少物体模型上的面片数量,从而提高性能。使用LOD group组件来构建一个LOD,准备多个精细程度的模型,保证摄像机不同距离时,更换不同精细的模型。

3.遮挡剔除技术:剔除看不到的物体,节省我们看不到的东西却计算的开销。使用这个可以减少定点数米和overdraw。
(和视锥体剔除不同,视锥体剔除是剔除摄像机之外的,这个是剔除物体挡住的,不一样)

使用LOD技术和遮挡剔除技术可以同时减少cpu、gpu负荷,提升性能。

你可能感兴趣的:(Shader入门,读书笔记)