李華明Himi 原創,轉載務必在明顯處註明:
【黑米GameDev街區】 原文連結: http://www.himigame.com/iphone-cocos2d/465.html
前幾節由於時間緊張,只是將一些遇到的問題拿出來進行分享經驗,那麼今天抽空寫一篇常用的精靈以及精靈常用和注意的一些知識;那麼由於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];
4. 在使用TexturePacker工具選取打包成pvr.ccz格式的時候會提示讓你加上這麼一句代碼:
[CCTexture2D PVRImagesHavePremultipliedAlpha:YES];
工具原文提示如下:
[CCTexture2D PVRImagesHavePremultipliedAlpha:YES]; 如果在項目中添加了這句話,但是,忘記在TP工具中將倒數第二項打鉤,那麼你就悲劇了 ;
打包成pvr格式的不要忘記在TP打包前將TP的倒數第二個選項打鉤哦~;
好了,這篇就到這裡,繼續忙了。。。。。。