【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中。這樣的話,就不需要新建一個攝像機。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM