Unity圖片優(yōu)化-Dither算法(RGBA16優(yōu)化)

在unity開發(fā)過程中疾捍,游戲圖片占用了很大一部分的手機內(nèi)存。所以在游戲開發(fā)中栏妖,對圖片的優(yōu)化也至關(guān)重要乱豆。

在Unity中常用的的圖片格式有RGBA32,RGBA16底哥,ETC咙鞍,PVRTC等房官。這里我們主要討論帶透明通道的RGBA32和RGBA16這兩種格式的圖片在Unity占用的內(nèi)存空間已經(jīng)優(yōu)化方案趾徽。

我們知道,RGBA32是R,G,B,A四個通道每個通道用8位來表示翰守,RGBA16則是用4位孵奶。所以RGBA32能夠帶來更好的顯示效果。同時也會帶來更大的內(nèi)存消耗蜡峰。下面給兩張RGBA16和RGBA32的對比圖了袁。

RGBA32


RGBA32.png

RGBA16


RGBA16.png

從上面兩個圖可以看得出朗恳,RGBA32能夠帶來更好的顯示效果。而RGBA16在有些地方的色階太明顯载绿,導(dǎo)致顯示效果不盡人意粥诫。由此keijiro(Github地址)寫了一個dither算法來消除這種色階,以達到高于RGBA16低于RGBA32的顯示效果崭庸。

下圖為Dither優(yōu)化之后的RGBA16

RGBA16-Dither.png

通過對比能明顯看出優(yōu)化后的RGBA16能夠消除色階怀浆,如果不是放大特意看,和RGBA32幾乎差別不同怕享。通過這種方式將內(nèi)存降低一半確認帶來更好的效果执赡。

萬事總會存在利弊,這個算法在消除了色階的同事函筋,帶來的是更多的噪點沙合。所以這個方法不適用于圖片需要放大來顯示的〉剩總體來說首懈,該方案在一定程度上還是能夠帶來很好的效果。
最后把算法的核心代碼貼出來 谨敛。


public class TextureImportSetting : AssetPostprocessor {

    string[] assetTexturePath = new string[]{"Assets/Resources/TextureVN/"}; //放置需要優(yōu)化的路徑
    void OnPreprocessTexture(){
        foreach (var str in assetTexturePath)
        {
            if (this.assetPath.StartsWith(str) )
            {
                TextureImporter textureImporter = this.assetImporter as TextureImporter;
                textureImporter.textureType = TextureImporterType.Advanced;
                textureImporter.npotScale = TextureImporterNPOTScale.ToNearest;
                textureImporter.mipmapEnabled = false;
                textureImporter.isReadable = false;
                if ( textureImporter.DoesSourceTextureHaveAlpha())
                {
                    textureImporter.textureFormat = TextureImporterFormat.RGBA32;
                }
            }
        }
    }
    public static void OnPostprocessRGB16 (Texture2D texture)
    {
        
        var texw = texture.width;
        var texh = texture.height;

        var pixels = texture.GetPixels ();
        var offs = 0;

        var k1Per15 = 1.0f / 15.0f;
        var k1Per16 = 1.0f / 16.0f;
        var k3Per16 = 3.0f / 16.0f;
        var k5Per16 = 5.0f / 16.0f;
        var k7Per16 = 7.0f / 16.0f;

        for (var y = 0; y < texh; y++) {
            for (var x = 0; x < texw; x++) {
                float a = pixels [offs].a;
                float r = pixels [offs].r;
                float g = pixels [offs].g;
                float b = pixels [offs].b;

                var a2 = Mathf.Clamp01 (Mathf.Floor (a * 16) * k1Per15);
                var r2 = Mathf.Clamp01 (Mathf.Floor (r * 16) * k1Per15);
                var g2 = Mathf.Clamp01 (Mathf.Floor (g * 16) * k1Per15);
                var b2 = Mathf.Clamp01 (Mathf.Floor (b * 16) * k1Per15);

                var ae = a - a2;
                var re = r - r2;
                var ge = g - g2;
                var be = b - b2;

                pixels [offs].a = a2;
                pixels [offs].r = r2;
                pixels [offs].g = g2;
                pixels [offs].b = b2;

                var n1 = offs + 1;
                var n2 = offs + texw - 1;
                var n3 = offs + texw;
                var n4 = offs + texw + 1;

                if (x < texw - 1) {
                    pixels [n1].a += ae * k7Per16;
                    pixels [n1].r += re * k7Per16;
                    pixels [n1].g += ge * k7Per16;
                    pixels [n1].b += be * k7Per16;
                }

                if (y < texh - 1) {
                    pixels [n3].a += ae * k5Per16;
                    pixels [n3].r += re * k5Per16;
                    pixels [n3].g += ge * k5Per16;
                    pixels [n3].b += be * k5Per16;

                    if (x > 0) {
                        pixels [n2].a += ae * k3Per16;
                        pixels [n2].r += re * k3Per16;
                        pixels [n2].g += ge * k3Per16;
                        pixels [n2].b += be * k3Per16;
                    }

                    if (x < texw - 1) {
                        pixels [n4].a += ae * k1Per16;
                        pixels [n4].r += re * k1Per16;
                        pixels [n4].g += ge * k1Per16;
                        pixels [n4].b += be * k1Per16;
                    }
                }

                offs++;
            }
        }

        texture.SetPixels (pixels);
        EditorUtility.CompressTexture (texture, TextureFormat.RGBA4444, TextureCompressionQuality.Best);
    }
    void OnPostprocessTexture(Texture2D texture){

        foreach (var str in assetTexturePath)
        {
            if (this.assetPath.StartsWith(str) )
            {
                TextureImporter textureImporter = this.assetImporter as TextureImporter;
                if ( textureImporter.DoesSourceTextureHaveAlpha())
                {
                    OnPostprocessRGB16(texture);
                }
            }
        }
    }
}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末猜拾,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子佣盒,更是在濱河造成了極大的恐慌挎袜,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,542評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件肥惭,死亡現(xiàn)場離奇詭異盯仪,居然都是意外死亡,警方通過查閱死者的電腦和手機蜜葱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評論 3 385
  • 文/潘曉璐 我一進店門全景,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人牵囤,你說我怎么就攤上這事爸黄。” “怎么了揭鳞?”我有些...
    開封第一講書人閱讀 158,021評論 0 348
  • 文/不壞的土叔 我叫張陵炕贵,是天一觀的道長。 經(jīng)常有香客問我野崇,道長称开,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,682評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮鳖轰,結(jié)果婚禮上清酥,老公的妹妹穿的比我還像新娘。我一直安慰自己蕴侣,他們只是感情好焰轻,可當(dāng)我...
    茶點故事閱讀 65,792評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著昆雀,像睡著了一般鹦马。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上忆肾,一...
    開封第一講書人閱讀 49,985評論 1 291
  • 那天荸频,我揣著相機與錄音,去河邊找鬼客冈。 笑死旭从,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的场仲。 我是一名探鬼主播和悦,決...
    沈念sama閱讀 39,107評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼渠缕!你這毒婦竟也來了鸽素?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,845評論 0 268
  • 序言:老撾萬榮一對情侶失蹤亦鳞,失蹤者是張志新(化名)和其女友劉穎馍忽,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體燕差,經(jīng)...
    沈念sama閱讀 44,299評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡遭笋,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,612評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了徒探。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片瓦呼。...
    茶點故事閱讀 38,747評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖测暗,靈堂內(nèi)的尸體忽然破棺而出央串,到底是詐尸還是另有隱情,我是刑警寧澤碗啄,帶...
    沈念sama閱讀 34,441評論 4 333
  • 正文 年R本政府宣布质和,位于F島的核電站,受9級特大地震影響挫掏,放射性物質(zhì)發(fā)生泄漏侦另。R本人自食惡果不足惜秩命,卻給世界環(huán)境...
    茶點故事閱讀 40,072評論 3 317
  • 文/蒙蒙 一尉共、第九天 我趴在偏房一處隱蔽的房頂上張望褒傅。 院中可真熱鬧,春花似錦袄友、人聲如沸殿托。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,828評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽支竹。三九已至,卻和暖如春鸠按,著一層夾襖步出監(jiān)牢的瞬間礼搁,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,069評論 1 267
  • 我被黑心中介騙來泰國打工目尖, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留馒吴,地道東北人。 一個月前我還...
    沈念sama閱讀 46,545評論 2 362
  • 正文 我出身青樓瑟曲,卻偏偏與公主長得像饮戳,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子洞拨,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,658評論 2 350

推薦閱讀更多精彩內(nèi)容

  • 001發(fā)現(xiàn)的問題 下午扯罐,復(fù)習(xí)資料到了,自己做題烦衣。 發(fā)現(xiàn)無論視頻還是書籍歹河,對初學(xué)者來說都是有不足的。 視頻的老師教學(xué)...
    河馬先森閱讀 174評論 0 0
  • 我們沒必要去討好身邊的同齡人花吟,說白你去討好只是為了顯擺自己朋友多启泣。討好和真心是不同的,當(dāng)你討好她做朋友的時候示辈,或許...
    杜杜_鵑閱讀 138評論 0 0
  • 2017年6月22日5時04分50秒寥茫,杭州119指揮中心接到報警稱,望江路和之江路交叉口附近發(fā)生火災(zāi)矾麻;5時05分5...
    西克覓閱讀 531評論 0 0
  • 畫符 作者:散人 有一個大戶人家纱耻,五短身材,又有錢险耀,又情人多弄喘。其中一個情人生了一個兒子,一歲時突亂到夜里就哭啼甩牺,找...
    聞思修1965閱讀 476評論 0 1
  • 鄭州哪里可以蘋果手機擴容蘑志,2018年7月iPhone 升級內(nèi)存價格表 6/6plus 到32G 1...
    小松修機閱讀 1,666評論 0 0