用Compute Shader處理影像資料後在安卓機上不能正常顯示渲染紋理

UWATech發表於2024-03-20

1)用Compute Shader處理影像資料後在安卓機上不能正常顯示渲染紋理
2)摺疊屏適配問題
3)Prefab對DLL中指令碼的引用丟失
4)如何最佳化Unity VolumeManager中的ReplaceData


這是第378篇UWA技術知識分享的推送,精選了UWA社群的熱門話題,涵蓋了UWA問答、社群帖子等技術知識點,助力大家更全面地掌握和學習。

UWA社群主頁:community.uwa4d.com
UWA QQ群:465082844

Shader

Q:我用Compute Shader來做2D遊戲影像資料的處理工作。

這是一款老2D遊戲,客戶端資源中大量影像都是以UShort[]陣列儲存的。讀取後陣列中的一個UShort值對應一個畫素顏色值,透過寫一個Compute Shader,將這些畫素顏色值寫到RenderTexture上,然後用Canvas+RawImage顯示在主攝像機中。

在編輯器中已經正常執行了,每幀渲染耗時8-10ms(因為換裝遊戲的關係,需要對顏色值做很多疊加計算等處理)。

我打包出APK包,在安卓手機真機上卻無法像在編輯器裡一樣顯示影像。

在安卓手機執行時,打Log檢測:

SystemInfo.supportsComputeShaders

  

安卓真機系統是支援這個Compute Shader的。

用FrameDebugger檢視時,在編輯器裡:

用Compute Shader處理影像資料後在安卓機上不能正常顯示渲染紋理

可以看到執行了Compute Shader,而且顯示了這個Compute Shader的名稱:XImageComputeShader。

上圖第二紅框中就是渲染出的RenderTexture影像內容。透過繫結RawImage,在遊戲畫面中可以正常顯示。

但在安卓機裡,看不到執行Compute Shader的地方,而RenderTexture的影像內容全部為空。

用Compute Shader處理影像資料後在安卓機上不能正常顯示渲染紋理

而遊戲畫面中,也是空白內容,沒有影像。請教各位大佬,問題可能出在哪裡?

另外,我用了華佗熱更,再用IL2CPP,是否會因為某些原因被裁剪掉?如何驗證修復呢?

針對以上問題,有經驗的朋友歡迎轉至社群交流分享:
https://answer.uwa4d.com/question/65f5759f3625c22cffcb1eba


UI

Q:請問大家有處理過摺疊屏的適配嗎?有沒有好的思路?

目前專案直接SetResolution後,無法自適應摺疊屏開關變化;但又不想一直Update監聽螢幕的尺寸。請問大家還有更好的思路嗎?

針對以上問題,有經驗的朋友歡迎轉至社群交流分享:
https://answer.uwa4d.com/question/65f307a63625c22cffcb1eb9


Prefab

Q:開發時,不希望策劃看到原始碼,於是將原始碼替換成DLL,但是這樣掛在Prefab上的指令碼引用會丟失,請問怎麼解決?

A1:寫了個Demo測試了下,如果工程裡的DLL對應GUID維持不變(對應Meta檔案不變),DLL重新構建並匯入替換,並不會影響Prefab上掛接的DLL裡的Mono指令碼。

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

A2:思路可以參考該以下工具,實際使用需要修改一下原始碼。

DLLSwitcher | 實用工具 工具 | Unity Asset Store
https://assetstore.unity.com/packages/tools/utilities/dllswitcher-40370

感謝草莓宣告@UWA問答社群提供了回答


Script

Q:請問Unity VolumeManager中ReplaceData怎麼最佳化?為什麼每幀都會更新所有的引數?

A:最佳化方式是減少專案中VolumeComponent,有一些沒有用到的就不需要加入到type[]中了,本身CPU耗時就是For迴圈所有的引數和VolumeComponent開銷比較大。

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

封面圖來源於網路


今天的分享就到這裡。生有涯而知無涯,在漫漫的開發週期中,我們遇到的問題只是冰山一角,UWA社群願伴你同行,一起探索分享。歡迎更多的開發者加入UWA社群。

UWA官網:www.uwa4d.com
UWA社群:community.uwa4d.com
UWA學堂:edu.uwa4d.com
官方技術QQ群:465082844

相關文章