貼圖、圖集的處理

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、優化算法


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章