Unity 中的渲染优化技术

学习笔记,自用

移动平台配置

【常见手机GPU】
PowerVR 芯片:
  通常用于 iOS 设备和某些 Android 设备
  使用了基于瓦片的延迟渲染 (Tiled-based Deferred Rendering, TBDR) 架构,把所有的渲染图像装入一个个瓦片 (tile) 中,再由硬件找到可见的片元,只有可见片元才会执行片元着色器。
Adreno、Mali :
  分别是高通的芯片和 ARM 的芯片
  基于瓦片+ early-z 或相似的技术进行一个低精度的的深度检测, 来剔除那些不需要渲染的片元
Tegra:
  英伟达的芯片
  使用了传统的架构设计,因此在这些设备上 overdraw 更可能造成性能的瓶颈。

目前市场顶配:
  三星的Galaxy S系列手机1GHz蜂鸟CPU(S5PC110)配合PowerVR SGX540图形处理芯片、摩托罗拉的Droid X

unity渲染分析工具

用来定位性能瓶颈
1、渲染统计窗口 Rendering Statistics Window
在这里插入图片描述
在这里插入图片描述

2、性能分析器 Profiler
Window -> analysis->Profiler
显示了绝大部分在Statistics中提供的信息,还有draw call 数目、动态批处理/静态批处理的数目、渲染纹理的数目和内存占用等

3、帧调试器 (Frame Debugger)
在这里插入图片描述
可以看到每一个 draw call 工作和结果
例如本图中可以看到 2 DepthTexture + 2 shadows + 其他模型的draw call

优化技术

CPU主要负责保证帧率, GPU主要负责分辨率相关的一些处理

CPU优化

对于 CPU 来说,限制它的主要是每一帧中 draw call 的数目,因为每次调用 draw call 时, CPU 往往都需要改变很多渲染状态的设置,而这些操作是非常耗时的

使用批处理技术减少 draw call 数目

【批处理含义】
  每次调用 draw call 时尽可能多地处理多个物体

【什么样的物体可以一起处理】
  使用同一个材质的物体,它们之间的不同仅仅在于顶点数据的差别

【Unity中支持的批处理方式】
1、动态批处理:
优缺点:Unity 自动完成的,物体是可以移动的,但是限制很多,
限制:如网格的顶点属性规模要小于900;多Pass 的shader会中断批处理

2、静态批处理:(尽可能选择)
优缺点:自由度高,限制很少,但可能会占用更多的内存,且物体不可以再移动了
本质上是牺牲内存换取性能,VBO更大了:把静态物体变换到世界空间下,然后为它们构建一个更大的顶点和索引缓存。对于使用了同材质的物体统一绘制,对于使用了不同材质的物体,静态批处理可以减少这些 draw call 之间的状态切换;处理平行光的BasePass部分会被静态批处理,但是处理其他光源的额外Pass不会
unity实现:
在这里插入图片描述
【共享材质】
1、如果两个材质之间只有使用的纹理不同
  把这些纹理合并到一张更大的纹理–图集(atlas),使用同一个材质,再使用不同的采样坐标对纹理采样即可
2、不同的物体在材质上还有一些微小的参数变化
  一个例子是, 森林场景中所有的树使用了同一种材质, 我们希望它们可以通过批处理来减少 draw call, 但不同树的颜色可能不同。 这时,我们可以利用网格的顶点的颜色数据来调整。

GPU优化

减少需要处理的顶点数目

优化几何体

  建模时,尽可能减少模型中三角面片的数目,移除不必要的硬边以及纹理衔接 避免边界平滑和纹理分离。

使用模型的 LOD ( Level of Detail) 技术

  LOD允许当对象逐渐远离摄像机时,减少模型上的面片数量,从而提高性能
  Unity中使用LOD Group组件,对同一个物体用不同细节程度的模型赋给组件中的不同等级, Unity 就会自动判断当前位置上需要使用哪个等级的模型。

使用遮挡剔除 (Occlusion Culling) 技术

  对比视锥体剔除:应用在程序阶段CPU端,剔除掉那些不在摄像机的视野范围内的对象,遮挡剔除可以直接去掉多余的顶点数目

减少需要处理的片元数目

控制绘制顺序

  让物体从前往后绘制,可以很大程度上减少overdraw。
  可以尽可能地把物体的队列设置为不透明物体的渲染队列,而尽量避免使用半透明队列(为了得到正确的渲染结果,必须从后往前渲染)

警惕透明物体

  如果场景中包含了大面积的半透明对象,或者有很多层相互覆盖的半透明对象(即便 它们每个的面积可能都不大),或者是透明的粒子效果,在移动设备上也会造成大报的 overdraw。 这是应该尽量避免的。
  透明度测试也会影响游戏性能

减少实时光照和阴影

  对逐像素的光源来说,被光源照的物体需要被再渲染一次,而且这种额外的处理逐像素光源的 Pass 都无法进行批处理,会中断批处理
  模拟光源的方法:烘焙技术(把光照提前烘焙到一张光照纹理 lightmap); God Ray
  使用烘焙把静态物体的阴影信息存储到光照纹理中,而只对场景中的动态物体使用适当的实时阴影

减少计算复杂度

使用 Shader LOD (Level of Detail) 技术

  与模型的 LOO 技术类似,控制使用的 Shader 等级;Shader的 LOO 小于某个设定的值,这Shader才会被使用

代码方面的优化

  对象数<顶点数<像素数, 尽可能地把计算放在每个对象或逐顶点上(如实现高斯模糊和边缘检测时,把采样坐标的计算放在了顶点着色器中)
  使用低精度的浮点值进行运算 (float/highp:顶点坐标等变量, half/mediump:一些标量、纹理坐标等变量,计算速度大约是 float 的两倍;fixed/lowp 适用于绝大多数颜色变量和归一化后的方向矢量,计算速度大约是 float的4倍)
  用插值寄存器把数据从VS传递给FS时,使用尽可能少的插值变量(对两个纹理坐标进行插值, float4 类型的变量,对应了xy和zw分量)
  尽可能不要使用全屏的屏幕后处理效果
  其他通用方法在这里插入图片描述

节省内存带宽

减少纹理大小

  尽可能使用多级渐远纹理技术 (mipmapping) 和纹理压缩,把纹理类型设置为 Advanced, 勾选 Generate MipMaps; GUI纹理除外,需要保证质量
  回顾:使用纹理图集可以帮助我们减少 draw call 的数目

利用分辨率缩放

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值