使用 RGBA4444 與 Dithering 減少記憶體用量
在 2D 遊戲中,圖片一向在消耗的記憶體中占用最大的比例。尤其在記憶體資源寶貴的行動裝置上,為了減少記憶體使用量,縮減圖片的大小常常是最有效的方法。
大部份的遊戲會使用材質(zhì)壓縮 (texture compression) 來縮小圖片的記憶體用量,而在這篇文章中,我會介紹另一種方法:使用 RGBA4444 的材質(zhì)格式,並配合 dithering 維持圖片品質(zhì)。
關(guān)於圖片壓縮
一般我們常用的圖片格式是 JPEG 或 PNG,這兩種都是已經(jīng)壓縮過的圖片格式,而且壓縮率算是相當(dāng)好。然而它們所使用的壓縮演算法並不適用在即時繪圖的場合中,因此當(dāng)遊戲引擎要畫出 JPEG 或 PNG 圖檔時,會先把每個像素解壓縮至記憶體中,而無法節(jié)省記憶體空間。
為了解決圖片占用過多記憶體的問題,顯示卡晶片廠商提供了材質(zhì)壓縮的功能。只要在記憶體中存入特定格式的壓縮圖片,顯示卡晶片可以在取出像素的同時動態(tài)解壓縮,而不需要把整張圖片解壓縮,這麼一來就可以節(jié)省空間了。
在行動裝置上,常見的材質(zhì)壓縮格式如下:
- ETC1:OpenGL ES 2.0 標(biāo)準(zhǔn)所規(guī)定的壓縮格式,不支援 alpha channel,但幾乎所有裝置都支援這種格式。
- DXT:桌機或遊戲機上常用的壓縮格式,由 NVIDIA 的 Tegra 晶片使用。
- ATITC:由 ATI 提出的壓縮格式,由 Qualcomm 的 Adreno 晶片使用。
- PVRTC:由 Imagination Technologies 提出的壓縮格式,主要由 PowerVR 的晶片使用。(iPhone/iPad 或 PS Vita 都使用 PowerVR 的顯示晶片)
使用材質(zhì)壓縮可以有效地縮減記憶體用量,其壓縮率達 1/4 至 1/8 之間。但這並非完美的解決方案,其問題如下:
所幸,當(dāng)材質(zhì)壓縮遇到困難時,我們還有一些別的方法。
使用 RGBA4444
然而為了節(jié)省記憶體空間,繪圖 API 通常提供了 RGBA4444 這種材質(zhì)格式--每個色彩通道僅使用 4bit 來儲存資料,占用的記憶體即為原本 8bit 的一半。
使用 RGBA4444
在 Unity 中,只要選取一張圖片,即可設(shè)定它的材質(zhì)格式。然而,若直接設(shè)定為「RGBA 16 bit」,雖然占用空間減為一半,但會出現(xiàn)明顯的顏色誤差。這現(xiàn)象在鉛筆頂面尤其明顯,因為人眼的感光細胞對綠色特別敏感,很容易就發(fā)現(xiàn)原本的漸層色都跑掉了,變成一階一階的綠色。
我們可以用 dithering 來消除這種現(xiàn)象。
Dithering
Dithering 意指把不同顏色的像素交錯排列以營造出混色的錯覺。在以往記憶體極小,螢?zāi)伙@示色數(shù)又只有 256 甚至 16 色的時代,遊戲幾乎都會使用 dithering 提高畫面的品質(zhì)。右圖就是 dithering 的例子,這張圖片只用了黑百兩色,但運用交錯排列的效果營造出灰色漸層的錯覺。
我們可以應(yīng)用同樣的原理來處理圖片,我這邊使用的是?GIMP?這套強大的影像軟體,搭配?16-bit dither script?外掛。這些工具都可以免費下載使用。
?
安裝好之後,使用 GIMP 打開圖片檔,選擇「圖片」→「模式」→「Dither to ARGB4444」即可進行 dithering。處理後的圖片如下:
經(jīng)過 dithering 後的圖片和原始圖幾乎看不出差異了,而占用的空間也能縮減至一半。
結(jié)語
原則上,若材質(zhì)壓縮沒有太大的問題時,就應(yīng)該使用材質(zhì)壓縮,因為它能最有效地節(jié)省記憶體。然而遇到跨平臺或是需要 alpha channel 時,使用 RGBA4444 搭配 dithering 則是很優(yōu)秀的方案,尤其現(xiàn)在 retina display 相當(dāng)流行,因為在 ppi 超過 300 的螢?zāi)簧蠋缀蹩床坏?dithering 的顆粒,它看起來和原始圖片是一模一樣的。
總結(jié)
以上是生活随笔為你收集整理的使用 RGBA4444 與 Dithering 減少記憶體用量的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python123平台作业答案第十二周_
- 下一篇: Windows XP SP3 无需密匙即