unity移動開發如何依據性能選擇shader?

各處搜集的有一些觀點,如gpu對邏輯判斷偏弱,可是也有觀點說現在這裡已經不是短板;如盡量使用固定管線,可是也有觀點說新的gpu是使用可編程管線來模擬固定管線。 對於這些觀點,應當如何考證和找到理論依據呢? 對於Unity移動平台開發,除了黑盒AB之外,如何評價和選擇shader呢?有無必要優先選擇mobile系的shader呢?

補充:感謝大神來答題,因為關注特定場景所以修改了一下題目。額外求問profile工具推薦。


首先要做的是根據機器的性能進行畫質高中低選擇,評價的標準根據這個

Smartphone Graphics Cards - Benchmark List

對不同的畫質設置不同的

Shader.maximumLOD

然後在寫Shader的時候註明LOD,在fallback裡面寫下一級的Shader。

至於Shader里的具體消耗,一方面是靠自身經驗或者問老司機,另一方面可以找下每個廠商GPU方面的指南,比如

ARM guide for Unity developers

不過最精確最直接的GPU 性能消耗要靠自己去Profile,工具推薦Mac上的XCode,可以看到每次DrawCall的耗時,動態改Shader

PC上可以用Adreno Profiler,功能類似,只能用於高通的GPU。

Unity5.6之後似乎可以很方便的使用Mali的Mali Graphics Debugger,也可以試試。


1. gpu對邏輯判斷偏弱。錯。這是對warp執行不了解的人說的錯誤觀點。同個warp做同樣判斷的時候不弱。所以只要盡量讓相鄰pixel做同樣的分支就沒問題。看GPU Gems。

2. 盡量使用固定管線。錯。DX9之後的顯卡都是用shader來模擬固定流水線,這是個常識。

shader性能和cpu性能一樣,靠profile。


不要說你們了,就我們有時候都搞不懂為什麼某些Shader特別慢。

有時候即便有非常詳細的Profiling信息(比應用層的Profiling信息細緻了無數倍),都不一定能找到合適的解決方案。


首先,在你打算做這件事情之前確定shader對於性能影響所佔的比重。因為unity現在是多線程渲染,只要不是gpu-bound就沒有必要做shader優化。

以我的經驗除了大量tex2d或者高階計算指令會導致現在高低配機型產生顯著性能差異外(比如帶法線貼圖計算的shader,或者是用了一堆通道圖的shader),其他的根本不用管。

shader分lod在我看來是渲染優化項中優先順序最低的,把原始的shader優化好,降低overdraw才是渲染優化的核心內容。一個簡單的半透面片疊上10幾層就能讓你爽死了

另外補充下優化工具,iOS看xcode,先看CPU/GPU性能佔用,如果CPU高就不用管shader了,如果gpu高的話用framecapture工具就可以定位到gpu的消耗瓶頸。Android先看profiler,切換到timeline模式定位是CPUbound還是GPUbound,可以用snapdragon profiler或者mali gpu profiler看具體瓶頸,不過那兩個工具對設備的要求都挺高的,找個能用的Android機很費勁,我一般都是通過設置開關對具體shader進行控制變數測試,以找到性能瓶頸點


沒必要優先選擇 mobile 系。總體而言優化放在少燈,少圖,少分件,少透明,少骨骼工作上。其實沒幾個移動平台遊戲真正瓶頸能做到 GPU 的,大多都是在帶寬上卡歇菜了……


咳,雇一個技術美術。

另外沒太明白什麼意思,什麼叫做根據性能選擇shader。

當然是性能越好的機器,可以用越複雜的shader啊。

每個shader要跑效率測試,才決定能不能用。

然後還要控制整體美術效果,別搞的太花哨,不然的話,雖然畫面超贊,幀率也高,但是吃電池太厲害,一樣被鄙視。。。。


自己寫shader,寫的時候盡量考慮性能。出現性能問題,先排查,排不出來逐個參數測試。

前期保證美術效果的時候避免過度優化,寫的可以奔放一些,這樣預覽速度比較快,後期統一結合程序端進行優化。程序端越節約,對於美術效果的空間越大。

必要時可以通過GEEK的取巧方式或美術暴力繪製方式來彌補簡陋的shader效果。


不論移動端還是PC端優化都是必不可少的,編寫shader時,盡量考慮降低shader的變異性,比如unity下,點光源和陰影貼圖的處理等。盡量減少貼圖等待,比如陰影貼圖和屏幕後期處理都需要等待深度貼圖或者畫面渲染完後再處理。邏輯判斷弱是因為GPU的浮點處理比邏輯處理更加強大。 優化是個經驗的總結,越是經驗豐富的技美,對不同情況的優化越是不同,沒有一種萬能的答案的。比如shader中利用lightmap來處理紋理,利用矩陣來處理點光源,利用頂點偏移來做光影投射等。


我的經驗是傻爆測試,逐步替換shader,vs測試完了測試ps。目前只有高通的文檔可以參考,而且出了些日子了,不知道適應性如何了。


推薦閱讀:

TAG:Unity遊戲引擎 | GPU通用計算 | shader |