2012-11-30 41 views
3

有人會考慮以下場景並給我一個建議:我正在實現一個基本的cocos2d遊戲,其中一個GameplayLayer獲得了一個CCSpriteBatchNode。我有一個遊戲對象:CCNode有3個CCSprites像這樣:構圖和CCSpriteBatchNode的遊戲對象續

CCSprite *bodySprite;  
CCSprite *hairSprite; 
CCSprite *eyesSprite; 

當初始化GameObject我加入精靈到GameObject作爲其子像這樣:

[self addChild:bodySprite]; 
[self addChild:hairSprite]; 
[self addChild:eyesSprite]; 

這樣我可以改變位置,旋轉等節點(GameObject)和所有精靈將受到更改但是影響當我添加多個GameObject s到"each sprite draws itself, which means one additional draw call per sprite"是一個主要性能問題。

要解決性能問題,閱讀this post後,我決定在初始化到GameObject的精靈,以GameplayLayer'加s CCSpriteBatchNode像這樣:

[[GameplayLayer sharedGameplayLayer].sceneSpriteBatchNode addChild:bodySprite]; 
[[GameplayLayer sharedGameplayLayer].sceneSpriteBatchNode addChild:hairSprite]; 
[[GameplayLayer sharedGameplayLayer].sceneSpriteBatchNode addChild:eyesSprite]; 

只是現在,我必須設置的位置在GameObject的精靈一個接一個,而不是

self.position = ... 

我不得不使用

bodySprite.position = ... 
hairSprite.position = ... 
eyesSprite.postion =... 

這是一個單調乏味的變化,我失去了將我的GameObject設計爲精靈組合的最大好處之一。

問題:是否有使用該節點的現在的位置是影響合成精靈位置的方式,我可以添加他們爲孩子們既GameObjectsceneSpriteBatchNode?如果不是什麼正確的做法,它是否一個接一個地設定精靈的位置?

回答

1

首先,「主要表現」是相對的。如果這是你唯一的精靈,你將不會看到精靈對它們進行批處理的效果。如果您同時在屏幕上顯示數十個圖標,這是一個不同的故事。

您不能同時向兩個父母添加節點。

你可以做的是創建一個「容器」精靈。使用紋理(與sprite批處理節點紋理相同)和CGRectEmpty作爲紋理矩形創建一個CCSprite。這使得精靈不會繪製任何東西,並且可以像使用CCNode添加到CCSpriteBatchNode一樣使用它。

然後你可以添加你的精靈到那個看不見的精靈,並使用容器精靈來影響它的子精靈的位置,旋轉等,就像你以前一樣。

+0

很酷:)非常感謝你,我會嘗試儘快...是的,平均而言,我有20個GameObjects在同一時間,這使得我的幀速率下降到40幀/秒以下:/ –

+0

嗨,我確實嘗試了建議解決方案,它確實有效......唯一的問題是我依賴節點的位置並將整個紋理作爲紋理貼圖(即使不可見)將使我改變依賴於節點位置的邏輯。我目前正在重新設計整個事情。 –