[?李華明Himi?](http://www.himigame.com/about-himi)原創,轉載務必在明顯處注明:
[【黑米GameDev街區】](http://www.himigame.com/)?原文鏈接:?[http://www.himigame.com/iphone-cocos2d/465.html](http://www.himigame.com/iphone-cocos2d/465.html "【iOS-Cocos2d游戲開發之九】講解CCSpriteBatchNode與TP工具的”.pvr.ccz”,”.plist”共用的終極精靈優化及注意事項!")
[](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];
~~~
4.?在使用TexturePacker工具選取打包成pvr.ccz格式的時候會提示讓你加上這么一句代碼:
~~~
[CCTexture2D PVRImagesHavePremultipliedAlpha:YES];
~~~
工具原文提示如下:

[CCTexture2D PVRImagesHavePremultipliedAlpha:YES]; 如果在項目中添加了這句話,但是,忘記在TP工具中將倒數第二項打鉤,那么你就悲劇了 ;
打包成pvr格式的不要忘記在TP打包前將TP的倒數第二個選項打鉤哦~;
好了,這篇就到這里,繼續忙了。。。。。。
- 前言
- 【Iphone 游戲開發】游戲引擎剖析
- [Object-C語言隨筆之一]Mac os 下搭建iOS開發環境
- [Object-C語言隨筆之二] 《NSLog》常用的打印調試語句與自動排版
- [Object-C語言隨筆之三] 類的創建和實例化以及函數的添加和調用!
- [Object-C語言隨筆之四]創建視圖并繪制簡單圖形
- 【iOS-Cocos2d游戲開發之一】搭建cocos2d游戲引擎環境HelloWorld!
- 【iOS-Cocos2d游戲開發之二】Cocos2D 游戲開發資源貼(教程以及源碼)
- 【iOS-Cocos2d游戲開發之三】CCScene切換的所有特效(28種)以及設置屏幕橫豎屏!
- 【iOS-Cocos2d游戲開發之四】獨自收集Cocos2d提供的字體!共57種(有對照的字體圖)
- 【iOS-Cocos2d游戲開發之五】多觸點與觸屏事件詳解(單一監聽、事件分發)【11月28日更新】
- 【iOS-Cocos2d游戲開發之六】對觸屏事件追加講解,解決無法觸發ccTouchMoved事件[重要!]
- 【iOS-Cocos2d游戲開發之七】在cocos2d中添加/刪除系統組件,并解決View設置透明會影響View中的其他組件的問題!【11月28日更新解決添加組件Cocos2d動畫停止播放的BUG】
- 【iOS-Cocos2d游戲開發之八】開啟高清(960*640)模式問題與解答、圖片適配以及設置iphone橫豎屏
- 【iOS-Cocos2d游戲開發之九】講解CCSpriteBatchNode與TP工具的&quot;.pvr.ccz&quot;,&quot;.plist&quot;共用的終極精靈優化及注意事項!
- 【iOS-Cocos2d游戲開發之十】添加粒子系統特效并解決粒子特效與Layer之間的坐標問題;
- 【iOS-Cocos2d游戲開發之十一】使用Box2d物理系統以及在cocos2d框架添加Box2d物理系統lib包的方法
- 【iOS-Cocos2d游戲開發之十二】淺析使用C++/C/OC進行iOS游戲混編出現“failed with exit”問題與小結;
- 【iOS-Cocos2d游戲開發之十三】CCSprite利用Bezier(貝塞爾)做拋物線動作并讓CCSprite同時播放兩個Action動作!
- 【iOS-Cocos2d游戲開發之十四】音頻/音效/視頻播放(利用Cocos2D-iPhone-Extensions嵌入Cocos2d進行視頻播放!)
- 【iOS-Cocos2d游戲開發之十五】詳解CCProgressTimer 進度條并修改cocos2d源碼實現“理想”游戲進度條!
- 【iOS-Cocos2d游戲開發之十六】添加本地通知(UILocalNotification)以及添加系統組件滾動視圖(UIScrollView)!【2011年11月15日更新】
- 【iOS-Cocos2d游戲開發之十七】靈活使用精靈可視區域(TextureRect)與錨點(anchorPoint),并結合可視區域與錨點制作進度條!
- 【iOS開發必備指南合集】申請企業級IDP、真機調試、游戲接入GameCenter 指南(實現仿官方的成就提示)、游戲接入OpenFeint指南;
- 【iOS-Cocos2d游戲開發之十八】解決滾屏背景/拼接地圖有黑邊(縫隙)/動畫播放出現毛邊以及禁止游戲中自動鎖屏問題!【2011年12月18日補充】
- 【iOS開發必收藏】詳解iOS應用程序內使用IAP/StoreKit付費、沙盒(SandBox)測試、創建測試賬號流程!【2012-12-11日更新獲取&quot;產品付費數量等于0的問題&quot;】
- 【iOS-cocos2d-X 游戲開發之一】在Mac下結合Xcode搭建Cocos2d-X開發環境!
- 【iOS-cocos2d-X 游戲開發之二】【必看篇】總結闡述Cocos2d-X與Cocos2d-iphone區別;
- 【iOS-Cocos2d游戲開發之十九】游戲數據存儲的四種常用方式NSKeyedArchiver/NSUserDefaults/Write寫入/SQLite3
- 【iOS-Cocos2d游戲開發之二十】精靈的基礎知識點總匯(位圖操作/貼圖更換/重排z軸等)以及利用CCSprite與CCLayerColor制作簡單遮蓋層!
- 【iOS-Cocos2d游戲開發之二十一 】自定義精靈類并為你的精靈設置攻擊幀(指定開始幀)以及擴展Cocos2d源碼的CCAnimation簡化動畫創建!
- 【iOS-Cocos2d游戲開發之二十二 】CCSpeed實現CCAnimate動畫進行時設置慢動作以及設置游戲加減速進行(塔防游戲必備)!
- 【iOS-cocos2d-X 游戲開發之三】Mac下配置Android NDK環境并搭建Cocos2d-x環境并Eclipse正常編譯運行Cocos2dX自帶TestsDemo項目!
- 【iOS-cocos2d-X 游戲開發之四】Cocos2dX創建Android NDK新項目并編譯導入Eclipse中正常運行!
- 【iOS-cocos2d-X 游戲開發之五】游戲存儲之Cocos2dX自帶CCUserDefault類詳解;
- 【iOS-cocos2d-X 游戲開發之六】使用Base64算法對Cocos2dX自帶CCUserDefault游戲存儲數據編碼!
- 【iOS-cocos2d-X 游戲開發之七】整合Cocos2dX的Android項目到Xcode項目中,Xcode編寫&amp;編譯代碼,Android導入打包運行即可!
- 【iOS-iap防護】驗證用戶付費收據!拒絕iap Cracker!拒絕iap Free!讓iphone越獄用戶無從下手!【2012年5月2日更新防護iap Free的方法】
- 【COCOS2DX-LUA 腳本開發之一】在Cocos2dX游戲中使用Lua腳本進行游戲開發(基礎篇)并介紹腳本在游戲中詳細用途!
- 【iOS-cocos2d-X 游戲開發之九】Cocos2dx利用CCSAXParser解析xml數據&amp;CCMutableDictionary使用與注意!
- 【iOS-cocos2d-X 游戲開發之十】自定義CCSprite/Layer/CCNode及靜態類模版&amp;自定義類細節說明&amp;Cocos2dx觸屏事件講解
- 【iOS-cocos2d-X 游戲開發之十一】New CCSprite()帶來的錯誤&amp;使用CCUserDefault及pvr.ccz在Cocos2dx中要注意!
- 【iOS-cocos2d-X 游戲開發之十二】自定義Cocos2dx搖桿(增強Joystick),增加搖桿跟隨用戶觸點作為搖桿坐標,讓搖桿不再死板!
- 【iOS-cocos2d-X 游戲開發之十三】詳細講解在Xcode中利用預編譯并通過Jni調用Android的Java層代碼(cocos2dx里訪問調用Android函數)!
- 【iOS-cocos2d-X 游戲開發之十四】Xcode中c++&amp;Object-C混編,詳細介紹如何在cocos2dx中訪問object函數以及Apple Api
- 【iOS-cocos2d-X 游戲開發之十五】Cocos2dx中響應Android的Back(返回)與Menu(小房子)事件&amp;&amp;Cocos2dx自動釋放粒子內存函數!
- 【iOS-cocos2d-X 游戲開發之十六】配置你的Cocos2dx項目編譯后的Android自動使用(-hd)高清圖&amp;設置Android自適應屏幕、縮放比例方法!
- 【Cocoa(mac) Application 開發系列之四】動作編輯器(Cocos2dx)制作流程詳解及附上響應鼠標滾軸事件、反轉坐標系、導入/創建資源目錄等知識點代碼!
- 【Cocos2d-X(2.x) 游戲開發系列之一】cocos2dx(v2.x)與(v1.x)的一些常用函數區別講解!在2.x版CCFileData類被去除等
- 【Cocos2d-X(2.x) 游戲開發系列之二】cocos2dx最新2.0.1版本跨平臺整合NDK+Xcode,Xcode編寫&amp;編譯代碼,Android導入打包運行即可!
- 【Cocos2dX(2.x)_Lua開發之三】★重要必看篇★在Lua中使用自定義精靈(Lua腳本與自創建類之間的訪問)及Lua基礎講解
- 【Cocos2d-X(2.x) 游戲開發系列之三】最新版本cocos2d&#173;2.0&#173;x&#173;2.0.2使用新資源加載策略!不再沿用-hd、-ipad、-ipadhd添加后綴方式
- 【Cocos2d-X(1.x 2.x) 修復篇】iOS6 中 libcurl.a 無法通過armv7s編譯以及iOS6中無法正常游戲橫屏的解決方法
- 【Cocos2d-X(1.x 2.x) 】iOS6與iphone5適相關設置隨筆(解決第三方類庫無法通過armv7s編譯的方法、添加Default-568h@2x.png)