Cocos2d x紋理優化的一些方案

2021-09-09 05:14:47 字數 3340 閱讀 4075

紅孩兒cocos2d-x學習園地qq群:

249941957

**寫:

cocos2d-x

本章為我的cocos2d-x教程一書初稿。望各位看官多提建議!

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

在目前的移動平台遊戲開發過程中,很多朋友會遇到開發出來的demo占用記憶體過大,導致渲染效率低下的問題。究其原因,是由硬體本身和軟體邏輯兩方面的因素造成的。在硬體上,移動裝置往往可用記憶體相比於pc還比較小,所以所能使用的記憶體就少。在軟體邏輯上,大量使用大導致占用記憶體過大,以及過多單導致渲染時多次切換使用的紋理,也會大大降低渲染效率。本節我將帶領大家進入到紋理優化的實際操作中,希望可以拋磚引玉,使大家對於紋理優化有更好的認識。

首先,硬體的記憶體限制我們是沒有辦法逾越的。比如當下流行的iphone 4s 總記憶體容量為512m,而實際可用的記憶體大大少於這個數字,所以在你開發一款遊戲時,一定要清楚的知道你的程式在執行時的記憶體需求量,它務必要小於可用記憶體,而且要越少越好。我們在開發2d遊戲時,最多用到的資源就是紋理,一張寬高均為1024大小的格式為rgba8888的紋理。其占用的記憶體量至少是4m。所以,你一定要在紋理的優化上下功夫。

紋理的優化,方案有很多。我們逐個來列舉。

(1)色深優化

大家先來看一下下面這張對比圖:

第一張圖是a8r8g8b8格式,第二張圖是我轉為a1r5g5b5後的pvr圖,我以乙個一般玩家的視角來看是看不出有什麼差別的。但是第乙個圖每個畫素佔4位元組,而第二張圖每個畫素佔2位元組。這意味著看起來幾乎相同的,占用的記憶體可以減少一半。

這一方案並不適用於所有情況,你需要對每種進行考慮,如果說你的的alpha通道不是用於鏤空,而是用於渲染alpha混合。那你轉為只佔1位的alpha通道格式紋理是肯定不行的,你可以試試argb4444。而對於無alpha通道的,如果使用的是rgb888,可以嘗試轉為rgb565。另外,轉換之後一定要由美術人員進行實際觀察進行確定。如果轉換後的影象有明顯的失真,那就算了。

(2)拼圖優化

還是先上圖吧

首先是一堆小圖:

這一堆小圖共有20張,都是png格式的rgba8888。其中有15張圖大小是85x121,一張52x139,兩張是52x200,還有兩張是37x37。

下面是拼合後的png圖,格式與小圖一致。使用的是「紅孩兒紋理打包器1.1版本」。

此圖大小為512x512,可以看到其仍然有很大一片空白可供繼續拼合一些小圖。

好吧,我們來對比一下它們所佔的記憶體。

第二張圖大小為512x512,所以建立rgba8888格式紋理需要1m記憶體來儲存畫素資料。

前面那一堆小圖呢?

15張圖大小是85x121。我們知道opengl es在生成紋理時大小會擴充套件成2的冪次方。那85x121所生成的實際紋理大小為128x128,一張128x128大小的rgba8888格式紋理需要64k記憶體來儲存畫素資料。15x64k = 960k。

1張52x139,實際紋理大小為64x256 ,也需要64k

兩張是52x200,實際紋理大小為 64x256,需要64k,兩張需要128k

還有兩張是37x37。實際紋理大小為64x64,兩張需要32k

算一算吧,只是儲存畫素資料總共需要的記憶體大小為 1184k。還不包括產生的紋理其它資訊所占用的記憶體量,而且我們的拼合圖還有很大的空白可供更多的小圖進行拼合占用。

這還會導致乙個更明顯的效率問題,因為在渲染中,使用散圖意味著增加切換紋理的開銷,如果很多,那麼紋理的頻繁切換會導致你的遊戲fps大大降低。而採用拼合圖,你將只需要很少次設定使用紋理,就可以渲染出大量的圖形,大大減少了切換紋理的開銷。

(3)骨骼動畫

也是剛知道cocos2d-x2.0.3版本已經支援骨骼動畫系統。cocosbuilder2.1版本工具中也可以進行相應的骨骼動畫編輯。這對於優化記憶體是乙個很好的方案。

以前做人物動畫我們常常使用每一幀畫一幅的逐幀動畫方式。使用骨骼動畫可以大大降低幀的數量,它只需要很少的圖量就可以達到幾乎相同的動畫效果。但需要做比較複雜的編輯工做,對每乙個關健幀的骨骼點進行編輯。

骨骼動畫的製做流程一般為:

1.通過設定基礎的骨骼點並構建出骨架關係樹。將人物按骨架樹劃分成各個身體部件。

2.按照劃定的身體部件來製做人物或動物,當然一般是將整個人物或動物進行切圖命名圖塊來取得。

3.將身體部件圖塊繫結到相應的骨骼上。

4.設定關鍵幀,編輯關鍵幀上所有骨骼的位置及縮放與旋轉變化。

可參看網友豆奶哥哥的博文:

(4)批次處理

批次,即batch,也是遊戲引擎中乙個重要的優化指標。它指的是一次渲染凋用。顯而易見,渲染的次數越少則遊戲的執行效率越高。

cocos2d-x是明顯懂得這個道理的,舉個最明顯的栗子。咱們之前講過的「深入分析cocos2d-x中的圖字原理」中有乙個類ccspritebatchnode,它就是為了降低渲染批次而創造的乙個專門管理精靈的類。這麼說吧,我們渲染一段話「你吃了麼?」,這裡面有五個字,所以要建立五個ccsprite來對應這五個這的圖塊繪製,但繪製時我們如果乙個乙個的繪製,那是很恐怖的一件事,你的遊戲寫的字如果很多,你就可以放棄幹其它的事情了,因為渲染呼叫次數太多而導致效率低下。為了提高渲染效率,專門的類ccspritebatchnode就出現了!他在一次渲染中把這所有的ccsprite都繪製了出來。所以,我想說,如果你要提高你的渲染效率,好好分析分析怎麼使用ccspritebatchnode,將你的遊戲中的大量精靈盡可能的放在ccspritebatchnode中來渲染,一定可以提高fps的。

cocos2d-x 2.0之後在左下角加入了渲染批次統計,呵呵,好像借鑑了ogre的統計方式,為什麼要統計渲染批次呢?就是為了讓我們在進行優化時有個可以觀察的指標。如圖所示:

(5)使用壓縮紋理

ios裝置用的是powervr顯示晶元,而pvr格式可以被該顯示晶元直接讀取,在之前的博文裡有分析過pvr格式紋理的原始碼,大家可以從中了解到pvr格式所支援的多種壓縮格式。我們在開發ios遊戲時,也應該盡量使用合適的壓縮格式的。如「pvr.ccz」。

這部分有個效能小測試,有興趣的可以參見:

Cocos2d x紋理優化的一些方案

紅孩兒cocos2d x學習園地 249941957 寫 cocos2d x 本章為我的cocos2d x教程一書初稿。望各位看官多提建議!cocos2d x紋理優化的一些方案 在目前的移動平台遊戲開發過程中,很多朋友會遇到開發出來的demo占用記憶體過大,導致渲染效率低下的問題。究其原因,是由硬體...

cocos2dx 紋理快取

快取 cache 機制的原理是什麼?把新加進記憶體的資源做乙個hashmap儲存,每乙個資源加乙個key。每次載入資源,先從快取中尋找,如果找到就直接返回,否則載入到記憶體後再返回。一 自動快取紋理 直接使用display.newsprite filename 建立精靈,引擎內部會自動把紋理載入到快...

cocos2dx 紋理快取

在遊戲中需要載入大量的紋理,這些操作都是很耗記憶體和資源的。當遊戲中有個介面用到的非常多,第一次點進這介面時速度非常慢 因為要載入繪製很多 出現卡頓,我們可以使用texturecache提前非同步載入紋理,等載入結束,進入到這個介面再使用這些速度就會非常快。texture2d 紋理,即加載入記憶體後...