close

【Cocos2d遊戲開發之九】講解CCSpriteBatchNode與TP工具的".pvr.ccz",".plist"共用的終極精靈優化及注意事項!

時間:2011-09-09 19:59來源:Internet 作者:Internet 點擊: 222 次
             Himi 原創,轉載請注明!原文地址:http://blog.csdn.net/xiaominghimi
         Himi 原創,轉載請注明 

原文地址:http://blog.csdn.net/xiaominghimi/article/details/6761811

             前幾節由於時間緊張,只是將一些遇到的問題拿出來進行分享經驗,那麼今天抽空寫一篇常用的精靈以及精靈常用和注意的一些知識;那麼由於cocos2d教程基本很完善,那麼今天Himi介紹一些注意點和細節點分享大家;

            首先對於使用過精靈的童鞋很熟悉CCSpriteBatchNode,至少大家都會知道它能優化精靈,但是至於優化原理這裏簡單說下:

            一般使用精靈CCSprite的時候,都是直接使用[CCLayer* addChild:CCSprite *];,假設我們創建一百個精靈,那麼當前的CCLayer會为100個精靈單獨繪制;

           如果使用精靈集合-CCSpriteBatchNode的話,直接將集合CCSpriteBatchNode添加CCLayer中即可,即使創建一百個精靈,我們也都是將100個精靈添加到集合中,[CCSpriteBatchNode* addChild:CCSprite];而已;

           兩者的區別:

         1.  直接使用CCLayer進行添加精靈,CCLayer上有幾個精靈,那麼底層就會繪制幾次精靈;

                      簡單可以理解成底層繪制方式如下:

                      for(int i= 0;i<100;i++){open-draw-close;}

          但是使用集合的話,CCLayer只需要對精靈集合進行一次渲染,

                     簡單可以理解成底層繪制方式如下:

                    open-draw(100次繪制)-close

         從以上兩種方式可以看出兩者的區別了,第二種使用精靈集合省去了99次open和close的過程,從而達到優化作用;

          上次参加iOS第四次開發者大會,cocos2d-x的張哲在演講中重點拿出了這一點進行講解,他在ipad上使用兩種方式给出的數據如下:

                  在屏幕中繪制3000個精靈,直接使用CCLayer添加精靈的方式,幀數從60下降到不到20幀;

                  同样在屏幕中繪制3000個精靈,使用CCSpriteBatchNode的渲染方式,幀數保持在50幀左右;

          當然Himi也親自測試過,但是由於真機調試的還沒申請下來,所以只能在模擬器上測試,發現同時繪制300個精靈,兩種方式幀數一致,無區別;不是因为沒差別,而是因为在iOS模擬器中,幀數與屏幕中的精靈數量有關,真機則會很明顯的體現兩者的區別;

 

       2.使用CCSpriteBathNode雖然能達到優化,但是要注意一點:

          初始化精靈集合CCSpriteBatchNode的時候會加載一張圖片資源(或者pvr文件等),那麼限制其精靈集合的子精靈都必須使用集合加載的這張圖才行,否則會给出警告;

       

       3.使用CCSpriteBatchNode還要注意一點,因为精靈都存放在集合中,那麼這個集合CCSpriteBatchNode中的節點(精靈)都將在同一個z軸上,同一深度上;

 

       在上一章中介紹過TexturePacker工具的作用,那麼這裏不介紹如何使用,而是說下主要的兩點,一般使用TexturePacker工具都會將很多精靈圖片或者動作幀放在一起打包成“.pvr.ccz”、".plist"、“-hd.pvr.ccz”和"-hd.plist"的四個文件,其中兩個-hd的是使用工具生成的打包資源的高清版本(940*480)使用的,這個不再強調了;

      至於".pvr.ccz"格式的則是最壓縮、最适合iOS的資源文件格式了,那麼與".plist"兩個文件的使用方式其實也很簡單,代碼如下:

 [CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"XX.plist"];


    以上代碼是將".pvr.ccz"資源包的圖進行加載到精靈幀緩存中,一旦加載過後,你就可以任意使用了,比如你將icon.png和himi.png兩張圖片一起利用工具打包成“.pvr.ccz”、".plist"兩個文件後,將兩個文件放在項目下(兩張圖片不需要了),然後使用剛才的代碼將資源包加載緩存中,只需要加載plist文件即可,pvr.ccz的不需要加載,但是也需要放在項目下,然後你在創建精靈的時候可以使用以下形式進行創建精靈:

  CCSprite *sprite = [CCSprite spriteWithSpriteFrameName:@"himi.png"];

      通過上面這行代碼可以看出,此種創建精靈的方式是利用幀緩存創建的,那麼也就是說一旦加載的許多個一样的精靈的時候利用此方式相當優化運行內存,最容易想到的就是創建子彈;

 

       那麼肯定會有童鞋說,那麼如果把這資源文件與CCSpriteBathNode結合使用豈不是更嗨皮,沒錯,可以的,加載的時候只需要將如下創建集合即可:

 

CCSpriteBatchNode spritesBgNode = [CCSpriteBatchNode batchNodeWithFile:@"xx.pvr.ccz"];
[CCLayer* addChild:spritesBgNode];
[[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"xx.plist"];

     最後順便跟大家強調需要重點注意的三點:

 

     1.使用TexturePacker工具雖然可以對應生成@2x與-hd文件,但是工具會將你導入的所有精靈圖的會做作为-hd的資源包生成,而對應的非高清的則是當前圖片尺寸縮放一半的資源而已;

     2.如果你項目中需要加載使用一張"himi.png"的圖的話,那麼在cocos2d引擎開發的項目中,首先會去資源中尋找"himi-hd.png"的圖片,如果找不到則會去尋找"himi@2x.png"的圖,所以這裏一定要注意資源的命名和使用;

    3.在cocos2d 1.0.0的版本中千萬不要在使用pvr.ccz與plist文件的時候加上以下代碼:

[CCTexture2D setDefaultAlphaPixelFormat:kCCTexture2DPixelFormat_Default];

一些教程都會加,但是加上之後發現圖片透明像素都被白色填充!

 

    而且在使用TexturePacker工具選取打包成pvr.ccz格式的時候會提示讓你加上這麼一句代碼:

 CCTexture2D PVRImagesHavePremultipliedAlpha:YES];

 工具原文提示如下:

 

   

  Himi在代碼中測試過,有木有這句都無所謂,不會有什麼影響,至少在cocos2d 1.0.0的版本中加不加無所謂;

         好了,這篇就到這裏,繼續忙了。。。。。。

arrow
arrow
    全站熱搜

    zer931 發表在 痞客邦 留言(0) 人氣()