2012-11-12 118 views
6

我有一個CCSpriteBatchNode有這樣的配置:CCSpriteBatchNode:孩子的孩子是否收到繪畫表現收益?

CCSpriteBatchNode 
    ChildA1 
     ChildB1 
     ChildB2 
     .... 
     ChildB999 
    ChildA2 
    ChildA3 
    ... 

所有兒童(ChildA1,ChildB1,ChildA2 ...)是CCSprite對象。

[CCSprite spriteWithSpriteFrameName:@"FileName.png"]; 

ChildA1是這樣產生:將CCSpriteBatchNode和所有的孩子,但ChildA1通過創建

// Create Parent Sprite 
CCSprite* childA1 = [[CCSprite alloc] init]; 
childA1.contentSize = CGSizeMake(37.5,37.5); 
childA1.anchorPoint = ccp(0,0); 
[batchNode addChild:childA1 z:0 tag:1]; 

// Add Child Sprites 
[childA1 addChild:childB1 z:0 tag:1]; 
[childA1 addChild:childB2 z:0 tag:1]; 
[childA1 addChild:childB3 z:0 tag:1]; 
// Continue adding childB4-childB999 

注:這使得蠻好的,我看到輸出我預計,其中childB1的位置相對於childA1,並且移動childA1導致childB1移動。

我的問題是這樣的:我會看到一個性能增益繪製每個childB1 - childB999?據我所知,CCSpriteBatchNode通過將其所有子女CCSprites繪製在一起,優化了CCSpriteBatchNode內所有兒童的繪圖。這是否也適用於那些CCSprites的孩子?

對於那些誰想知道爲什麼我這樣做: 有此遊戲中的許多層和CCSpriteBatchNode內分組CCSprites一個CCSprite內讓我通過操縱僅是母公司操縱一組CCSprites小組小組。

+3

AFAIK,是的。如果您使用的是cocos2.0或更高版本,請檢查繪圖數量,添加一些孩子,但不應該增加:即,批處理節點會添加每個紋理添加的單個繪圖調用(與「添加每個精靈」相反)。不知道你是否是ARC'ing,但是如果你不是你,你可能會像寫入的那樣泄漏childA1(構造函數不返回自動釋放對象)。 – YvesLeBorg

+0

我同意YvesLeBrog ..如果你談論Cocos2d的紋理內存,它加載的每個圖像或紋理。一旦將紋理加載到內存中,既不需要內存也不需要時間來重新加載它,這導致遊戲性能的提高。關於你變量消耗的內存,我不認爲這是理想的方式,因爲CCSprite實例在它自己的類中自動釋放。所以我們不必擔心他們的內存消耗。 –

回答

2

簡而言之,是的,CCSpriteBatchNode將爲所有子節點(包括所有間接子孫)進行一次繪製調用。

但是,這種效果是否比使用常規的CCSprites更好取決於你多久修改一次精靈。當您使用CCSpriteBatchNode時,每次修改精靈時,都需要使用CPU而不是GPU重新計算該精靈及其所有孩子的紋理圖集四座標。舉個例子,如果你移動ChildA1的位置,ChildB1ChildB999的座標將在下一幀被渲染之前被重新計算。在大多數應用程序中,openGL draw的減少會調用額外計算的成本,因爲draw調用相對昂貴,但最終取決於您的應用程序以及它如何使用sprite--所以我建議將實際測量值你的應用程序,如果這是一個性能瓶頸。