1、基本概念
1)美術圖片:jpg、png、位圖
紋理(Texture)“美術圖片”反到unity目錄中,它就是Texture類型
貼圖(Map)其功能就是把紋理通過 UV 座標映射到3D 物體表面
材質(Material)它是貼圖+shader+一系列信息,是一個數據集;
主要功能就是給渲染器提供數據和光照算法。
圖集(Atlas)不是圖,而是個有UIAtlas組件的Prefab,它引用了一個材質(球),用於UI;
2)NGUI中的UISprite和UITexture區別
UISprite引用一個圖集內的圖片,是一個DrawCall,如果你做了一個圖集是1024X1024的。此時你的界面上只用了圖集中的一張很小的圖,那麼很抱歉1024X1024這張貼圖都需要載入你的內存裏面;
UITexture沒有圖集的概念,只需要把圖片掛上去就行了。這樣內存裏只會佔用你這一張圖的大小,內存雖然小了但是DrawCall就上去了,因爲每一張UITexture是一次DrawCall
那些重複性比較高的圖片最好打成圖集,而一些原畫,或者背景圖建議直接使用UITexture
2、貼圖各種屬性
Read/Write可讀可寫:只有打開這個開關,纔可以對貼圖使用Texture2D.GetPixel,讀取或改寫貼圖資源的像素,但這就需要系統在內存裏保留一份貼圖的拷貝,以供CPU訪問
Generate Mip Maps多重紋理格式:包含兩張貼圖,遠的用小的貼圖,近的用大的貼圖。這樣能減少傳輸給GPU中的數據和減少渲染,是犧牲內存換區CPU&GPU,但不能用於UI,因爲它沒有遠近之分
Occlusion Culling遮擋剔除:其實就是當某個物體在攝像機前被另外一個物體完全擋住的情況,擋住就不發送給GPU渲染,從而直接降低DRAW CALL。不過有些時候在CPU中計算其是否被擋住則會很耗計算,反而得不償失
3、貼圖的壓縮
1)必須符合以下條件才能壓縮:圖片的長寬爲2的冪次方、沒有透明通道、沒有光照
2)非GPU支持的紋理格式,需要經過CPU解碼;而GPU支持的紋理格式,GPU直接解碼和顯示,GPU的解碼有很多優化,隨機訪問、快速尋址和並行解碼等,因此效率高得多
3)在ios設備上,建議選擇PVR格式。wp8和win8設備上,DXT格式。android設備,不透明貼圖選擇通用支持的ETC格式;而透明貼圖,4大GPU廠商各自有自己的壓縮格式,可以選擇RGBA16
4)貼圖建議做成方形的,一般不要超過1024x1024,否則可能出現紋理丟失現象
5)參考http://blog.sina.com.cn/s/blog_930ffa0b0102vass.html
4、圖集的處理
1)圖集製作方式:方法1-NGUI; 方法2-代碼:Texture2D.PackageTextures()這個API可以自動將你的幾張貼圖合併爲一張大圖
2)那些重複性比較高的圖片最好打成圖集
5、優化建議
1)如果你用U3D自帶的SHADER,在表現不差的情況下選擇Mobile或Unlit目錄下的。它們更高效
2)儘可能共用材質
3)將不需要移動的物體設爲Static,讓引擎可以進行其批處理
4)儘可能不用燈光,移動端優化可以採用用光照貼圖(Lightmapping)去烘培一個靜態的貼圖,以代替每次的光照計算
5)確保不要讓不必要的貼圖素材駐留內存
6)降低貼圖素材分辨率,前提是不影響我美術效果
7)如果你需要通過腳本來控制單個材質屬性,需要注意改變Renderer.material將會造成一份材質的拷貝。因此,你應該使用Renderer.sharedMaterial來保證材質的共享狀態
6、優化算法