導航:首頁 > 文件處理 > 游戲首次紋理壓縮

游戲首次紋理壓縮

發布時間:2024-09-29 16:31:39

A. 紋理壓縮簡介 DXT PVR ETC

參考
為什麼需要紋理壓縮
移動端紋理壓縮格式
干貨:Unity游戲開發圖片紋理壓縮方案
Creator使用壓縮紋理
常用紋理和紋理壓縮格式
移動設備的紋理壓縮方案
各種移動GPU壓縮紋理的使用方法

在軟體開發,特別是三維應用中,紋理隨處可見,但受限於網路環境和硬體能力,紋理也是一大瓶頸。而且在一般的三維應用中,紋理所佔大小基本都會在1/2以上,模型中往往超過2/3。或許你會說,紋理不就是一張圖嗎,有那麼重要嗎?如下兩張對比圖,可能你會認為前者逼格高,但對於正常人而言,後者顯然要好很多。正是有了紋理,如同在骨架上賦予了皮膚,讓我們的應用更加的逼真,貼近現實。

而你能想像到嗎?如上的模型一共有三張紋理,其中之一效果如下:

紋理的拼接是紋理壓縮的開始,採用不同的壓縮方式對紋理最終的大小影響也是顯著的。比如上面的這張紋理在不同壓縮格式下的大小差別也是非常顯著的(原始文件為tga格式,通過Photoshop轉換為其他格式,默認選項):

不同於png、jgp這種硬碟壓縮方式而言,DXT,ETC等紋理壓縮方式可以在游戲運行中無需CPU解壓就被GPU直接采樣,可以極大的減少內存和帶寬的佔用,提升運行效率,對移動游戲而言更是如此。

1.DXT

DXT是一種有損紋理壓縮演算法,微軟的Direct中支持,DXT的格式包括DXT1~DXT5,其中DXT1和DXT5較為多見,後面會做詳細討論。可以說DXT是目前應用最廣泛的紋理壓縮格式,可以認為所有的PC端顯卡都支持DXT壓縮,維基網路記錄,該專利有效期到2017年10月2號。

DXT演算法非常容易理解,而且整體看上去效果不錯,但如果對局部特寫,會發現在細節上會有很多丟失,這也是演算法本身導致的,畢竟每個塊只有兩個顏色,而其他顏色都是在這兩個顏色區間的差值,如果當前區域內還有其他顯著顏色則必然會有丟失。

另外一個問題就是DXT3和DXT5之間的對比,相比DXT1不支持透明度(但支持是否透明),DXT5要大一倍(多了64bit),和之前顏色保存方案一樣對透明度也保存了兩個16位的顏色和對應的調色板,對RGBA的效果也得到了保證,但DXT3思路不一樣,它是對每一個像素保存了4bit的透明度,同樣也是多了64bit,但此時畢竟只有16個透明度選項,相比DXT5,在壓縮率上相當,但對透明色的處理不夠細膩,因此在實用性上並不推薦DXT3。

盡管DXT在細節上有明顯硬傷,在總體效果不錯,而且確實是一種強大的壓縮方式,所以在多數紋理壓縮選擇中都是最佳方案,幾乎可以認為是PC下的標准壓縮格式。

2.PVR&ETC
也許是出於專利和商業角度,也許確實DXT在移動端確實無法滿足要求,DXT並沒有在移動端得到很大的支持,相反,在iOS設備中支持的是PVR壓縮,在Android中支持的是ETC壓縮。

DXT在細節上缺陷明顯,最重要的原因是當把紋理分為4*4像素的區域塊後,每個塊之間都是獨立的,盡管這極大的簡化了壓縮演算法,但卻丟失了相鄰塊之間這種普遍的相似性。這是演算法本身導致的,而PVR則會考慮該區域塊對應的右側,下側和右下側的三個區域塊的關聯性。

從現實的角度來看,受制於專利和硬體廠商,我們並沒太多選擇的餘地,Android下就要用ETC,iOS下只能PVR,而在PC上不用DXT估計就要被嘲諷了。但這也是一個很棘手的問題,比如在WebGL下,特別是Android下差異化很大,是否支持紋理壓縮,甚至在同一個設備不同的瀏覽器,因為驅動的不一致,可能系統自帶的會支持ETC壓縮,而微信等QQ瀏覽器下並不支持。而且華為的手機貌似在瀏覽器級別下都不支持ETC(硬體支持,還是驅動的問題)。而如果在移動設備上不用壓縮,顯存是有限的,除非你在數據量上做出犧牲,怎麼解決都很矛盾,相比而言,iOS下則要舒服很多。

Unity官網對每個平台默認的紋理壓縮格式以及使用建議給出了 詳細描述 ,需要注意的是:在不同移動GPU平台下選擇GPU支持的壓縮紋理,就可以在不需要CPU解壓的情況下直接被GPU采樣,節省CPU內存和帶寬,也可以節省存儲的體積。 如果目標平台不支持設置的壓縮格式,紋理將解壓為RGBA32或者RGB24,浪費CPU時間和內存

參考 幾種主流貼圖壓縮演算法的實現原理
從IOS9(A8架構)Apple 手機開始支持ASTC壓縮格式 ,如果考慮放棄Apple 6代之前的手機兼容問題了,可以直接使用了。相對於PVRTC2/4而言,ASTC(4X4)的壓縮比會增加到0.25,不過顯示效果也會好很多,而且不需要把圖片設置為方形。

Using ASTC Texture Compression for Game Assets 說明的比較詳細,也給出了一些使用上的建議,即針對不同貼圖類型給出不同的壓縮方案。

1. laya問答 H5游戲能使用壓縮紋理(ETC,PVR等)嗎?
Q:H5游戲能使用壓縮紋理(ETC,PVR等)嗎?
A:部分瀏覽器會不支持(比如safari)
Q:那laya裡面能根據不同瀏覽器(或不同平台)使用不同壓縮格式的紋理嗎?
A:你自己是可以獲取到當前是哪個瀏覽器的,自行處理即可

2. LAYA Runtme目前支持 ETC/DXT或者PVR這類格式嗎?在文檔中沒有找到這類的說明
LayaAir目前暫時還不支持ETC/DXT/PVR這類格式!關注layaAir的版本引擎更新日誌即可,支持了我們會及時告知!

3. Egret 內存分析-RES載入資源後存在雙份內存無法釋放的問題
支持pvr、etc已經在計劃中。

B. 一個操作讓游戲內存立減50+%-CocosCreator性能優化之壓縮紋理

在游戲中,紋理不僅占據大量的包體,也占據了大量的內存。傳統的圖片壓縮格式(如JPEG、PNG等)雖能減少資源大小,但是不能被GPU直接識別,還是需要先載入到內存通過CPU解碼,轉換成RGB/RGBA等能被GPU識別的格式,才能傳送到GPU進行渲染。

為避免這些問題,壓縮紋理,指的是一種針對GPU的紋理壓縮方案,使紋理能夠直接被GPU識別並進行渲染,它具有以下優點。

傳統的圖片壓縮主要目的是 存儲 和 傳輸 ,為了盡可能的高效壓縮,使用了可變的壓縮比率,因此在解壓時需要解壓更多的像素位才能讀取某個像素的位置,不適合隨機和快速讀取,也發揮不了GPU的並行處理優勢。

而壓縮紋理使用一個固定的壓縮比率,將紋理劃分成多個像素塊,每個像素塊包含 2*2 或 4*4 個像素,然後對每個像素塊進行壓縮,被壓縮的像素信息存儲在一個像素集合中,每個像素塊的索引位置存儲在一個塊索引圖中。讀取時,首先將紋理坐標轉化為塊索引值,然後在像素集合中查找對應的像素塊,最後在這個像素塊中找到紋理顏色值。

因為採用了固定的壓縮比率,GPU內部可以並行處理,從而快速的解壓縮。與之相對的是,紋理的壓縮過程發生在程序運行之前,並不在意編碼速度,因此在壓縮時會遍歷所有可能性,找到和原始像素差值最小的編碼,這也是紋理壓縮耗時較久的原因。

順便說一下,普通圖片格式中,PNG是無損壓縮,JPEG是有損壓縮。而壓縮紋理都是有損壓縮,只是在絕大部分情況下,手機上看不出來而已。

手機上使用壓縮紋理依賴於OpenGL ES的支持,OpenGL ES 2.0本身並沒有定義任何紋理壓縮格式,它僅提供 glCompressTexImage2D() 方法供應用程序上傳壓縮紋理,壓縮紋理的格式由各個GPU廠商定義和實現。

OpenGL ES 3.0提供了壓縮紋理標准,使各個平台都可以使用同一種壓縮紋理,但市面上的設備還需要很長時間才會全部過渡到OpenGL ES 3.0。因此,仍然需要對不同的平台和設備使用不同的壓縮紋理格式。

手機游戲中常用的有以下格式。

ETC1把 4*4 的像素塊壓縮成固定的64位編碼(8個位元組), 4*4 像素塊是16個像素,每個像素4位元組,一共佔64個位元組,所以壓縮比是 64/8=8。但是ETC1隻能存儲RGB信息,不適用帶透明度的紋理,為解決這個問題,Creator在ETC1文件中額外寫入了透明度信息,即ETC1+A格式,它的壓縮比是 64/16=4。
ETC1/ETC1+A需要OpenGL ES 2.0(對應WebGL 1.0)環境,目前幾乎所有Android手機都支持ETC1,但是iOS不支持。
ETC1/ETC1+A紋理的長寬可以不相等,但要求是2的冪次方。

ETC2是ETC1的擴展,壓縮比率一樣,但壓縮質量更高,而且支持透明通道,能完整存儲RGBA信息。
ETC2需要OpenGL ES 3.0(對應WebGL 2.0)環境,目前還有不少低端Android手機不兼容,iOS方面從 iPhone5S 開始都支持OpenGL ES 3.0。
ETC2和ETC1一樣,長寬可以不相等,但要求是2的冪次方。

Creator中常用的是PVRTC4+A,壓縮比和ETC一樣,iOS全系列支持,但是Android不支持。另外PVR要求紋理長寬相等(正方形)且是2的冪次方,例如 1280*720 的PNG圖片,轉換後變成 2048*2048 ,這一點會大大增加內存消耗。在實測中還發現轉換後的圖片質量不如ETC1,存在模糊、毛邊現象,對畫面要求高的游戲不適合。

壓縮紋理的使用非常簡單,根據構建平台添加需要的格式即可,具體參見Creator官方文檔,本文不再重復了。

Creator編輯器還提供了轉換壓縮紋理的選項,根據轉換速度分為Fast、Slow等好幾檔,速度越慢則畫面質量越好。但不管選哪個,隻影響顯示效果和轉換時長,顯存佔用都是一樣的。一般情況下,顯存佔用就是壓縮紋理的文件大小,例如文件大小是1.5M,則它佔用的顯存也是1.5M。

在設置壓縮紋理格式時,目前Creator 2.x版本還需手動一個一個設置。如果想一次性設置所有或部分資源,自己寫個腳本遍歷修改對應的 .meta 文件也比較方便,這里是一個我寫好的腳本 一鍵自動化設置壓縮紋理格式

在實際項目中的測試結果是,單圖、自動圖集、TexturePack合圖加起來超過兩千張圖片的Creator工程,使用PNG時打出來的apk包大小近500M,內存佔用1.3G。採用壓縮紋理後,包體大小降到150M,內存佔用降到600M。

C. 玩游戲的時候線條會變成一段一段的 我用的是N卡 玩坦克世界的時候也是這樣 車上的鐵絲遠了也會變成這張圖

按ESC→設置→圖像→第四行 「反鋸齒處理」 X2 X4或是X8,越高效果越好,也越耗費系統資源,一定要量力而行。

其他圖像配置
建議全屏幕游戲 解析度為屏幕解析度,垂直同步 關
紋理質量 中 (調成低的話 坦克 建築什麼的真的很難看,看你自己的取捨了)
紋理壓縮 開 (關閉紋理壓縮 可以讓你的 紋理質量達到極致,奢侈的東西)
紋理演算法 X2 (使 「 接近 與你視線平行的面」紋理的清晰度,奢侈的東西,)
陰影質量 關 (低就是 坦克陰影數量少 高就是多,反正調成低 也就只能顯示自己的陰影 乾脆關了)
陰影效果增強 關 ( 樹 等 物體陰影 會體現在你的 坦克上 ,奢侈的東西 )
水的畫質 中 (中即可)
模擬水紋 開 (模擬水面有些許波紋的反光效果)
樹的畫質 低 (沒用 調低)
灌木叢密度 關 (地上 沒有用的 雜草叢,除了 擋視野外沒其他用處)
高級後期渲染 關 (會模擬 開鏡後 的 焦距模糊,必關)
後期渲染 關 (光暈 效果, 沒有必要的 )
視野距離 高(必須高 不然遠處的敵人被點亮 也看不到輪廓)
log 高 (這個 是 模型 和 貼圖 精細度衰減 這個要是低了 其他的都是高 也沒用)
附加效果 低 (開炮 和 炮彈落地的 煙霧, 高了就像是被扔了煙霧彈,不過至少是低)
狙擊模式效果 關 (必須關!不管你什麼顯卡都能卡死你!)
下面三項 除履帶印記 全不選

其中有一些 像後期渲染 都可以看配置 適當調整。

閱讀全文

與游戲首次紋理壓縮相關的資料

熱點內容
有什麼辦法翻錄加密視頻 瀏覽:666
java數據結構與演算法面試題 瀏覽:977
解壓不了是什麼意思 瀏覽:359
紐西蘭編程師年薪 瀏覽:321
程序員為什麼大多生閨女 瀏覽:51
c編程用英文還是中文 瀏覽:723
一點都不解壓的游戲 瀏覽:203
解壓為什麼不能用中文文件夾 瀏覽:615
伺服器如何解除備份 瀏覽:144
安卓手機為什麼用一年就變卡 瀏覽:11
如何用風變編程自動回復 瀏覽:512
安卓閱讀幣怎麼樣 瀏覽:437
京東app怎麼切號 瀏覽:583
進入傳奇伺服器後如何修改 瀏覽:42
m0單片機的cycle怎麼知道 瀏覽:806
linux命令太長 瀏覽:782
壓縮機nb1111y是多少w 瀏覽:45
打賞視頻用什麼伺服器好 瀏覽:154
方舟好友伺服器怎麼加mod 瀏覽:982
javaresponse設置編碼 瀏覽:842