【Unity】后处理效果的优化尝试

主要是在最近工作中的一些心得体会。

 

后处理效果的性能问题主要在:

1.屏幕每个像素都要进行计算。

2.可能会创建多张RenderTexture的空间占用。

3.多次Blit操作,比如高斯模糊多次迭代。

4.偶尔还需要新建摄像机渲染到RenderTexture。

 

优化提升性能的思路也比较简单,不过要结合具体后处理的效果来分情况优化。最重要的是找到新的廉价的实现方式,不过往往由于眼界局限,在短期内达到优化的结果很难,所以使用一些比较容易操作的Tips也是一种选择。

1.全屏计算——>Quad局部计算(针对不对屏幕所有像素进行修改的后处理效果)

后处理需要在屏幕空间逐像素进行计算,所以如果可以将计算的像素数量控制在较少的范围,则节约不少的ALU。

在允许的情况下,可以使用场景中放置一个Quad来代替全屏后处理。思路是,将原来后处理的计算代码转移到Quad的Shader中执行,将当前摄像机RenderTexture传递到Quad的材质中,将Quad的顶点通过ComputeGrabScreenPos()计算得到屏幕空间的UV。

举个例子,比如一个后处理的描边效果,如果应用比较局限,可以在需要描边的对象上放置一个Quad(根据需求决定是否使用Billboard),将边缘检测的计算转移Quad的Shader中进行计算。使用CommandBuffer来传递当前摄像机的RT。不过可能需要一些额外的操作,以及需要注意CommadBuffer的顺序,否则会造成显示不正常。

2.RenderTexture&Blit

RenderTexture&Blit的优化比较复杂,因为往往伴随的算法的优化。可以在一些对精度不敏感的效果中使用下采样来节约空间。不过并不建议修改RenderTexture的格式来节约空间,因为有部分移动设备效果显示不正常的情况。(对这块有研究的可以不用Care)

3.尽量不要新建摄像机渲染到RT(针对新建摄像机的摄像机设置与主摄像机相同,尺寸除外)

一些效果的实现中,采用新的摄像机渲染到RenderTexture,然后将此RT用于后续渲染的方式。虽然在实现原理上,这样做的思路比较清晰,但是在资源消耗方面,在移动平台并不适合使用。

如果新建的摄像机的视口配置与当前的主摄像机一致,那么便可以使用这个优化方式。个人的实现方式,使用CommandBuffer,创建一张临时RT,然后将需要渲染的对象收集到一个Renderer类型的list中,然后遍历Renderer,DrawRenderer到临时RT中。这样的话,就不需要新建一个摄像机。

 

posted @ 2017-10-09 21:23  JaffHan  阅读(2852)  评论(0编辑  收藏  举报