導航:首頁 > 源碼編譯 > unity3d圖片壓縮演算法

unity3d圖片壓縮演算法

發布時間:2023-01-31 19:35:36

『壹』 unity圖片壓縮格式和內存計算

例子2:使用RGB ETC 4bit壓縮,佔用內存 = 0.5Bytes 512 512 = 128KB

一、2的N次方大小的圖片會得到引擎更大的支持,包括壓縮比率,內存消耗,打包壓縮大小,而且支持的力度非常大。

二、減小圖片的佔用大小和內存方式有:圖片大小變化(Maxsize),色彩位數變化(16位,32位),壓縮(PVRC)。

三、U3D對於圖片的格式是自己生成的,而並不是你給他什麼格式,他就用什麼格式,一張1024 1024圖在無壓縮格式下,它會被U3D以無壓縮文件形式存放,也就是說U3D里的Texture Preview里顯示的佔用大小 *MB不只是內存佔用大小,還是空間佔用大小

U3D的內部機制為自動生成圖片類型來替換我們給的圖片,在圖片的壓縮方式上需要進行謹慎的選擇。

壓縮格式在U3D的Component Reference里有介紹我就不再詳細介紹,只介紹幾個重點的:

RGBA32格式為無壓縮最保真格式,但也是最浪費內存和空間的格式。Automatic Turecolor和它一個意思。

RGBA16格式為無壓縮16位格式,比32位節省一半的空間和內存。Automatic 16bits和它一個意思。

RGBA Compressed PVRTC 4bits格式為PVRTC圖片格式,它相當於把圖片更改了壓縮方式新生成了一個圖片來替換原來的我們給的圖片格式(比如我們給的是PNG格式)。

注意:U3D所有圖片的壓縮格式都會以另一種方式來存儲,不會以你給的方式來存儲,只有你指定了某種格式,它才會轉成你要的格式。而且壓縮格式在Android里並不一定有效,因為Android的機型多,GPU的渲染方式也不一樣,有的是Nvidia,有的是PowerVR,最最好的在安卓機子上啟用RGBA16方式,因為這個是適應所有機型的,並且比32位佔用量少一半,但也需要因項目而異,只是推薦使用的格式,可以多用,但要權衡內存和顯示效果。

『貳』 有關圖片壓縮整理

有損壓縮:是指對圖像的壓縮過程中,演算法丟失一部分圖像信息,降低了圖像的質量,並且這種損失是不可逆的。有損壓縮可以減少圖像在內存和磁碟中佔用的空間。使用有損壓縮的圖片如果在屏幕上顯示,可能肉眼看起來影響不大,但如果用高解析度列印機列印出來,那麼圖像質量就會有明顯的受損痕跡

無損壓縮:是指對圖像的壓縮過程中,不丟失圖片原本的信息,任何時候都可以從無損壓縮過的圖片中恢復出原本的信息;無損壓縮雖然能減小圖像佔用磁碟的大小,但不能減少圖像佔用的內存空間,因為實際的顯示過程中,看圖軟體會先把圖片還原成原本的信息。無損壓縮能較好的保存圖片質量,但壓縮率較低

索引色:用一個數組來代表一種顏色,在存儲圖像的時候,存儲一個數字的組合,同時存儲數字到圖像顏色的映射。這種方式只能存儲有限種顏色,通常的用法是256種顏色

直接色:使用四個數字來代表一種顏色,這四個數字分別代表顏色中的紅色R、綠色G、藍色B以及透明度A。所以直接色可以表示2^32種顏色。當然,並非所有的直接色都直接這么多種變化,為壓縮空間,可能有多種設定

點陣圖:也叫點陣圖,象素圖。構成點陣圖的最小單位是像素,點陣圖就是由像素點陣列的排列來實現其顯示效果。點陣圖縮放會失真

矢量圖:也叫做向量圖。矢量圖並不記錄畫面上每一點的信息,而是記錄元素的形狀以及顏色的演算法,當你打開一副矢量圖的時候,軟體對圖像對應的函數進行運算,將運算結果顯示給你看,無論顯示畫面是大還是小,畫面對應的演算法是不變的,所以對畫面進行倍數相當大的縮放,其顯示效果仍然相同(不失真)

介紹了這些,那麼我們來看看我們經常見到的圖片的一些特性

JPEG 有損,直接色,點陣圖 ;BMP 無損,直接色,點陣圖;PNG-8 無損,索引色,點陣圖;PNG-24 無損,直接色,點陣圖

為什麼png還有多種樣式?那是因為PNG演算法在把圖像轉化成圖片的時候有很多參數和方式可以選擇,這些參數和方式就決定了圖像的壓縮和成像品質

Android平台默認支持格式:JPEG、PNG、GIF、BMP 和 WebP

iOS平台默認支持格式:JPEG、JPEG2000、PNG、GIF、BMP、ICO、TIFF、PICT、APNG、SVG、RAW

既然Android和iOS支持這么多圖片格式,那麼游戲中為什麼沒有」直接」使用JPEG或者PNG這兩種都支持格式呢?下面進行下原因的分析

常見的圖片文件格式,比如PNG,JPG,BMP等,是圖像為了存儲信息而使用的對信息的特殊編碼方式。它存儲在磁碟中,或者內存中,但是並不能被GPU所識別。這些文件格式當被讀入後,還是需要經過CPU解壓成bitmap,再傳送到GPU端進行使用。

一般在游戲中,有很多透明物件,而JPEG不支持透明度,所以沒法使用

PNG格式支持透明度,但是因為PNG的壓縮演算法是根據圖片整體進行壓縮(比如採用霍夫曼編碼),像素和像素之間存在依賴關系,無法直接實現單個像素級別的解析,這就沒辦法發揮顯卡的優勢

間接定址

上圖為間接定址模式中獲取顏色數據的過程:GPU首先請求載入索引數據14;一旦有了索引數據就可以立即載入實際顏色值,來回四次最終得到顏色值。索引數據可能為FIFO緩沖區引入了性能隱患,晶元端保存顏色表的代價也十分大,顏色表可能和紋理緩存占的空間接近;所以最好避免使用顏色表這些全局數據。

無論是JPEG或者PNG 的圖片最終在顯卡解碼之後,都是RGBA紋理,(寬*高*4)無法減小顯存的佔用(256×256像素的圖片,雖然文件格式、磁碟佔用、內存佔用大小不一樣,但都是佔用256Kb的顯存空間,性能消耗大)

jpeg和png圖片,從文件載入的時候都必須先在cpu先解碼成原始的RGB(A)格式的數據

紋理壓縮之後佔用顯存減少,一種比較簡單的統計方案。你直接查看紋理壓縮文件的大小就好了,比如紋理壓縮文件是170k,那顯存佔用也是170k

正是因為傳統的圖片並沒有考慮顯卡的這種特性,所以很難滿足三維應用中的要求,要滿足顯卡能使用的紋理格式,應該具有以下特點:

在紋理操作中,讀取紋理數據是關鍵步驟,所以解碼速度至關重要,這一點是最應該考慮的

能快速的隨機讀取任意像素,因為顯卡中很多操作都是針對單個像素執行的,所以這一點也很重要

既要保證一個不錯的壓縮效果,也要把紋理損失控制在一定范圍內

通常紋理壓縮在渲染前已經提前准備好,所以如果壓縮的速度比解析速度慢,也是可以接受的。

說明:Unity在導入圖片後,編輯器會卡住彈出一個進度條窗口,就是使用原圖進行紋理壓縮然後生成新的圖片文件的過程。生成的文件的位置,你可以根據導入圖片對應的.meta文件內的guid,去項目中的Library文件夾中查找,Unity打包圖片的Assetbundle其實是根據這個文件來打包的,這已經不是你導入的那張原圖

紋理壓縮不同於其他圖片壓縮方式(jpg,png),在使用中,不會在CPU中進行解壓縮,而是直接把壓縮內容傳給GPU,而且在GPU中也不會一次把整張圖片進行解壓縮,只會在需要采樣特定區域的紋理時對這一區域的紋理進行解壓縮。

為了滿足以上4點,圖形工程師開發了很多種紋理壓縮格式,目前移動設備主流的紋理壓縮格式有PVRTC、ETC/ETC2、ASTC,當然,還有其他的類型(比如:RGBA32、RGBA16、Alpha8等有興趣的可以去了解下)

紋理壓縮格式不需要CPU解碼

ETC/ETC2紋理壓縮格式

說到ETC ,就要說到OpenGL ES,OpenGL ES 是 OpenGL 三維圖形 API 的子集,針對手機、平板和游戲主機等嵌入式設備而設計. OpenGL ES2 支持ETC 格式,所以我們可以在支持OpenGL ES2的顯卡的設備上使用ETC這種紋理壓縮格式;而ETC2 則需要OpenGL ES3才能支持,而OpenGL ES3已經發布了三四年,所以現在市面上的顯卡都支持,也就是說,現在市面上的移動設備都支持ETC2這種紋理壓縮格式了,可以放心使用了;

ETC不支持透明通道,所以以前很多項目的做法是用2張紋理來保存一張圖片。ETC+Alpha8的組合形式,然後用自定義Shader合並。不過現在基本淘汰,可以直接使用ETC2代替。

Alpha壓縮率適用機型

ETC1N6:1OpenGLES 2.0支持幾乎所有市面上的Android機,所有iPhone

ETC2Y6:1OpenGLES3.0支持大部分高端Android機,iPhone 5S及以上

PVRTC紋理壓縮格式

iPhone的圖形晶元(PowerVR MBX)對 PVRTC 的壓縮提供硬體支持,Apple推薦在開發iPhone應用程序時使用 PVRTC 壓縮紋理格式。而且,根據圖像成圖質量以及佔用內存等,有多種格式可選擇(pvtrc_rgba2,pvrtc_rbga4等);缺點是需要圖片的長寬相等而且為2的冪次方(針對這種情況,可以考慮把圖片打包在一張2的冪次方圖集內)

支持的Android機型需要GPU為 PowerVR系列

在實際游戲引擎內(以Unity為例),圖片顯示流程大概是:原圖 —> 紋理壓縮(ETC/ETC2等)—>OpenGL ES3—>顯卡—>游戲內顯示;

而一張圖片在游戲引擎中運行時佔用的顯存大小,與這種圖片本身佔用磁碟大小無關,只和圖片的寬和高相關;

圖片導入到Unity引擎中,之所以很慢,是因為在進行紋理壓縮編碼生成新的文件,這一步很耗時間;

AssetBundle打包圖片,不是打包原圖,而是針對你對圖片設置的紋理壓縮格式而生成的新的文件打包,所以ab文件的大小也和原圖本身佔用磁碟大小無關;

AssetBundle文件的大小與載入成正比關系,同時,紋理壓縮格式的解碼時間也有差異(差異不是很大)

平台的最佳紋理壓縮格式是:astc_rgba_4x4 它兼顧了成像質量,內存佔用,ab大小,解碼時間,跨平台等因素

『叄』 一張圖片放到Unity3D中為什麼會變大許多

存儲容量是存儲格式的容量
資源容量是資源格式的容量

肯定是某種存儲格式的容量,jpg或者png之類的。4M,八成是 貼圖資源格式RGBA的容量。
資源格式可以直接對應到數據結構,在內存或者顯存中使用。存在文件類型里的都是存儲格式,資源格式可以作為存儲格式使用,反之不一定行
存儲結構適合傳輸,不止是硬碟。資源結構指的是內存或顯存,適合計算。
png jpg 這種結構 都不適合這個計算,所以沒有硬體使用這種結構來做貼圖

那為什麼我選compress要比RGBA占內存小?
因為壓縮比例不一樣

『肆』 unity 圖片里formart下compressde和truecolor的區別

個人理解就是Compress是Unity用自帶的圖片壓縮演算法(Compress是用RGB Compressed ETC4 演算法壓縮的)重新壓縮一遍圖,Truecolor是用RGB 24bit 壓縮演算法處理導入的圖片

如果想要導入的圖片小(直接影響輸出的程序安裝包大小),對清晰度要求不大,可以用compressed,如果是UI界面的圖片等要求清晰度高的,建議用TrueColor。

『伍』 unity圖集在ios下需要壓縮嗎

沒硬性規定說要遵循2條件遵循沒
1 圖片要2冪比128X128, 256X256128X256 ,512X512等等遵循沒UNITY3D自幫調整2冪

2 圖片越數據量越所要盡量控制影響效前提越越WINDOWS圖片支持4096X4096IOS支持2048X2048IOS屏幕像素沒所圖片太沒意義拜拜浪費電腦資源

『陸』 【Unity】圖片壓縮的解決方案

公司做的項目需要拍照生成精靈,流程是客戶端先拍照,壓縮後上傳給伺服器,然後由伺服器的圖像識別演算法進行生成裁剪後的精靈與精靈身上的器官坐標點。

問題來了,客戶端拍出來的照片太大,普遍是2M-5M,所以客戶端拍出來的照片需要經過壓縮才能上傳給伺服器。

在網上尋找圖像壓縮的解決方案,最終暫定有三種方案:

第一種方案
由於PC端運行時用的是DGI圖像介面,不能調用System.Drawing庫,所以暫時否定第一種方案

第二種方案
理論
第三種方案由於需要付費,並且伺服器穩定性不可控,暫定為優先順序最低的方案,目前正在研究第二種方案

『柒』 (轉)Unity 圖片壓縮技巧

轉自 移動設備壓縮紋理使用技巧

壓縮紋理能夠節約不少內存空間,因此目前項目中UI全都是用Texture Packer打包出大圖之後壓縮。Unity導入紋理的默認設置是compress,在符合條件的情況下會優先使用PVR或ETC、否則會降為RGBA4444。從程序的角度來說,當然是1/4大小的壓縮紋理更好啦~但是,畢竟是有損壓縮,會帶來一定的損失,有時候還是挺郁悶的。

第一個常見的問題是漸變顏色區域經過壓縮之後會出現色階,如下圖所示。我參考了dither思路,用Photoshop加了一層0.3%的高斯分布雜音;可以看到ETC和PVR都有所改進,但是仔細盯著看依然能看到一些雜訊。

另一個很常見的問題就是有雜色(下圖綠色部分),本質是在某些block里邊界混合了…解決方法就是非常粗暴的放大解析度,可以看到當放大到2x大小的時候就完全沒問題了。這個事情桌子很早也和我提過,壓縮紋理的UI部分最好放大一些,當超采樣來用…

順便再提一句就是,新版本的Texture Packer里有了polygon布局,還能扣洞真是excited…

ps. 最早我們使用的是將原始圖片拆分成RGB和Alpha Mask兩張圖的策略,然後替換默認的UI Shader。但是Unity-5.2開始默認將ETC2設為默認(順便支持了ETC1 Compression for Sprite Atlases),所以我就懶得切圖+每個Sprite拖材質球了…直接一張RGBA進行壓縮完事兒

閱讀全文

與unity3d圖片壓縮演算法相關的資料

熱點內容
什麼app是分享教育的 瀏覽:896
可視化編程java 瀏覽:83
人工智慧溫控器演算法 瀏覽:376
大號文件夾多少錢一個 瀏覽:572
pdf閱讀器打開文件 瀏覽:98
winrar解壓日文文件 瀏覽:38
什麼app可以看廣東珠江電視台 瀏覽:75
linux移動文件位置 瀏覽:144
循環碼與卷積碼編譯原理 瀏覽:807
進化演算法和啟發式演算法的區別 瀏覽:602
android組件是什麼 瀏覽:973
安卓手機微信怎麼同步信息 瀏覽:181
小人pdf 瀏覽:806
我的世界伺服器怎麼造好看的建築 瀏覽:307
兄弟連培訓php多少錢 瀏覽:250
1523鋪地面的演算法 瀏覽:747
linux源碼安裝php環境 瀏覽:822
ping命令用法 瀏覽:718
日本海軍pdf 瀏覽:469
哪個app有大臉特效 瀏覽:141