求知探新 Unity中ShaderLab記憶體優化

2021-09-21 20:00:41 字數 2324 閱讀 5793

從上圖(進入戰鬥場景時的記憶體快照)可以看出,shaderlab占用居然達到42mb,為什麼shader的占用那麼高呢?

由於當前項(shaderlab)沒有說明詳細的shader占用資訊。所以只能去另外找原因了,還好,在記憶體快照的assets下的shader項中,有詳細的使用資訊。

然後我們看到standard的shader使用,但專案裡面根本沒有地方使用過standard這個shader,為什麼會存在呢?

為此,我們進行了一輪的排查,把部分使用到standard的地方清除掉,測試並再拿一次記憶體快照。

清除了一部分後,shaderlab降到27.6 mb(後來完全清除掉standard,降到21 mb)。果然,主要原因就出在了standard上。那麼問題又來了,為什麼我們沒有使用到standard,卻會在記憶體中看到standard的使用呢?

這裡就要說下兩個坑了,同樣,也是排查這個問題的方法。

1、模型匯入導致

模型匯入的時候,「import materials」是預設勾選的。所以當模型匯入時,unity會在同目錄建立「materials」目錄,並建立相應的材質,而這個材質預設是使用standard。

由於美術在製作過程中對prefab中對模型另外賦予材質,所以實際上,預設建立的材質(standard)是沒有使用到的。可是當載入模型的時候,卻又把預設建立的材質載入上了,並對著色器解析了,因此導致記憶體中有standard。

那麼解決方法也很簡單,把「import materials」去掉,並把沒有使用的預設材質刪除。

注意:如果不把「import materials」去掉,匯入到其他專案時,材質又會自動建立了。

補充:

由於實際專案中,prefab改動次數比較大,相應的模型檔案改動比較少,所以把專案中的模型和對應的prefab分開打包成不同的assetbundle,然後就會出現乙個很奇怪的情況。

沒有勾選「import materials」的模型檔案,在例項化prefab時,shaderlab會存在乙份「standard」的shader記憶體,而這個shader的引用是指向乙個「default-material」檔案(可是這檔案並不存在)。

但是,在模型和prefab在相同的assetbundle中,或者使用resources載入時,卻不會有「standard」和「default-material」的出現。暫時還不確定是否是unity 5.3.3版本的bug,還是unity的特殊機制。

臨時解決方案:在需要模型與prefab分開打包時,勾選「import materials」,直接使用和修改預設生成的材質。

2、預設模型(cube、sphere)建立導致

早期場景搭建時,為了方便定位和視覺化,曾經使用cube等系統預設的mesh作為錨點,然後在啟動遊戲時禁用掉。由於這些cube不啟用,效能消耗很輕微,所以就沒有理會了。

可是,就因為是系統預設的mesh,所以建立時,賦予的材質就是預設的材質「default-material」,而這個材質使用的著色器就恰恰是「standard」。所以「standard」存在的並不冤了。

解決的方案也很簡單,刪掉這些mesh或者是替換材質。這樣,這部分占用的「standard」就不存在了。

由於standard的變體太多了,所以當引用了standard的時候,往往會存在多個standard變體,占用大量的記憶體。如果,你發覺你的shaderlab的記憶體過大,而又那麼也不妨找找是不是上述的原因。

那shaderlab占用記憶體過大是不是完全是standard的原因呢?其實並不止的。像我們優化完之後的27mb(完全清除後是21mb),肯定還有其他原因造成的。可是,優化的過程是砍大頭,像上文那樣,稍微優化一下,就能拿掉20多mb,當然要立刻做,可是越往小的時候,優化效率就越來越低了,所以這時候就需要轉移目標看一下「assets」「texture2d」這些大頭了。所以,剩下shaderlab的優化方向可能會在以後遇到的時候再補充。

ps:以上內容均在真機上測試

unity中shader的Cutout問題

unity中自帶的shader裡有cutout型別的shader,今天發現這種型別很詭異,先 貼幾種自帶的 shader transparent cutout diffuse cutoff alpha cutoff range 0,1 0.5 subshader lod 200 cgprogram ...

Unity中的Shader的形態

unity通過shaderlab來組織shader 作為一款號稱跨平台性最好的遊戲開發引擎,unity使用自定義使用mono這個開源的.net來實現。對於要適應不同的gpu的shader來說,unity使用自定義shaderlab來組織shader的內容,並會針對不同的平台進行編譯。1.關鍵字sha...

unity中頂點片段shader環境反射

最近具體聯絡了一下裡面shader的基本寫法,弄來個綜合版本 然後就是最難看出差異的反射計算問題,頂點裡面計算和片段裡面計算的區別 使用的模型是這個,其中右邊的是平滑法線後的模型 具體的差異可以看下面gif圖 可以看出 下面是 shader unlit shenmifangkeshader norm...