iOS和android遊戲紋理最佳化和記憶體最佳化(cocos2d-x)

來源:互聯網
上載者:User

(未完成)

1、2d遊戲最占記憶體的無疑是圖片資源。

2、cocos2d-x不同平台讀取紋理的機制不同。ios下面使用CGImage,android和windows下是直接調用png庫。我測試了下,使用png庫直接讀取png會比CGImage還要節約1mb左右記憶體(圖片所佔記憶體4mb)但是速度要比CGImage慢一倍。時間和空間如何取捨就看實際情況了。不過最佳的選擇似乎是pvr(即使android版本,即使不使用pvrtc4)。

3、一般來說,我們可以直接使用  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才會顯得那麼高效。

4、pvr格式可以被顯卡所認可,而不需要開闢臨時記憶體來讀取,所以即便同為argb8888格式的圖片,pvr也會比png有效率,雖然不會節約程式穩定運行時的記憶體,但是會避免載入大量圖片時的記憶體暴漲。  並且如果是ios裝置的話,可以使用pvrtc4格式的圖片,這個格式相當於windows下的dds圖片,是可以被顯卡直接支援的。它是有損壓縮,一個像素只佔4位,不過如果不是有漸層半透明色的話,一般效果可以接受,而其節約的記憶體和cpu時間非常非常顯著。

5、pvr也不是萬金油。android裝置下雖然可以使用pvr格式,但是不能使用pvrtc4,希望通過pvr像ios裝置上一樣真正減少遊戲記憶體是不太可行的。

6、pvr.ccz其實就是pvr圖片zip打包下,程式讀的時候還是先解壓出pvr資源,然後再讀取pvr。不過由於壓縮下可以極大的減小圖片體積,所以雖然多瞭解壓過程也不會有特別多的cpu消耗。

7、一張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的效能有天壤之別)

8、由於最終消耗記憶體的都是紋理資料,所以只要紋理資料格式是一定的,無論圖片是什麼格式消耗的記憶體都是一樣的。比如使用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。

9、不要過於迷信所謂的去除alpha通道以節約記憶體。這個還要實際分析下具體結果。  我測試過(分別用cocos2d-x和鬼火3d引擎),rgba8888和rgb888格式的png圖片顯示所消耗的記憶體是一樣的。24位元影像片雖然讀取的時候開闢的記憶體只有3mb(1024*1024*3,注意如果是用CGImage讀取的話,那這個值就是4mb),但是glTexImage2D提交給顯卡後依然會增加4mb記憶體。可能跟顯卡的資料對齊有關。

     這裡我測試還有一個詭異的地方,如果是用pvr的npot圖片的話,rgb888要比rgba8888所消耗的記憶體要小,但是pot圖片兩者又是一樣的(png圖片兩種情況都是一樣的)。可能是powervr顯卡有特殊處理。

10、rgb565和rgb5551的圖片所消耗的記憶體是rgba8888的一半,如果沒有透明漸層的話,視覺上也看不出什麼區別。一些大的背景圖可以優先選擇這種格式。

11、pvr圖片載入速度要比png和jpg快3~5倍(同樣1024*1024 argb8888),png消耗的時間可能是700ms左右,但是pvr只需要100ms左右。如果是pvr.ccz壓縮下,消耗的時間是200ms左右。可見pvr在載入速度上還是有非常大的優勢的。這個應該是因為png和jpg需要把圖片資料還原為rgba,但是pvr可以直接把圖片資料傳遞給顯卡。pvrtc4的圖片是可以被powervr顯卡直接支援的。

 

總結下:

1、最終決定圖片佔用記憶體的是它的像素格式和大小,與其副檔名無關。png8  png32 jpg pvr只要其像素格式都是argb8888,那麼最終圖片佔用的記憶體是一樣的。

2、如果不是pvrtc4的格式,那麼不要擴充成2的整次冪,因為圖片越小,佔用記憶體越小

3、單單去除透明通道不會減少圖片所消耗的記憶體,png和jpg圖片也無法減少圖片體積,所以不推薦rgb888的格式。替代選擇rgb565和rgb5551。

5、小心載入圖片時臨時開闢的紋理資料造成的記憶體飆高,可以考慮加入記憶體池,及時的開闢和釋放緩衝區。

6、如果是為了減少圖片體積可以選擇:1、jpg--壓縮比最高,品質較好,但是不支援半透明    2、png8--同樣圖片會比jpg略大一些,使用ImageAlpha進行轉換,視覺上幾乎看不出差別。    這兩種圖片格式都可以極大的減少圖片體積(減少70%~80%),但是無助於減少記憶體

7、如果是為了減少記憶體可以選擇:1、沒有透明色的圖片統一轉換為rgb565格式,這個時候無法使用png8了,所以png和pvr.ccz圖片大小几乎相同,pvr.ccz速度更快,所以推薦pvr.ccz的rgb565格式    2、如果透明色僅僅是進行關鍵色標註,而沒有漸層混合,那麼推薦rgb5551 (r5_a1)的pvr.ccz格式

8、可以考慮寫個打包系統,統一把資源檔打包,而不是單個檔案用pvr.ccz進行zip壓縮,這樣可以獲得更高的效率。(比如我封裝了下暴雪的mpq打包,其讀取速度與本地檔案讀取速度相當,這樣就可以獲得最佳的讀取效率)

 

 

最後附上我測試的資料日誌,圖片是一張1024*1024的圖片,實際圖片內容大小為960*700。測試裝置iphone4,png jpg等圖片載入代碼修改為windows版本。tex後面是圖片的載入時間。 over後面的括弧裡面是圖片載入所消耗的記憶體。

[plain] view plaincopyprint?
  1. 2012-12-27 14:28:54.614 HelloCpp[4939:707] cocos2d: surface size: 960x640 
  2. Cocos2d: cocos2d: cocos2d-2.1beta3-x-2.1.0 
  3. Cocos2d: cocos2d: GL_VENDOR:     Imagination Technologies 
  4. Cocos2d: cocos2d: GL_RENDERER:   PowerVR SGX 535 
  5. Cocos2d: cocos2d: GL_VERSION:    OpenGL ES 2.0 IMGSGX535-63.24 
  6. Cocos2d: cocos2d: GL_MAX_TEXTURE_SIZE: 2048 
  7. Cocos2d: cocos2d: GL_MAX_TEXTURE_UNITS: 8 
  8. Cocos2d: cocos2d: GL supports PVRTC: YES 
  9. Cocos2d: cocos2d: GL supports BGRA8888 textures: NO 
  10. Cocos2d: cocos2d: GL supports NPOT textures: YES 
  11. Cocos2d: cocos2d: GL supports discard_framebuffer: YES 
  12. Cocos2d: cocos2d: GL supports shareable VAO: YES 
  13. Cocos2d: cocos2d: compiled with Profiling Support: NO 
  14. tex   195    map_001_BG.pvr 
  15. map_001_BG.pvr   
  16.         ---over   proess:11.0mb (4.0mb)   free:274.6mb 
  17. tex   159    map_001_BG_rgb.pvr 
  18. map_001_BG_rgb.pvr   
  19.         ---over   proess:15.0mb (4.0mb)   free:270.6mb 
  20. tex   711    map_001_BG.jpg 
  21. map_001_BG.jpg   
  22.         ---over   proess:19.1mb (4.1mb)   free:266.7mb 
  23. tex   653    map_001_BG_rgb.jpg 
  24. map_001_BG_rgb.jpg   
  25.         ---over   proess:23.1mb (4.0mb)   free:262.6mb 
  26. tex   670    map_001_BG.png 
  27. map_001_BG.png   
  28.         ---over   proess:27.1mb (4.1mb)   free:258.7mb 
  29. tex   739    map_001_BG_rgb.png 
  30. map_001_BG_rgb.png   
  31.         ---over   proess:31.1mb (4.0mb)   free:254.3mb 
  32. tex   240    map_001_BG.pvr.ccz 
  33. map_001_BG.pvr.ccz   
  34.         ---over   proess:35.1mb (4.0mb)   free:250.4mb 
  35. tex   204    map_001_BG_rgb.pvr.ccz 
  36. map_001_BG_rgb.pvr.ccz   
  37.         ---over   proess:39.2mb (4.0mb)   free:246.5mb 
  38. tex   97    map_001_BG_rgb565.pvr 
  39. map_001_BG_rgb565.pvr   
  40.         ---over   proess:41.2mb (2.0mb)   free:244.6mb 
  41. tex   710    map_001_BG_rgb565.png 
  42. map_001_BG_rgb565.png   
  43.         ---over   proess:45.2mb (4.0mb)   free:241.1mb 
  44. tex   591    map_001_BG_rgba8888f.png 
  45. map_001_BG_rgba8888f.png   
  46.         ---over   proess:47.8mb (2.6mb)   free:238.3mb 
  47. tex   484    map_001_BG_rgba8888f.jpg 
  48. map_001_BG_rgba8888f.jpg   
  49.         ---over   proess:49.7mb (1.9mb)   free:236.5mb 
  50. tex   123    map_001_BG_rgba8888f.pvr 
  51. map_001_BG_rgba8888f.pvr   
  52.         ---over   proess:52.4mb (2.7mb)   free:234.1mb 
  53. tex   589    map_001_BG_rgb888f.png 
  54. map_001_BG_rgb888f.png   
  55.         ---over   proess:55.1mb (2.7mb)   free:231.2mb 
  56. tex   478    map_001_BG_rgb888f.jpg 
  57. map_001_BG_rgb888f.jpg   
  58.         ---over   proess:57.0mb (1.9mb)   free:229.4mb 
  59. tex   92    map_001_BG_rgb888f.pvr 
  60. map_001_BG_rgb888f.pvr   
  61.         ---over   proess:59.0mb (2.0mb)   free:227.8mb 
  62. (lldb)  
2012-12-27 14:28:54.614 HelloCpp[4939:707] cocos2d: surface size: 960x640Cocos2d: cocos2d: cocos2d-2.1beta3-x-2.1.0Cocos2d: cocos2d: GL_VENDOR:     Imagination TechnologiesCocos2d: cocos2d: GL_RENDERER:   PowerVR SGX 535Cocos2d: cocos2d: GL_VERSION:    OpenGL ES 2.0 IMGSGX535-63.24Cocos2d: cocos2d: GL_MAX_TEXTURE_SIZE: 2048Cocos2d: cocos2d: GL_MAX_TEXTURE_UNITS: 8Cocos2d: cocos2d: GL supports PVRTC: YESCocos2d: cocos2d: GL supports BGRA8888 textures: NOCocos2d: cocos2d: GL supports NPOT textures: YESCocos2d: cocos2d: GL supports discard_framebuffer: YESCocos2d: cocos2d: GL supports shareable VAO: YESCocos2d: cocos2d: compiled with Profiling Support: NOtex   195    map_001_BG.pvrmap_001_BG.pvr  ---over   proess:11.0mb (4.0mb)   free:274.6mbtex   159    map_001_BG_rgb.pvrmap_001_BG_rgb.pvr  ---over   proess:15.0mb (4.0mb)   free:270.6mbtex   711    map_001_BG.jpgmap_001_BG.jpg  ---over   proess:19.1mb (4.1mb)   free:266.7mbtex   653    map_001_BG_rgb.jpgmap_001_BG_rgb.jpg  ---over   proess:23.1mb (4.0mb)   free:262.6mbtex   670    map_001_BG.pngmap_001_BG.png  ---over   proess:27.1mb (4.1mb)   free:258.7mbtex   739    map_001_BG_rgb.pngmap_001_BG_rgb.png  ---over   proess:31.1mb (4.0mb)   free:254.3mbtex   240    map_001_BG.pvr.cczmap_001_BG.pvr.ccz  ---over   proess:35.1mb (4.0mb)   free:250.4mbtex   204    map_001_BG_rgb.pvr.cczmap_001_BG_rgb.pvr.ccz  ---over   proess:39.2mb (4.0mb)   free:246.5mbtex   97    map_001_BG_rgb565.pvrmap_001_BG_rgb565.pvr  ---over   proess:41.2mb (2.0mb)   free:244.6mbtex   710    map_001_BG_rgb565.pngmap_001_BG_rgb565.png  ---over   proess:45.2mb (4.0mb)   free:241.1mbtex   591    map_001_BG_rgba8888f.pngmap_001_BG_rgba8888f.png  ---over   proess:47.8mb (2.6mb)   free:238.3mbtex   484    map_001_BG_rgba8888f.jpgmap_001_BG_rgba8888f.jpg  ---over   proess:49.7mb (1.9mb)   free:236.5mbtex   123    map_001_BG_rgba8888f.pvrmap_001_BG_rgba8888f.pvr  ---over   proess:52.4mb (2.7mb)   free:234.1mbtex   589    map_001_BG_rgb888f.pngmap_001_BG_rgb888f.png  ---over   proess:55.1mb (2.7mb)   free:231.2mbtex   478    map_001_BG_rgb888f.jpgmap_001_BG_rgb888f.jpg  ---over   proess:57.0mb (1.9mb)   free:229.4mbtex   92    map_001_BG_rgb888f.pvrmap_001_BG_rgb888f.pvr  ---over   proess:59.0mb (2.0mb)   free:227.8mb(lldb) 

 

第二個日誌是ios版本的圖片載入,其他與上一個相同,可以看到速度要比windows版本的png載入快一倍,但是記憶體消耗更高

[plain] view plaincopyprint?
  1. 2012-12-27 15:36:10.330 HelloCpp[4979:707] cocos2d: surface size: 960x640 
  2. Cocos2d: cocos2d: cocos2d-2.1beta3-x-2.1.0 
  3. Cocos2d: cocos2d: GL_VENDOR:     Imagination Technologies 
  4. Cocos2d: cocos2d: GL_RENDERER:   PowerVR SGX 535 
  5. Cocos2d: cocos2d: GL_VERSION:    OpenGL ES 2.0 IMGSGX535-63.24 
  6. Cocos2d: cocos2d: GL_MAX_TEXTURE_SIZE: 2048 
  7. Cocos2d: cocos2d: GL_MAX_TEXTURE_UNITS: 8 
  8. Cocos2d: cocos2d: GL supports PVRTC: YES 
  9. Cocos2d: cocos2d: GL supports BGRA8888 textures: NO 
  10. Cocos2d: cocos2d: GL supports NPOT textures: YES 
  11. Cocos2d: cocos2d: GL supports discard_framebuffer: YES 
  12. Cocos2d: cocos2d: GL supports shareable VAO: YES 
  13. Cocos2d: cocos2d: compiled with Profiling Support: NO 
  14. tex   196    map_001_BG.pvr 
  15. map_001_BG.pvr   
  16.         ---over   proess:11.0mb (4.0mb)   free:275.8mb 
  17. tex   160    map_001_BG_rgb.pvr 
  18. map_001_BG_rgb.pvr   
  19.         ---over   proess:15.0mb (4.0mb)   free:271.9mb 
  20. tex   130    map_001_BG.jpg 
  21. map_001_BG.jpg   
  22.         ---over   proess:19.3mb (4.3mb)   free:267.6mb 
  23. tex   151    map_001_BG_rgb.jpg 
  24. map_001_BG_rgb.jpg   
  25.         ---over   proess:23.5mb (4.2mb)   free:263.8mb 
  26. tex   344    map_001_BG.png 
  27. map_001_BG.png   
  28.         ---over   proess:28.7mb (5.3mb)   free:258.7mb 
  29. tex   328    map_001_BG_rgb.png 
  30. map_001_BG_rgb.png   
  31.         ---over   proess:34.0mb (5.3mb)   free:253.6mb 
  32. tex   237    map_001_BG.pvr.ccz 
  33. map_001_BG.pvr.ccz   
  34.         ---over   proess:38.0mb (4.0mb)   free:249.6mb 
  35. tex   221    map_001_BG_rgb.pvr.ccz 
  36. map_001_BG_rgb.pvr.ccz   
  37.         ---over   proess:42.0mb (4.0mb)   free:245.2mb 
  38. tex   98    map_001_BG_rgb565.pvr 
  39. map_001_BG_rgb565.pvr   
  40.         ---over   proess:44.0mb (2.0mb)   free:243.2mb 
  41. tex   300    map_001_BG_rgb565.png 
  42. map_001_BG_rgb565.png   
  43.         ---over   proess:48.9mb (4.9mb)   free:238.2mb 
  44. tex   293    map_001_BG_rgba8888f.png 
  45. map_001_BG_rgba8888f.png   
  46.         ---over   proess:52.8mb (3.9mb)   free:234.2mb 
  47. tex   87    map_001_BG_rgba8888f.jpg 
  48. map_001_BG_rgba8888f.jpg   
  49.         ---over   proess:55.7mb (2.9mb)   free:231.7mb 
  50. tex   143    map_001_BG_rgba8888f.pvr 
  51. map_001_BG_rgba8888f.pvr   
  52.         ---over   proess:58.3mb (2.7mb)   free:228.8mb 
  53. tex   300    map_001_BG_rgb888f.png 
  54. map_001_BG_rgb888f.png   
  55.         ---over   proess:62.2mb (3.9mb)   free:225.3mb 
  56. tex   87    map_001_BG_rgb888f.jpg 
  57. map_001_BG_rgb888f.jpg   
  58.         ---over   proess:65.1mb (2.9mb)   free:222.7mb 
  59. tex   91    map_001_BG_rgb888f.pvr 
  60. map_001_BG_rgb888f.pvr   
  61.         ---over   proess:67.0mb (1.9mb)   free:220.7mb 
  62. (lldb) 
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.