1. 程式人生 > 其它 >FSR-Unity-URP 1.0 的效能和相容性問題

FSR-Unity-URP 1.0 的效能和相容性問題

1)FSR-Unity-URP 1.0 的效能和相容性問題
​2)計算大檔案MD5耗時問題
3)如何監聽Unity即將Reload Script
4)如何對Unity遊戲的Android崩潰和ANR問題進行符號化解析


這是第315篇UWA技術知識分享的推送。今天我們繼續為大家精選了若干和開發、優化相關的問題,建議閱讀時間10分鐘,認真讀完必有收穫。

UWA 問答社群:answer.uwa4d.com
UWA QQ群2:793972859(原群已滿員)

Rendering

Q:關於FSR-Unity-URP 1.0 的效能和相容性問題:

測試環境:
Unity版本:2020.3.3
URP版本:10.4.0
Graphics API:Vulkan


裝置:OPPO K1

1. 相容性問題
場景相機開啟了HDR,URP下渲染目標RT的預設格式為B10G11R11_UFloatPack32,在裝置上會報錯:Format unsupported for random writes - RG11B10。該紋理格式不支援隨機寫入,之後強制把格式設定為R16G16B16A16_SFloat,問題解決,但是想找到更為正規的做法。

2. 效能問題:
在OPPO K1上,場景正常渲染狀態下GPU耗時為20ms左右,開啟FSR Performance Level後,GPU耗時飆升到100ms左右,同時在HUAWEI P30 Pro上做了測試,FPS下降了3FPS左右。

用RenderDoc在Editor做了抓幀,效能熱點集中在FSR的Compute Shader中:

 Compute Shader單個Thread的取樣次數為12次。

另外,使用整合後處理的方式後,在OPPO K1上做了測試,發現後處理的開銷比把RenderScale改成0.5後節省的開銷還要大很多,整體幀率反而下降了。

不知道各位同學是否有把FSR落地到專案的經驗,希望可以分享下。

A1:不要用Compute Shader版本的實現,參考URP12裡後處理方式的實現。

前一段時間我試了下,在曉龍660這個級別是不太行,670上消耗和節約的差不多,670再往上的才開FSR好一點。

感謝金喆@UWA問答社群提供了回答

A2:以下回答供參考:

  1. 相容性問題
    請教了一下Unity的朋友,對於B10G11R11_UFloatPack32 這個Format,實現裡面有個預設是桌面系統的OpenGL標準的要求,OGLES預設無法開啟的,所以暫時來說你的做法是一個正確的操作。或者只能等Unity更新Code來支援OGLES下的B10G11R11_UFloatPack32。

  2. 效能問題:
    不是很熟悉URP12上的後處理方式和Compute Shader實現的具體內容,上面金喆大佬的回答應該更靠譜。就當前貼出來的內容來看Compute的實現,僅從Driver和HW角度,可能有兩個地方會導致一定的效能問題:即vkCmdBeginRenderPass(C=Load, DS=load)和vkCmdEndRenderPass(C=store, DS=store),這兩個地方Load Store都是必須的嗎?尤其是DS部分?

    Store和Load會消耗GPU頻寬去同步Mem讀寫vkCmdDispatch(188,94,1)和vkCmdDispatch(1,1,1),這兩個WorkItem都不是一個很理想的設定,一般的手機平臺的GPU配置,都希望這兩個是一個2的某個次方的,典型的是32的倍數或者64/128/256/512之類的倍數,若太大(比如超過2048,只是舉例)或者太小(比如小於32)都會比較影響GPU執行計算時候的並行度。

    這兩個可能是在驍龍660的K1上Compute執行時間很長的部分原因。至於HUAWEI的Core,類似Turbo之類的技術會在底層考慮一些優化而更改了APP的請求,從而導致效能波動情況不太一致。

感謝Seague@UWA問答社群提供了回答


Scripting

Q:在計算大檔案MD5的時候,存在耗時嚴重問題,大概2分鐘,在手機上接受不了,有大佬有方法嗎?

測試發現:改Buffer大小到1MB,由2200毫秒變成了1980毫秒,優化效果並不明顯。
https://itecnote.com/tecnote/c-the-fastest-way-to-create-a-checksum-for-large-files-in-c/

A:可以嘗試使用xxHash演算法,對比過效能資料,比MD5演算法快很多。
https://github.com/uranium62/xxHash
https://github.com/Cyan4973/xxHash

感謝馬三小夥兒@UWA問答社群提供了回答


Scripting

Q:請問如何監聽Unity即將Reload Script?

有找到方法 [UnityEditor.Callbacks.DidReloadScripts(0)] ,這個是Reload Script之後的回撥,但未找到Reload之前的監聽方法,請問有辦法監聽到嗎?

A:以下兩個事件,在一開始配合InitializeOnLoadMethod或者InitializeOnLoad使用:
AssemblyReloadEvents.beforeAssemblyReload
AssemblyReloadEvents.afterAssemblyReload

再說個模式切換事件:EditorApplication.playModeStateChanged,我自己寫了一個手動Reload Script,參考如下:
https://github.com/ZeroUltra/UnityManualReload/blob/main/ScriptCompileReloadTools.cs

感謝zerolj@UWA問答社群提供了回答


Scripting

Q:如何對Unity遊戲的Android崩潰和ANR問題進行符號化解析?

A1:Google Play支援在Play管理中心為每個應用版本上傳除錯符號檔案。這樣可以更輕鬆地分析和修復崩潰和ANR問題。

從Unity 2020.3及更高版本開始,您可以按照Unity的指南生成Android符號,然後將符號化解析檔案上傳到Google Play管理中心,以便在Android Vitals資訊中心檢視人類可讀懂的堆疊軌跡。

否則,您可以按照Unity中的對Android崩潰進行符號化解析一文,手動解析堆疊軌跡或為較低版本的Unity生成符號檔案。

感謝I’m@UWA問答社群提供了回答

A2:Android上的崩潰和ANR問題會生成堆疊軌跡,這是您的遊戲在崩潰之前呼叫過的巢狀函式序列的快照。這些快照可幫助您找出並修正原始碼中的任何問題。

不過,當您在釋出模式下使用Unity構建遊戲時,符號不會隨APK一起打包。如果您的遊戲崩潰或出現ANR問題,呼叫堆疊將僅顯示記憶體地址。

05-26 18:06:51.311: A/libc(26986): Fatal signal 11 (SIGSEGV) at 0x000004e4 (code=1), thread 27024 (Worker Thread)
05-26 18:06:51.411: I/DEBUG(242): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
05-26 18:06:51.411: I/DEBUG(242): Build fingerprint: 'Xiaomi/cancro_wc_lte/cancro:4.4.4/KTU84P/V6.7.1.0.KXDCNCH:user/release-keys’
05-26 18:06:51.411: I/DEBUG(242): Revision: '0’
05-26 18:06:51.411: I/DEBUG(242): pid: 26986, tid: 27024, name: Worker Thread >>> com.u.demo <<<
05-26 18:06:51.411: I/DEBUG(242): signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 000004e4
I/DEBUG(242): backtrace:
I/DEBUG(242): #00 pc 006d4960 /data/app-lib/com.u.demo-1/libunity.so
I/DEBUG(242): #01 pc 006d4c0c /data/app-lib/com.u.demo-1/libunity.so
I/DEBUG(242): #02 pc 006d4c0c /data/app-lib/com.u.demo-1/libunity.so
I/DEBUG(242): #03 pc 006d4c0c /data/app-lib/com.u.demo-1/libunity.so
I/DEBUG(242): #04 pc 006d4c0c /data/app-lib/com.u.demo-1/libunity.so
I/DEBUG(242): #05 pc 001c5510 /data/app-lib/com.u.demo-1/libunity.so
I/DEBUG(242): #06 pc 001c595c /data/app-lib/com.u.demo-1/libunity.so
I/DEBUG(242): #07 pc 001c4ec0 /data/app-lib/com.u.demo-1/libunity.so
I/DEBUG(242): #08 pc 0043a05c /data/app-lib/com.u.demo-1/libunity.so
I/DEBUG(242): #09 pc 0000d248 /system/lib/libc.so (__thread_entry+72)
I/DEBUG(242): #10 pc 0000d3e0 /system/lib/libc.so (pthread_create+240)

  

感謝anan@UWA問答社群提供了回答

封面圖來源於網路


今天的分享就到這裡。當然,生有涯而知無涯。在漫漫的開發週期中,您看到的這些問題也許都只是冰山一角,我們早已在UWA問答網站上準備了更多的技術話題等你一起來探索和分享。歡迎熱愛進步的你加入,也許你的方法恰能解別人的燃眉之急;而他山之“石”,也能攻你之“玉”。

官網:www.uwa4d.com
官方技術部落格:blog.uwa4d.com
官方問答社群:answer.uwa4d.com
UWA學堂:edu.uwa4d.com
官方技術QQ群:793972859(原群已滿員)