SpriteBatchNode的作用大致可理解爲:
在開發遊戲時,當一個層中需要使用多個相同的圖片進行渲染某個sprite時,爲了避免同樣的圖片重複渲染,所以使用該類來創建精靈。代碼大致如下:
SpriteBatchNode* node = SpriteBatchNode::create("test.png");
if( !node )
return false;
this->addChild(node);
auto sprite1 = Sprite::create("test.png");
sprite2->setPosition(200 ,300);
node->addChild(sprite1);
<pre name="code" class="cpp">auto sprite2 = Sprite::create("test.png");
sprite2->setPosition(300 ,300);
node->addChild(sprite2);
上述代碼中,兩個精靈使用的是同一個圖片,所以,在cocos2d-x2.2版本中,上面的代碼會避免重複渲染同樣的圖片導致幀率下降。
但是在3.0的版本中,已經不推薦這麼做了,以下引用來自
https://github.com/fusijie/Cocos2dx-Release-Note/blob/master/cocos2d-x_v3.0_release_notes.md#sprite-%E5%92%8C-spritebatchnode
Sprite 和 SpriteBatchNode
v2.2 2.2版本中推薦的優化遊戲方式是將 SpriteBatchNode
對象設置爲 Sprite
對象的父節點。
雖然使用SpriteBatchNode
對象仍然是一個非常好的優化遊戲的方式,但是它仍然有一定的限制:
Sprite
對象的孩子只能是Sprite
(否則,Cocos2d-x 會觸發斷言)- 當
Sprite
的父節點是SpriteBactchNode
時,不能添加ParticleSystem
作爲Sprite
的子節點。 - 這將導致當
Sprite
的父節點是SpriteBatchNode
時,不能使用ParallaxNode
- 當
- 所有的
Sprite
對象必須共享相同的紋理ID (否則,Cocos2d-x 會觸發斷言) Sprite
對象使用SpriteBatchNode
的混合函數和着色器。
雖然 v3.0 仍然支持 SpriteBatchNode
(與之前的版本擁有相同的特效和限制),但是我們不鼓勵使用它。相反,我們推薦直接使用 Sprite
,不需要再它作爲子節點添加到 SpriteBatchNode
中。
但是,爲了能讓 v3.0 有更好的表現,你必須要確保你的 Sprite
對象滿足以下條件:
- 貢獻相同的紋理ID(把它們放在一個spritesheet中,就像使用
SpriteBatchNode
一樣) - 確保它們使用相同的着色器和混合函數(就像使用
SpriteBatchNode
一樣)
如果這麼做, Sprites
將會像使用 SpriteBatchNode
一樣的快...(在舊設備上大概慢了10%,在新設備上基本上察覺不出)
v2.2 和 v3.0 最大的區別在於:
Sprite
對象可以有不同的紋理ID。Sprite
對象可以有不同種類的Node
作爲子節點,包括ParticleSystem
。Sprite
對象可以有不同的混合函數和不同的着色器。
但是如果你這麼做,渲染器
可能無法對它所有的子節點進行批處理(性能較低)。但是遊戲仍然可以正常運行,不會觸發任何斷言。
總結:
- 保持將所有的精靈放在一張大的 spritesheet 中。
- 使用相同的混合函數(使用默認)
- 使用相同的着色器(使用默認)
- 不要將精靈添加到
SpriteBatchNode
只有當你需要一些額外的性能上提升(雖然很小),SpriteBatchNode
纔會是你最後的選擇(你需要對它的限制條件很熟悉)。