关于RenderFeature重复计算的一个Bug

Posted by 恶毒的狗 on September 28, 2020

径向模糊的掉帧问题

渲染迁移到 URP 的工作基本差不多了,不过昨天跑包的时候遇到一个问题,在播放 径向模糊 效果的时候,帧率 下降得很厉害,并且UI也跟着场景一起模糊了,如下图:

img

这个问题在原先的 标准管线 下并不存在。

原因

简单检查了一下原因,发现 CameraStack 上的所有相机都执行了径向模糊这个 RenderFeature,包括 UI相机,我们 CameraStack 的设置如下图:

img

看了一下 URP 的代码,发现无论是渲染 Base相机 相机还是渲染 Overlay相机,最终都会走到 RenderSingleCamera 这个函数,如下图:

img

RenderSingleCamera 的主要流程如下:

img

上图的 Setup 流程会执行到 RenderFeatureAddRenderPasses 函数,而 Execute 流程会执行到 RenderPassExecute 函数。

由此可见,如果我们不对相机进行区分,所有相机都会执行一遍 径向模糊 这个 RenderFeature,这就导致了在播放这个效果时帧率显著下降,同时UI也跟着糊掉了…

修正

修正方式很简单,我们在 RenderFeatureAddRenderPasses 函数中对相机做一个过滤即可,代码如下:

img

当然,我们也可以对不同相机设置不同的 Renderer,不过这里我不想维护多个 Renderer,所以还是直接代码加个判断就好了。

修正后一切正常了:

img

好了,拜拜!