iOS和android遊戲紋理優化和內存優化(cocos2d-x)

一、2d遊戲最佔內存的無疑是圖片資源。 二、cocos2d-x不一樣平臺讀取紋理的機制不一樣。ios下面使用 CGImage,android和windows下是直接調用png庫。我測試了下,使用png庫直接讀取png會比CGImage還要節約1mb左右內 存(圖片所佔內存4mb)可是速度要比CGImage慢一倍。時間和空間如何取捨就看實際狀況了。不過最佳的選擇彷佛是pvr(即便android版本, 即便不使用pvrtc4)。 三、通常來講,咱們能夠直接使用  w * h * bpp獲得一張紋理所佔的內存,好比一張1024*1024格式爲argb8888,那麼他所佔的內存就是1024*1024*4=4mb。以前看到有博 客提到jpg會開闢3倍與此的內存(先轉換爲png,而後解析png),可是新的ios系統彷佛沒有這個問題。jpg與png所消耗的內存幾乎相同,而且 jpg解析速度更快(幾乎都是4mb解析+4mb紋理數據,而jpg解析時間是png的一半),可是這樣反而很怪異,由於jpg是沒有透明色的,一個像素 最多3字節,而png一個像素4字節,jpg紋理應該佔用內存更小纔對,後來看了下cocos2d的ios加載圖片的代碼,它把全部紋理轉換成 rgba8888格式,因此不管是jpg仍是png,佔用的都是4字節。正因cocos2d對其餘紋理支持不夠好,pvr纔會顯得那麼高效。 四、pvr格式能夠被顯卡所承認,而不須要開闢臨時內存來讀取,因此即使同爲 argb8888格式的圖片,pvr也會比png有效率,雖然不會節約程序穩定運行時的內存,可是會避免加載大量圖片時的內存暴漲。  而且若是是ios設備的話,可使用pvrtc4格式的圖片,這個格式至關於windows下的dds圖片,是能夠被顯卡直接支持的。它是有損壓縮,一 個像素只佔4位,不過若是不是有漸變半透明色的話,通常效果能夠接受,而其節約的內存和cpu時間很是很是顯著。 五、pvr也不是萬金油。android設備下雖然可使用pvr格式,可是不能使用pvrtc4,但願經過pvr像ios設備上同樣真正減小遊戲內存是不太可行的。 六、pvr.ccz其實就是pvr圖片zip打包下,程序讀的時候仍是先解壓出pvr資源,而後再讀取pvr。不過因爲壓縮下能夠極大的減少圖片體積,因此雖然多瞭解壓過程也不會有特別多的cpu消耗。 七、一張jpg圖片實際加載過程內存消耗,以一張1024*1024 argb8888 500k的jpg圖片爲例: a.讀取圖片文件(消耗圖片大小內存,500k)     b、解析jpg數據(cgimage, 4mb) c、釋放500k的圖片內存    d、opengl紋理數據(4mb)    e、釋放cgimage的4mb內存。      注意,這個過程不是必然的順序執行,釋放cgimage內存的實際是有系統決定的,會很快,可是不必定是當即執行。  因此內存會瞬間飆升9mb左右,而後減小5mb,穩定到4mb左右        png圖片的加載過程與此相同        pvr圖片能夠節約解析圖片數據到紋理這一步的消耗。也就是說讀取pvr圖片資源(等價於解壓pvr.ccz到內存,若是是1024*1024 argb8888格式的話,那麼圖片大小就是4mb,ccz壓縮後圖片1mb左右)消耗4mb,將pvr圖片數據提交給顯卡消耗4mb。而後釋放文件數據 4mb。這麼看彷佛跟Png從內存佔用上相比也不是很是有優點。(注意這裏說的pvr是指pvr封裝的argb8888,與pvrtc4的性能有天壤之 別) 八、因爲最終消耗內存的都是紋理數據,因此只要紋理數據格式是必定的,不管圖片是什麼 格式消耗的內存都是同樣的。好比使用Png8圖片,體積會減小70%,可是內存佔用與png24/png32是等價的(讀取的時候會內部把調色板還原成真 彩色,也就是說,雖然png8是一個像素只佔8位,可是讀取到內存中的時候會將調色板顏色還原,依然須要開闢1024*1024*4字節的空間存放紋理數 據)。 固然有無透明色,cocos2d的處理仍是有區別的。若是是無透明色,可使用png24,那麼所需開闢的紋理空間就是3mb。        這裏還有一點須要說明,通常咱們處理windows下的dds紋理的時候,都習慣將其按2的整次冪對其,雖然圖片內容只有900*900,可是圖片大小 倒是1024*1024。那咱們讀取這個圖片所消耗的內存就是4mb,按2的整次冪對其是有助於提升運行效率的,可是不是很是必須的。ios和 android的設備都支持非2的整次冪的紋理。因此若是是png圖片,那麼它該多大就多大。此時消耗的內存就只有900*900*4=3mb。 九、不要過於迷信所謂的去除alpha通道以節約內存。這個還要實際分析下具體結果。  我測試過(分別用cocos2d-x和鬼火3d引擎),rgba8888 和rgb888格式的png圖片顯示所消耗的內存是同樣的。24位圖片雖然讀取的時候開闢的內存只有3mb(1024*1024*3,注意若是是用 CGImage讀取的話,那這個值就是4mb),可是glTexImage2D提交給顯卡後依然會增長4mb內存。可能跟顯卡的數據對齊有關。      這裏我測試還有一個詭異的地方,若是是用pvr的npot圖片的話,rgb888要比rgba8888所消耗的內存要小,可是pot圖片二者又是同樣的(png圖片兩種狀況都是同樣的)。多是powervr顯卡有特殊處理。 十、rgb565和rgb5551的圖片所消耗的內存是rgba8888的一半,若是沒有透明漸變的話,視覺上也看不出什麼區別。一些大的背景圖能夠優先選擇這種格式。 十一、pvr圖片加載速度要比png和jpg快3~5倍(一樣1024*1024 argb8888),png消耗的時間多是700ms左右,可是pvr只須要100ms左右。若是是pvr.ccz壓縮下,消耗的時間是200ms左 右。可見pvr在加載速度上仍是有很是大的優點的。這個應該是由於png和jpg須要把圖片數據還原爲rgba,可是pvr能夠直接把圖片數據傳遞給顯 卡。pvrtc4的圖片是能夠被powervr顯卡直接支持的。 總結下: 一、最終決定圖片佔用內存的是它的像素格式和大小,與其擴展名無關。png8  png32 jpg pvr只要其像素格式都是argb8888,那麼最終圖片佔用的內存是同樣的。 二、若是不是pvrtc4的格式,那麼不要擴展成2的整次冪,由於圖片越小,佔用內存越小 三、單單去除透明通道不會減小圖片所消耗的內存,png和jpg圖片也沒法減小圖片體積,因此不推薦rgb888的格式。替代選擇rgb565和rgb5551。 五、當心加載圖片時臨時開闢的紋理數據形成的內存飆高,能夠考慮加入內存池,及時的開闢和釋放緩衝區。 六、若是是爲了減小圖片體積能夠選擇:一、jpg--壓縮比最高,質量較好,可是不支 持半透明    二、png8--一樣圖片會比jpg略大一些,使用ImageAlpha進行轉換,視覺上幾乎看不出差異。    這兩種圖片格式均可以極大的減小圖片體積(減小70%~80%),可是無助於減小內存 七、若是是爲了減小內存能夠選擇:一、沒有透明色的圖片統一轉換爲rgb565格式, 這個時候沒法使用png8了,因此png和pvr.ccz圖片大小几乎相同,pvr.ccz速度更快,因此推薦pvr.ccz的rgb565格式    二、若是透明色僅僅是進行關鍵色標註,而沒有漸變混合,那麼推薦rgb5551 (r5_a1)的pvr.ccz格式 八、能夠考慮寫個打包系統,統一把資源文件打包,而不是單個文件用pvr.ccz進行zip壓縮,這樣能夠得到更高的效率。(好比我封裝了下暴雪的mpq打包,其讀取速度與本地文件讀取速度至關,這樣就能夠得到最佳的讀取效率) 最後附上我測試的數據日誌,圖片是一張1024*1024的圖片,實際圖片內容大小爲960*700。測試設備iphone4,png jpg等圖片加載代碼修改成windows版本。tex後面是圖片的加載時間。 over後面的括號裏面是圖片加載所消耗的內存。 2012-12-27 14:28:54.614 HelloCpp[4939:707] cocos2d: surface size: 960x640 Cocos2d: cocos2d: cocos2d-2.1beta3-x-2.1.0 Cocos2d: cocos2d: GL_VENDOR:     Imagination Technologies Cocos2d: cocos2d: GL_RENDERER:   PowerVR SGX 535 Cocos2d: cocos2d: GL_VERSION:    OpenGL ES 2.0 IMGSGX535-63.24 Cocos2d: cocos2d: GL_MAX_TEXTURE_SIZE: 2048 Cocos2d: cocos2d: GL_MAX_TEXTURE_UNITS: 8 Cocos2d: cocos2d: GL supports PVRTC: YES Cocos2d: cocos2d: GL supports BGRA8888 textures: NO Cocos2d: cocos2d: GL supports NPOT textures: YES Cocos2d: cocos2d: GL supports discard_framebuffer: YES Cocos2d: cocos2d: GL supports shareable VAO: YES Cocos2d: cocos2d: compiled with Profiling Support: NO tex   195    map_001_BG.pvr map_001_BG.pvr     ---over   proess:11.0mb (4.0mb)   free:274.6mb tex   159    map_001_BG_rgb.pvr map_001_BG_rgb.pvr     ---over   proess:15.0mb (4.0mb)   free:270.6mb tex   711    map_001_BG.jpg map_001_BG.jpg     ---over   proess:19.1mb (4.1mb)   free:266.7mb tex   653    map_001_BG_rgb.jpg map_001_BG_rgb.jpg     ---over   proess:23.1mb (4.0mb)   free:262.6mb tex   670    map_001_BG.png map_001_BG.png     ---over   proess:27.1mb (4.1mb)   free:258.7mb tex   739    map_001_BG_rgb.png map_001_BG_rgb.png     ---over   proess:31.1mb (4.0mb)   free:254.3mb tex   240    map_001_BG.pvr.ccz map_001_BG.pvr.ccz     ---over   proess:35.1mb (4.0mb)   free:250.4mb tex   204    map_001_BG_rgb.pvr.ccz map_001_BG_rgb.pvr.ccz     ---over   proess:39.2mb (4.0mb)   free:246.5mb tex   97    map_001_BG_rgb565.pvr map_001_BG_rgb565.pvr     ---over   proess:41.2mb (2.0mb)   free:244.6mb tex   710    map_001_BG_rgb565.png map_001_BG_rgb565.png     ---over   proess:45.2mb (4.0mb)   free:241.1mb tex   591    map_001_BG_rgba8888f.png map_001_BG_rgba8888f.png     ---over   proess:47.8mb (2.6mb)   free:238.3mb tex   484    map_001_BG_rgba8888f.jpg map_001_BG_rgba8888f.jpg     ---over   proess:49.7mb (1.9mb)   free:236.5mb tex   123    map_001_BG_rgba8888f.pvr map_001_BG_rgba8888f.pvr     ---over   proess:52.4mb (2.7mb)   free:234.1mb tex   589    map_001_BG_rgb888f.png map_001_BG_rgb888f.png     ---over   proess:55.1mb (2.7mb)   free:231.2mb tex   478    map_001_BG_rgb888f.jpg map_001_BG_rgb888f.jpg     ---over   proess:57.0mb (1.9mb)   free:229.4mb tex   92    map_001_BG_rgb888f.pvr map_001_BG_rgb888f.pvr     ---over   proess:59.0mb (2.0mb)   free:227.8mb (lldb) 第二個日誌是ios版本的圖片加載,其餘與上一個相同,能夠看到速度要比windows版本的png加載快一倍,可是內存消耗更高 2012-12-27 15:36:10.330 HelloCpp[4979:707] cocos2d: surface size: 960x640 Cocos2d: cocos2d: cocos2d-2.1beta3-x-2.1.0 Cocos2d: cocos2d: GL_VENDOR:     Imagination Technologies Cocos2d: cocos2d: GL_RENDERER:   PowerVR SGX 535 Cocos2d: cocos2d: GL_VERSION:    OpenGL ES 2.0 IMGSGX535-63.24 Cocos2d: cocos2d: GL_MAX_TEXTURE_SIZE: 2048 Cocos2d: cocos2d: GL_MAX_TEXTURE_UNITS: 8 Cocos2d: cocos2d: GL supports PVRTC: YES Cocos2d: cocos2d: GL supports BGRA8888 textures: NO Cocos2d: cocos2d: GL supports NPOT textures: YES Cocos2d: cocos2d: GL supports discard_framebuffer: YES Cocos2d: cocos2d: GL supports shareable VAO: YES Cocos2d: cocos2d: compiled with Profiling Support: NO tex   196    map_001_BG.pvr map_001_BG.pvr     ---over   proess:11.0mb (4.0mb)   free:275.8mb tex   160    map_001_BG_rgb.pvr map_001_BG_rgb.pvr     ---over   proess:15.0mb (4.0mb)   free:271.9mb tex   130    map_001_BG.jpg map_001_BG.jpg     ---over   proess:19.3mb (4.3mb)   free:267.6mb tex   151    map_001_BG_rgb.jpg map_001_BG_rgb.jpg     ---over   proess:23.5mb (4.2mb)   free:263.8mb tex   344    map_001_BG.png map_001_BG.png     ---over   proess:28.7mb (5.3mb)   free:258.7mb tex   328    map_001_BG_rgb.png map_001_BG_rgb.png     ---over   proess:34.0mb (5.3mb)   free:253.6mb tex   237    map_001_BG.pvr.ccz map_001_BG.pvr.ccz     ---over   proess:38.0mb (4.0mb)   free:249.6mb tex   221    map_001_BG_rgb.pvr.ccz map_001_BG_rgb.pvr.ccz     ---over   proess:42.0mb (4.0mb)   free:245.2mb tex   98    map_001_BG_rgb565.pvr map_001_BG_rgb565.pvr     ---over   proess:44.0mb (2.0mb)   free:243.2mb tex   300    map_001_BG_rgb565.png map_001_BG_rgb565.png     ---over   proess:48.9mb (4.9mb)   free:238.2mb tex   293    map_001_BG_rgba8888f.png map_001_BG_rgba8888f.png     ---over   proess:52.8mb (3.9mb)   free:234.2mb tex   87    map_001_BG_rgba8888f.jpg map_001_BG_rgba8888f.jpg     ---over   proess:55.7mb (2.9mb)   free:231.7mb tex   143    map_001_BG_rgba8888f.pvr map_001_BG_rgba8888f.pvr     ---over   proess:58.3mb (2.7mb)   free:228.8mb tex   300    map_001_BG_rgb888f.png map_001_BG_rgb888f.png     ---over   proess:62.2mb (3.9mb)   free:225.3mb tex   87    map_001_BG_rgb888f.jpg map_001_BG_rgb888f.jpg     ---over   proess:65.1mb (2.9mb)   free:222.7mb tex   91    map_001_BG_rgb888f.pvr map_001_BG_rgb888f.pvr     ---over   proess:67.0mb (1.9mb)   free:220.7mb (lldb)
相關文章
相關標籤/搜索