材質最佳化:如何正確處理紋理和材質的關係

侑虎科技發表於2020-11-18

在上一期《紋理優化:讓你的紋理也“瘦”下來》中,我們對紋理優化挑選部分知識點和大家作了分享。這些看似細小的知識點,很容易在大家的開發和學習過程中被疏忽,而長期的問題積累最終都會反映到專案的效能表現上。為此,我們將這些規則列出,並且以一個個知識點的形式向大家逐一解讀。

在本文中,我們將聚焦材質相關的優化方面,以《UWA本地資源檢測》中的“包含相同紋理取樣的材質”、“包含純色紋理取樣的材質”和“取樣數過多的Shader”,為大家簡單講解相關的知識點。我們將力圖以淺顯易懂的表達,讓職場萌新或優化萌新深入理解。


1、包含相同紋理取樣的材質

在Unity中,紋理(Texture)和材質(Material)不是“一對一”的關係,一個材質內可以包含多個紋理,只需要在相應的Shader中進行宣告即可。

在實際開發過程中,或是因為疏忽,或是因為特殊的計算需求,開發團隊可能會在材質內對同一個紋理進行多次引用,或者說在多個“槽位”上放置同一個紋理,如圖所示:

當然這種情況不是普遍現象,如果有特殊需求,要對同一個紋理進行不同方式地取樣運算,或者採集不同的部分,那麼對該紋理使用多個不同的引用,也無大礙,不會浪費運算資源;但是如果因為疏忽而對同一紋理進行了多次相同運算,那無疑會增加沒有必要的GPU壓力。

所以在本條規則篩選出相關材質後,開發團隊可以根據實際情況,檢視被檢出資源的合理性。


2、包含純色紋理取樣的材質

在之前效能黑榜系列的文章《那些年給效能埋過的坑,你跳了嗎?》中,我們對“純色紋理”有過相關的介紹。本條規則在知識點上和“純色紋理”那一條規則的原理是一致的。

上圖中的純色紋理其實可以使用一個Color來替代,從而避免實體紋理造成的記憶體佔用,減輕GPU對紋理進行取樣的開銷,以更高效的處理方式達到同等效果。

所以在本條規則為大家找出相關材質的同時,開發團隊在今後的研發過程中也要有意識地提高對純色紋理應用的敏感程度。


3、紋理取樣數過多的Shader

在上面的規則中我們提到,可以在Shader中宣告紋理。簡單的程式碼如下圖。

通過Shader中程式碼的宣告,材質擁有了多個“插槽”,由此實現了對多個紋理進行引用。但凡事“越多”不一定意味著“越好”。如下圖(圖中材質僅僅為說明此條規則而建立,並非真實專案使用的案例):

一方面,一個材質所取樣的不同的紋理數過多,勢必會增大包體佔用空間。而如果大量的紋理參與到了Shader的運算當中,那麼其執行時的視訊記憶體佔用與計算消耗也會對專案整體帶來不小的壓力。

另一方面,每一個“插槽”中其實都有著一張預設的白色純色紋理,在“供大於求”的情況下,相關Shader一旦參與了專案的實際執行,這些未被使用的“插槽”上的預設紋理自然會造成記憶體和計算上的浪費。

所以本條規則會過濾出那些紋理取樣數過多的Shader,以方便開發團隊對相關Shader和材質進行“瘦身”。


希望以上這些知識點能在實際的開發過程中為大家帶來幫助。需要說明的是,每一項檢測規則的閾值都可以由開發團隊依據自身專案的實際需求去設定合適的閾值範圍,這也是本地資源檢測的一大特點。同時,也歡迎大家來使用UWA推出的本地資源檢測服務,可幫助大家儘早對專案建立科學的美術規範。

我們已支援Luacheck功能啦~
我們已支援粒子特效檢測~
這麼多實用貼心的功能
你們還沒用起來嗎?

萬行程式碼屹立不倒,全靠基礎掌握得好!

效能黑榜相關閱讀

《那些年給效能埋過的坑,你跳了嗎?》
《那些年給效能埋過的坑,你跳了嗎?(第二彈)》
《掌握了這些規則,你已經戰勝了80%的對手!》

相關文章