紋理優化:讓你的紋理也“瘦”下來

在上一期《》中,我們針對紋理相關的優化,挑選了部分知識點分析,無論是大家在開發時的疏忽,還是對相關知識點的理解不足,這些問題的積累最終都會反映到專案的性能表現上,為此,我們將這些規則列出,并且以一個個知識點的形式向大家逐一解讀,

本文,我們繼續聚焦紋理方面,以中的檢測規則:“開啟Mipmap選項的Sprite紋理”、“用非壓縮格式的紋理”和“Wrap模式為Repeat的紋理”為大家簡單講解相關的知識點,我們將力圖以淺顯易懂的表達,讓職場萌新或優化萌新深入理解。

1、開啟Mipmap選項的Sprite紋理


對紋理而言,在Import Settings中開啟Generate Mip Maps后,Unity就會預生成一系列長寬以2為倍數縮小的紋理序列,一直生成到解析度為 1*1,在采樣紋理時會根據圖形的大小自動選擇相近等級的Mipmap進行采樣。


在3D場景中,由于距離問題,物體的紋理需要經常被縮放、拉伸,所以使用Mipmap會減小運行過程中的計算量,提升GPU效率。

需要注意的是,開啟Mipmap選項后,生成的多個小解析度紋理會使得總體記憶體占用比原來多出1/3,在UI中,由于不存在元素相對于相機的位置不斷變化的需求,一般情況下也不需要頻繁縮放圖片(特殊需求除外),所以對UI而言Mipmap的存在對性能提升其實是沒有意義的。


本條規則的主角——Sprite型別的紋理,就是應用在2D游戲或者UI當中的,所以我們不建議開啟Mipmap,以避免造成記憶體上的浪費,

2、使用非壓縮格式的紋理


首先我們要區分圖片檔案格式和引擎中支持的紋理格式,對圖片而言,諸如JPG、JPEG和PNG等多種檔案格式是為了存盤影像資訊而使用的、對資訊的特殊編碼方式,它存盤在磁盤中或者記憶體中。

但圖片的這些格式,對于以向量計算見長的GPU來講就有種面對陌生外語時的“無能為力”了,3D圖形硬體不支持原始的圖片檔案格式,原始圖片需要經過CPU轉換成圖形硬體支持的格式才能在實時渲染中使用,而這些可以被GPU識別的格式,就是我們要說的紋理格式。


我們可以在Format里設定紋理的格式。不同的設備與平臺具有各自專有的支持的格式,RGB32/RGBA32/RGBA24/RGB24為非壓縮的格式,能適用于多個平臺和環境。這些格式顯示效果較好,但記憶體占用較大,效率不高。因此我們建議在對影像質量要求不是特別高的情況下,盡量使用硬體支持的壓縮格式,

這條規則會過濾出所有采用非壓縮格式的紋理,開發團隊需要基于相關紋理的實際使用需求和在相關平臺上表現效果的考量,來決定是否需要進行壓縮。

目前Unity支持的紋理壓縮格式有ETC、ASTC、PVRTC和DXT等,各有不同的適用環境,在壓縮的大小和保真度上也各有所長。對于壓縮格式的使用,可以參考UWA問答上的帖子:https:http://answer.uwa4d.com/question/58d2943ae00cc20065a42597。

3、Wrap模式為Repeat的紋理


一般而言,我們使用UV坐標構建起模型表面在紋理上的對應采樣關系,UV坐標的采樣范圍在0~1之間。但實際開發過程中,有時會遇到“在UV坐標0~1以外的范圍進行采樣”的情況,


Wrap Mode 選項就是用來確定當紋理坐標(UV坐標)超出0~1范圍時如何采樣的。形象點來講,這種情況有點像是在畫框里放入了一張尺寸比框小的畫作,WrapMode決定了以何種方式去填充畫作與畫框間的部分。我們將在這里介紹常用的兩種方式:Repeat和Clamp。

在Unity中,Texture的Wrap Mode默認是Repeat,該方法以平鋪的方式填滿“畫框”的剩余部分。對于如下圖所示的一張紋理:

Repeat模式的實際顯示效果如下:


而對于Clamp模式,它會以“畫作”邊緣那一圈去采樣填充滿“畫框”中剩余的部分,從UV坐標的角度而言,該模式會將大于1.0的數值設定為1.0,將小于0.0的數值設定為0.0,其顯示效果如下:


那么我們為什么要將Repeat模式的紋理檢測出來呢?因為在實現方法上,當UV坐標超出0~1范圍時,Repeat模式會忽略紋理坐標的整數部分,并將紋理圖的拷貝粘貼在物體表面上。這就要求在紋理頂部的紋理單元應與底部的紋理單元相匹配,在紋理左側的紋理單元也應與右側的紋理單元相匹配,這樣才能做到無縫連接,若無法滿足兩側無縫銜接的要求,在最終顯示的影像邊緣會出現雜色,如下圖所示:


所以從表現效果上講,Repeat模式有可能會使得紋理邊緣看起來更不自然,所以在篩選出WrapMode中選擇了Repeat模式的紋理后,開發團隊要根據紋理的實際展示效果去選擇合適的WrapMode模式。

希望以上這些知識點能在實際的開發過程中為大家帶來幫助。需要說明的是,每一項檢測規則的閾值都可以由開發團隊依據自身專案的實際需求去設定合適的閾值范圍,這也是本地資源檢測的一大特點。同時,


我們已支持Luacheck功能啦~

我們已支持粒子特效檢測~

這么多實用貼心的功能

你們還沒用起來嗎?


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

2 条回复 A文章作者 M管理員
  1. 很有感覺!

  2. 原來是這樣的啊.