天天看點

【IOS-COCOS2D遊戲開發之九】講解CCSPRITEBATCHNODE與TP工具的”.PVR.CCZ”,”.PLIST”共用的終極精靈優化及注意事項!

前幾節由于時間緊張,隻是将一些遇到的問題拿出來進行分享經驗,那麼今天抽空寫一篇常用的精靈以及精靈常用和注意的一些知識;那麼由于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”兩個檔案的使用方式其實也很簡單,代碼如下:

1

[[ccspriteframecache sharedspriteframecache] addspriteframeswithfile:@"xx.plist"];

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

ccsprite *sprite = [ccsprite spritewithspriteframename:@"himi.png"];

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

那麼肯定會有童鞋說,那麼如果把這資源檔案與ccspritebathnode結合使用豈不是更嗨皮,沒錯,可以的,加載的時候隻需要将如下建立集合即可:

2

3

ccspritebatchnode spritesbgnode = [ccspritebatchnode batchnodewithfile:@"xx.pvr.ccz"];  

[cclayer* addchild:spritesbgnode];      

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

2.如果你項目中需要加載使用一張”himi.png”的圖的話,那麼在cocos2d引擎開發的項目中,首先會去資源中尋找”himi-hd.png”的圖檔,如果找不到則會去尋找”[email protected]”的圖,是以這裡一定要注意資源的命名和使用;

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

[cctexture2d setdefaultalphapixelformat:kcctexture2dpixelformat_default];

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

[cctexture2d pvrimageshavepremultipliedalpha:yes];

【IOS-COCOS2D遊戲開發之九】講解CCSPRITEBATCHNODE與TP工具的”.PVR.CCZ”,”.PLIST”共用的終極精靈優化及注意事項!

 [cctexture2d pvrimageshavepremultipliedalpha:yes]; 如果在項目中添加了這句話,但是一定也不能忘記在tp工具中将倒數第二項打鈎,否則你就悲劇了 ;

       打包成pvr格式的不要忘記在tp打包前将tp的倒數第二個選項打鈎哦~;

好了,這篇就到這裡。。。。。。