优化相关知识05 其他方面的优化

抄书笔记: UntiyShader 入门精要 冯乐乐
另一个造成GPU瓶颈的的需要处理过多的片元。这一部分优化的重点在于减少overDraw,overDraw就是同一个像素被绘制的多次。
1、控制绘制顺序
为了最大限度的避免overdraw,一个重要的优化策略就是控制绘制顺序。由于深度测试的存在,如果可以保证物体都是从前往后的绘制的。那么就可以很大程度上减少overdraw。这是因为,在后面的绘制的物体无法通过深度测试,因此就不会在进行后面的渲染处理了。
在Unity,如果那些渲染队列小于2500(Background、Geometry和AlphaTest的对象都被认为是不透明(opaque)的物体,这些物体总体上是从前往后绘制的。使用其他的队列(如“Transparen”“Overlay”)的物体,则是从后往前绘制的。这意味着,我们可以尽可能的吧物体的队列设置为不透明物体的渲染队列,而尽量避免使用半透明效果。
同时,还可以充分利用渲染队列来控制绘制顺序。例如,在第一人称射击游戏来说,对于游戏中的主要人物来说,他们使用的shader往往比较复杂,但是,由于他们通常会挡住屏幕很大一部分区域,因此可以先绘制他们(使用更小的渲染队列)。对于一些敌方的角色,他们通常会出现在各种掩体后面,因此可以在所有常规的不透明物体后面渲染他们(使用更大的渲染队列)。而对于天空盒子来说,他几乎覆盖了所有的像素,而且他永远是在所有物体的后面,因此他的渲染队列可以设置为“Geometry+1”。这样就可以保证不会因为他而造成overdraw。
这些排序思想往往可以节省很多渲染时间。
2、时刻警惕透明物体
对于半透明物体来说,由于他们没有开启深度写入。因此如果想要得到正确的渲染效果,就必须从头往前渲染。这意味着,半透明物体几乎一定造成overdraw。如果不注意这一点,在一些机器上可能造成严重的性能下降。
如果场景中包含了大面积的半透明对象,或者很多层相互覆盖的半透明对象(即便他们每个面积的可能都不大),或者是透明的粒子效果,在移动设备上也会造成打量的overdraw。
可以尽量减少他们的面积,如果实在没有办法,可以把渲染UI的和渲染场景的交给不同的摄像机。负责三维场景的摄像机尽量不要和另一个摄像机重叠。当然这样会对游戏美感产生一定的影响。因此在可以在代码中对机器的性能进行判断,例如首先关闭一些耗费性能的功能,如果发现这个机器表现良好,就可以开启一些特效功能。
在移动平台上,透明度测试也会影响游戏性能。虽然透明度测试没有关闭深度写入,但由于他的实现使用了discard或者clip操作,而这些操作会导致一些硬件的优化策略时效。例如之前的讲过的powerVr使用的基于瓦片的延迟渲染技术,为了减少overdraw,他会调用片元着色器之前就会判断哪些瓦片是真正被渲染的。但是,由于透明度测试在片元着色器中使用了discard函数,改变了片元是否被渲染的结果,因此GPU就无法使用瓦片的渲染技术了,也就无法达到优化策略了。也就是说,只有在执行了所有的片元着色器以后,GPU才知道哪些片元真正的被渲染到了屏幕上,这样原先减少的overdraw都失效了。这时候,透明度混合比透明度测试性能往往更好。
3、减少实时光照和阴影
实时光照对引动凭条来说是一种非常昂贵的操作。如果场景中包含过多的点光源,并且使用了多个Pass的shader。那么很有可能会造成性能下降。例如,一个场景如果包含了3个逐像素的点光源,而且使用了逐像素的shader,那很可能将drawcall数目(CPU的瓶颈)提高了3倍。同时也会增加overdraw(GPU的瓶颈)。对于逐像素的光源来说,被这些光源照亮的物体需要再被渲染一次。更糟糕的是,无论是静态批处理还是动态批处理,对于这种额外的吹逐像素光源的Pass都无法进行批处理,也就是说他们会中断批处理。
当然,游戏场景还是需要光照才能得到出色的画面效果。很多成功的移动平台游戏,他们的画面效果看起来好像包含了很多光源,但这其实是一种骗局。这些游戏往往使用了烘焙技术,他光照提前烘焙到一张纹理上,然后在运行时刻只需要根据纹理进行纹理采样得到光照效果即可。
另一个模拟光源的方法是使用GodRay。场景中很多小型的光源效果都是靠这种方法模拟的。他们一般不是真的光源,很多情况是通过透明纹理模拟得到的。
很多复杂的光照都是一种优化后的结果。
通常开发者们把复杂的光照计算存储到一张查找纹理(lookup texture LUT)。然后在运行时刻,只需要使用光源方向、视角方向和法线方向等桉树,对LUT进行采样得到光照结果即可。使用这样的查找纹理,不仅可以使用更出色的光照模型,例如更加复杂的BRDF模型,还可以利用查找纹理的大小来进一步优化性能。例如主要角色可以使用更大分辨率的LUT。一些NPC就是用较小的LUT。(可以开发一个LUT工具处理查找纹理。
实时光影是一个非常消耗性能的效果,不仅是CPU需要提交更多的DrawCall,GPU也需要进行更多的处理。因此应该尽量减少实时阴影。例如使用烘焙吧静态物体的阴影信息存储到光照纹理中,而只对场景中的动态物体使用适当的实时阴影。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值