Unity Shader学习 第十六章 Unity中的渲染优化技术
本章内容:
Unity中常见的优化技术:
- 批处理
- LOD(Level Of Detail)
移动平台的特点
影响性能的因素
计算资源: CPU 和 GPU .
让一个游戏在预计的 帧率 和 分辨率 下工作
CPU 负责保证帧率!
GPU主要负责 分辨率 相关的一些处理!
可以将造成游戏性能瓶颈的主要原因分为以下几个方面:
CPU
- 过多的DrawCall -> OverDraw
- 复杂的脚本或者物理模拟
CPU优化:
- 使用批处理来减少 Draw Call的数目
动态批处理:
若场景内有一些模型共享了同一个材质 并满足一些条件. 可以将他们进行动态批处理.
只用一次 draw call 绘制所有模型.
基本原理: 每一帧将可以进行批处理的模型网格进行合并. 再将合并后的数据传给GPU. 然后使用同一个材质进行渲染.
动态批处理. 每一帧都需要重新合成网格. 所以经过动态批处理的物体仍可以移动.
静态批处理:
静态批处理适合于任何大小的几何体.
它的原理就是 还在运行开始的时候, 将需要进行静态批处理的模型合并到一个新的网格结构中. 这意味着这些模型不可以在运行时候被移动.只需要一次移动的操作.
它往往需要更多的内存来存储合并后的几何结构.
注意:
不论是静态批处理 还是 动态批处理. 都要求 模型之间要共享同一个材质.
GPU
- 顶点处理:
- 过多的顶点
- 过多的逐顶点计算
- 片元处理
- 过多的片元 (即可能是分辨率造成的. 也可能是OverDraw造成的)
- 过多的逐片元计算
GPU优化:
减少需要处理的顶点数目
- 优化几何体
- 使用模型的 LOD技术 (Level Of Detail)
- 使用遮挡剔除技术
优化几何体:
- 尽量减少模型的三角形面片数
- 对于GPU来说.本质上是只关心顶点的数目.尽可能减少顶点数目才是核心
模型的LOD技术
- 当一个物体原理摄像机的时候. 模型上的很多细节无法被察觉. 因此. 减少模型的面片数量. 而提升渲染器的性能
遮挡剔除技术:
- 是一种顶点优化策略.
- 需要将 遮挡剔除 和 摄像机视椎体剔除(Frustum Culling) 区分开来.
- 视椎体只会剔除那些不在视域内的对象. 但不能判断一个物体是否被一个物体遮挡.
- 遮挡剔除 会用一个虚拟的摄像机来遍历场景. 从而构建一个潜在可见的对象几何的层级结构.
减少需要处理的片元数目
- 控制绘制的顺序
- 警惕透明物体
- 减少实时光照
绘制顺序.
- 由于深度测试的存在. 若从前往后进行渲染. 则可以很大程度地减少OverDraw.
警惕透明物体:
- 对于半透明物体来说. 不开深度测试. 而是开着深度读取. 从后向前进行渲染. 那么可以说一定上造成 OverDraw.
减少实时光照
- 实时光照对于移动平台是一种非常昂贵的操作.
- 所以. 游戏中常常使用 烘焙 的技术! 把光照 烘焙 到一张光照纹理上 lightmap 然后运行时根据纹理采样即可.
- 实时阴影也非常消耗性能. 优化: 例如将静态物体的阴影信息存储到 光照纹理中. 只对场景中动态物体使用适当的实时阴影计算.
带宽
- 使用了尺寸很大的未压缩的纹理
- 分辨率过高的帧缓冲
带宽优化:
- 减少纹理大小
- 利用分辨率缩放
纹理最好长与宽相同.且是2的整数幂.
尽可能使用 纹理压缩 和 多级渐远纹理技术(mipmaping)
减少计算复杂度
- 使用Shader的 LOD 技术
- 代码方面的优化
shader的LOD技术:
- 它的原理. 只有shader的LOD值小于某个设定的值.才会被使用. 安歇超过LOD值的不会被渲染.
代码方面的优化:
- 尽可能使用低精度的浮点运算.
- 尽可能不要使用全局的屏幕后处理效果.
- 尽可能不要使用分支 和 复杂数学运算. 可以使用查表来 代替!!!