zoukankan      html  css  js  c++  java
  • 【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中。这样的话,就不需要新建一个摄像机。

  • 相关阅读:
    10. Regular Expression Matching
    9. Palindrome Number
    6. ZigZag Conversion
    5. Longest Palindromic Substring
    4. Median of Two Sorted Arrays
    3. Longest Substring Without Repeating Characters
    2. Add Two Numbers
    链式表的按序号查找
    可持久化线段树——区间更新hdu4348
    主席树——树链上第k大spoj COT
  • 原文地址:https://www.cnblogs.com/jaffhan/p/7643068.html
Copyright © 2011-2022 走看看