unity 后处理优化整理

关于后处理优化,整理几条

1.用OnPreRender和OnPostRender替换OnRenderImage

    private void OnPreRender()
    {    
        cameraRenderTex = RenderTexture.GetTemporary(Screen.width, Screen.height, 24, RenderTextureFormat.Default);
        mainCamera.targetTexture = cameraRenderTex;
    }

    private void OnPostRender()
    {
        Graphics.Blit(cameraRenderTex, null as RenderTexture);
        RenderTexture.ReleaseTemporary(cameraRenderTex);
    }

当我们的camera开启MSAA或者HDR的时候,会导致后处理不起效果,HDR可以不用,不过抗锯齿还是要用的,这是直接改rendertexture的参数就可以

    private void OnPreRender()
    {    
        if(QualitySettings.antiAliasing == 0)
        {
            cameraRenderTex = RenderTexture.GetTemporary(Screen.width, Screen.height, 24, RenderTextureFormat.Default, RenderTextureReadWrite.Default);
        }
        else
        {
            cameraRenderTex = RenderTexture.GetTemporary(Screen.width, Screen.height, 24, RenderTextureFormat.Default, RenderTextureReadWrite.Default, QualitySettings.antiAliasing);
        }       
        mainCamera.targetTexture = cameraRenderTex;
    }

    private void OnPostRender()
    {
        Graphics.Blit(cameraRenderTex, null as RenderTexture);
        RenderTexture.ReleaseTemporary(cameraRenderTex);
    }

2.整合后处理效果

以OnRenderImage的做法举例:通常是每个效果是一个脚本,他有自己的OnRenderImage,如果我们有4个效果,那就是4个单独的OnRenderImage,这在代码层面的简洁性和易扩展性上,当然是有优势的。但是,这样做,性能是有问题的,我们需要尽量将各种后处理效果,整合到同一个OnRenderImage(或pre post方法)中,这样能带来一些性能提升,虽然不如上面的pre post效果明显,但是优化是一点点积累的,也是值得做。

3.修改材质属性,不要使用string

把shader变量id缓存起来,加入这个shader用了_MaskTex这个变量,另外一个shader的_MaskTex变量的id也是一样

_MaskTex = Shader.PropertyToID("_MaskTex");

原来用string是这样的

Mat.SetTexture(“_MaskTex”, Mask);

加了缓存之后可以这么写

Mat.SetTexture(_MaskTex, Mask);

为什么可以这么写,因为material.settexture(“string”,tex)反编译可以看到

material.settexture(Shader.PropertyToID(“string”),tex)

这里多了一步转id,所以缓存起来,能优化一点是一点

4.不怎么影响效果情况下,尽可用fixed代替float和half

数量级多了也是很客观的

总结

优化这个东西,是能优化就优化,积累小优化多了,还是很可观的

猜你喜欢

转载自blog.csdn.net/SnoopyNa2Co3/article/details/89382980