手機遊戲開發中如何選擇適合的紋理格式

2021-09-19 12:34:03 字數 3359 閱讀 1724

本來覺得像這樣的問題,是無法歸類的,因為不同的專案有不同的需求,但今天因為quick論壇中的乙個技術疑問貼,鉤起了我整理這篇文章的興趣

移動平台gpu壓縮文理大全

使用mali官方工具進行etc1紋理壓縮

ericsson texture compression

ios和android遊戲紋理優化和記憶體優化(cocos2d-x)

優化你的手機遊戲(沒有延遲,才是健康的)

cocos2d-x紋理優化方案的一些總結

手機遊戲開發紋理優化心得

手機遊戲開發,如何選擇和優化素材

嗯 ,我覺得已經足夠多了,並且,可能你也沒有耐心把所有鏈結看完。 至少我沒有……。

很多小夥伴其實一直不明白gpu紋理與非gpu紋理的區別,以致於我打了將近1000字,他也沒有懂為什麼jpg不能省記憶體。

常見的jpg格式,是一種檔案壓縮格式,即它能夠把畫素值,使用一種有失真壓縮的方式來儲存,這樣的體積會變得非常小。

而我們經常提到的gpu紋理格式,如pvrtc,etc等,是一種gpu壓縮格式,這種壓縮格式,檔案大小會比jpg大,但是它讀入到記憶體後,不會被解壓,而是直接送到顯示卡。 顯示卡也不會對齊解壓,而是在執行如tex2d紋理取樣指令的時候,取訪問並索取對應畫素值的內容。 這樣才能夠節省視訊記憶體和記憶體。 pvrtc、etc等,既能夠進行壓縮,同時又提供隨機訪問(即在不全部解壓的情況下,訪問指定uv座標的畫素值)能力,因此會比jpg大許多

->pvrtc

pvrtc有兩種格式,一種是pvrtc 2bp,一種是pvrtc4bp。 二者沒有本質區別,最主要的區別就是2bp表示每個畫素使用2 bit來儲存,4bp使用4bit來儲存。當然這是一種理論值,由於pvrtc還需要儲存額外的資訊以保證能夠恢復畫素值,以及提供隨機訪問能力。 所以,實際的pvrtc格式的檔案,不會是1/8和1/16這麼小。pvrtc格式讀入記憶體後,不會進行解壓,而是直接送給gpu。 gpu也不會進行解壓,從而保證了記憶體和視訊記憶體的節約。 而tex2d能夠對這種格式的紋理直接取樣。

另外,pvrtc目前有兩個大版本,pvrtc1和pvrtc2,pvrtc2對壓縮演算法做了明顯的改進。 但需要**的gpu才支援,所以,如果要使用pvrtc2版本的pvrtc紋理,記得檢查opengl es的擴充套件標記。

pvrtc建議只對ios平台使用,因為這是power vr顯示卡專用的紋理格式。

->etc

etc目前有兩種格式,etc1/etc2。 etc1是opengl es 1.x和opengl es 2.0提供的必須支援的硬體格式,其唯一的缺點就是不支援alpha通道。 而etc2是opengl es 3.0才支援的,且增加了alpha通道能力。

由於目前opengles 3.0裝置的普及率還不高,目前(寫這文章的時候是2023年7月18日)建議使用etc1格式

建議etc1格式使用在android平台上。

->png24/32

png24和32其實是一樣的,24表示alpha通道不使用,因此,這是一種rgba8888的紋理格式,這種格式不進行任何壓縮,完全保持原始畫素值。可以提供較高的質量,但這種紋理占用的磁碟空間較大。(與其記憶體占用等同),可以簡單地通過 長x寬x4來計算大小。 比如1024x1024的png24/32紋理,占用磁碟空間和記憶體為 4mb。

->png8

png8十分複雜,因為png8的意義比較多。

僅包含alpha通道的8位png:這種通常拿來提供單獨的alpha通道能力,opengl d3d等均支援這種8位alpha紋理。

通過一些壓縮方式得到的壓縮png:如grunt-png8,tinypng等, 這些工具,使用了較高的壓縮技巧,使png24/32的rgba可以儲存在8位通道中。 且能夠提供較高的還原度。 這種和png一樣,讀入記憶體後,每個畫素依然佔4bytes。

jpg是一種通過有損壓縮演算法,使原始可以以很小的檔案來儲存的格式。 這種和上面提到的png8十分類似,但jpg不支援alpha通道。 雖然不支援alpha通道,但它讀進記憶體後,記憶體占用依然是每個畫素4bytes。

另外還有一些dds,tga等,由於我個人在手機遊戲開發方面涉及這方面較少(端遊使用tga和dds較多),在此不作論述。

人生之所以糾結,在於許多事情你可以選擇

---糾結帝·麒麟子·alex

上面的紋理格式,同一種情況下,可能多種都適合,那如何選擇呢。 我們還是根據具體情況而定。

1、場景、背景、全屏

2d手機遊戲中,多半都有這樣的,以作為背景,特別在一些slg,橫版過關遊戲中。這種對alpha沒有要求,並且,在同一時間,只會出現一張(如果是多張拼接,也不會超過螢幕尺寸太多),記憶體不會成為關鍵點。所以,在這種情況下,我們大膽選擇jpg就可以了。

2、場景的前景,裝飾物,可移動物件

這種要看規模,如果規模較小,型別不多。 或者型別雖然多,但同一時間出現在場景中的型別不多,那我們可以選擇壓縮png8的方式,它支援alpha通道,檔案又小。

如果同屏可能出現多種這種,則需要考慮在ios上使用pvrtc,在android上使用etc1+alpha_mask

3、ui

ui的背景圖,可以優先考慮使用壓縮png8,如果達不到精度要求,則使用png32。而對於ui的小元素,可以考慮使用壓縮png8.

對於ui的圖示,一般是不帶alpha的pvrtc/etc + 一張公共的alpha掩碼圖,通過雙層混合來實現圓邊效果。 因為圖示同屏出現可能較大。 如果圖示能夠控制在一定範圍內,由於圖示是48x48等大小,一張1024x1024的大圖,可以放400個圖示。 換用jpg,也有4mb的開銷,如果這個是可以接受的,也可以使用jpg+alpha_mask的方式。

寫到這裡才發現,其實只需要下面一句話就可以搞定。

這類會不會同時出現多個,同時出現時,記憶體開銷是否無法接受, 如果確實無法接受,則使用gpu紋理,否則,優先考慮jpg,jpg+alpha,或者png8

就是說,首先要減小安裝包大小,如果記憶體有無法接受的情況,才需要用gpu紋理進行優化。而我們在優化的時候,最好是對某一類進行統一處理。 比如場景,如果決定了使用jpg,那就清一色的jpg。

這麼多格式,如果讓美術來出圖,不是要折騰死麼。

因此,只需要規定,美術出圖只給png(有些可能會是tga)即可,剩下的事情,程式自己寫指令碼進行解決。 這樣可以保證美術出圖的規範性,同時也避免了程式在優化過程中,切換紋理格式帶來的重新出圖問題。

或許你會說,jjyy半天,沒有帶點實際的。

這句話真的挺嘲諷的,但我真的打算結束了,一是我想要說的,就是這些,二是,我沒有打算寫乙個如何在移動平台上使用各種紋理的文章。

希望這篇文章能夠給迷茫的兄弟帶來靈感。

posted @

2014-07-19 00:08

麒麟子(alex) 閱讀(

...)

編輯收藏

如何選擇適合的伺服電機?

自動化技術行業指現如今的大熱門,而伺服電機之中佔據至關重要地位,一般用以專案中較精準的速度或位置控制部件的驅動。自動化裝置的設計者經常需用面對各式各樣不一樣需求的電機選型情況,而 商提供的電機也是多種多樣,引數數不勝數,經常使初學者摸不著頭腦,文中僅依據作者的具體工作經歷做一些分享,望可以給需用者提...

如何選擇適合自己企業的軟體

經常有人說,幹得好不如選得好,選擇的重要性不言而喻。選擇適合自己企業的軟體也是乙個技術活。我們今天先給這些erp軟體劃分換分一下陣營。第一陣營,就是大家耳熟能詳的sap oracle 第二陣營,ifs baan qad等,國內比較少聽見,比較低調,沒有第一陣營那兩個那麼能折騰鬧出動靜。第三陣營 用友...

如何選擇適合自己的超算中心?

針對具有高效能計算需求的使用者,可以選擇租用超算中心的計算資源。選擇哪一家呢?我覺得需要考慮一下幾點 1.收費標準。這個大家最關心。是否具有形式多樣,滿足使用者多元化需求的收費方式,提供的 是否具有競爭力。通常有按照cpu核 小時 按照節點 年2種計費方式。2.機器效能 硬體更新情況,正常執行的穩定...