cocos2d-x學習筆記:SpriteBatchNode

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 纔會是你最後的選擇(你需要對它的限制條件很熟悉)。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章