參考來源:Learning Cocos2D
當想要在螢幕上創建一個Sprite時,你可以翻一下CCSprite裡面的方法,其中有一個叫做draw,他其實就是使用OpenGL ES的繪圖。每一個視訊圖(frame)都會呼叫一次draw,draw裡面就會用OpenGL ES去把圖畫在螢幕上,所以OpenGL必須綁到那個CCSprite的材質(texture)上,然後把Sprite渲染到螢幕上。
但是,iOS提供的OpenGL ES dirver會轉換OpenGL ES呼叫到真實的硬體組合程式碼在GPU上執行。每一個OpenGL ES呼叫都需要一些CPU cycles處理OpenGL ES driver。所以,OpenGL ES呼叫是越少越好,這樣執行才會順暢。
假設你有一百個sprites要渲染到螢幕上,你一個一個去寫code渲染嗎?事實上你可以一次把全部的材質直接送到OpenGL裡面去,就是使用CCSpriteBatchNode和atlas texture。
這個class繼承自CCNode,而且在他的head file用了一行code表示可以使用CCSprite類作為靜態類別宣告:
@class CCSprite;
若使用這個類,所有CCSprites的draw呼叫都會一次處理,所有OpenGL ES綁定呼叫會減少成一次呼叫。
現在稍微就使用說明一下,首先要如何使用CCSpriteBatchNode呢?
CCSpriteBatchNode *batch;
CCSpriteBatchNode *batch = [CCSpriteBatchNode batchNodeWithFile: @" bullet.png "];
以上兩種都可以,當然最好還是有個初始值。
那假設要加入一百發子彈,接下來就這樣寫:
for ( int i=0; i<100; i++ ) {
CCSprite *bullet = [CCSprite spriteWithFile: @" bullet.png "];
[batch addChild: bullet];
}
你可以注意到,CCSpriteBatchNode只是加入材質或是CCSprtie,但不負責顯示,這其實跟CCLayer很像,只是CCLayer可以加入的東西很多,不像CCSpriteBatchNode只能加入CCSprite。
注意到,他可以把圖片檔案作為參數來加入,是因為所有的CCSprite node都以同樣的材質加到CCSprtieBatchNode裡面去,如果你沒有注意這點,debug時就會出現你並沒有使用相同的材質id的訊息。
所以,當你要使用兩個以上的相同種類的CCSprite時,你就可以用CCSpriteBatchNode。以上例來說,假設你要發射的子彈你希望他們顯示在螢幕上面時是有前有後的,那因為一個CCSpriteBatchNode只有一個z值,所以你可能要使用部兩個或兩個以上CCSpriteBatchNode然後是不同的z值。
而使用Texture Atlas的好處就是,當你加入一個textue atlas到CCSpriteBatchNode時,你就可以使用上面全部的圖,而不用分成好幾個CCSpriteBatchNode去渲染不同的圖了,不然受限於一個CCSprtiteBatchNode必須使用同樣的材質,你就無法一次搞定了。
先寫到這邊。
當想要在螢幕上創建一個Sprite時,你可以翻一下CCSprite裡面的方法,其中有一個叫做draw,他其實就是使用OpenGL ES的繪圖。每一個視訊圖(frame)都會呼叫一次draw,draw裡面就會用OpenGL ES去把圖畫在螢幕上,所以OpenGL必須綁到那個CCSprite的材質(texture)上,然後把Sprite渲染到螢幕上。
但是,iOS提供的OpenGL ES dirver會轉換OpenGL ES呼叫到真實的硬體組合程式碼在GPU上執行。每一個OpenGL ES呼叫都需要一些CPU cycles處理OpenGL ES driver。所以,OpenGL ES呼叫是越少越好,這樣執行才會順暢。
假設你有一百個sprites要渲染到螢幕上,你一個一個去寫code渲染嗎?事實上你可以一次把全部的材質直接送到OpenGL裡面去,就是使用CCSpriteBatchNode和atlas texture。
這個class繼承自CCNode,而且在他的head file用了一行code表示可以使用CCSprite類作為靜態類別宣告:
@class CCSprite;
若使用這個類,所有CCSprites的draw呼叫都會一次處理,所有OpenGL ES綁定呼叫會減少成一次呼叫。
現在稍微就使用說明一下,首先要如何使用CCSpriteBatchNode呢?
CCSpriteBatchNode *batch;
CCSpriteBatchNode *batch = [CCSpriteBatchNode batchNodeWithFile: @" bullet.png "];
以上兩種都可以,當然最好還是有個初始值。
那假設要加入一百發子彈,接下來就這樣寫:
for ( int i=0; i<100; i++ ) {
CCSprite *bullet = [CCSprite spriteWithFile: @" bullet.png "];
[batch addChild: bullet];
}
你可以注意到,CCSpriteBatchNode只是加入材質或是CCSprtie,但不負責顯示,這其實跟CCLayer很像,只是CCLayer可以加入的東西很多,不像CCSpriteBatchNode只能加入CCSprite。
注意到,他可以把圖片檔案作為參數來加入,是因為所有的CCSprite node都以同樣的材質加到CCSprtieBatchNode裡面去,如果你沒有注意這點,debug時就會出現你並沒有使用相同的材質id的訊息。
所以,當你要使用兩個以上的相同種類的CCSprite時,你就可以用CCSpriteBatchNode。以上例來說,假設你要發射的子彈你希望他們顯示在螢幕上面時是有前有後的,那因為一個CCSpriteBatchNode只有一個z值,所以你可能要使用部兩個或兩個以上CCSpriteBatchNode然後是不同的z值。
而使用Texture Atlas的好處就是,當你加入一個textue atlas到CCSpriteBatchNode時,你就可以使用上面全部的圖,而不用分成好幾個CCSpriteBatchNode去渲染不同的圖了,不然受限於一個CCSprtiteBatchNode必須使用同樣的材質,你就無法一次搞定了。
先寫到這邊。
留言
張貼留言