2012-11-12 8 views
6

Böyle bir yapılandırmaya sahip bir CCSpriteBatchNode var: bütün çocuklar (ChildA1, ChildB1, ChildA2 ...) CCSprite nesnelerdirCCSpriteBatchNode: Çocuk Çocuğu çizim performans kazanımı alıyor mu?

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

.

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

ChildA1 böyle oluşturulur: CCSpriteBatchNode ve tüm çocukların ama ChildA1 yoluyla oluşturulur

// 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 

Not: Bu sadece iyi işler ve ben bekliyoruz çıkışı childB1 'ın bkz konum childA1'a göredir ve childA1 taşınıyor, childB1 taşınıyor.

Sorum şu: childB1 - childB999 - childB999 her birinde çizimde bir performans artışı görecek miyim? Anladığım kadarıyla, CCSpriteBatchNode, CCSpriteBatchNode numaralı telefondaki tüm çocukların çizimini CCSprites tüm çocuğunu birlikte çizerek optimize eder. Bu aynı zamanda CCSprites'un çocuklarına da uygulanıyor mu? bunun yalnızca üst yönlendirerek CCSprites bir grup işlemek için bana izin verir birçok katmanları bu oyun içinde vardır ve bir CCSpriteBatchNode içinde CCSpriteCCSprites gruplama: isteyenler için

Bunu yapmamın neden bilmek sprite grubu.

+3

AFAIK, evet. Eğer cocos2.0 veya üstünü kullanıyorsanız, çizim sayısını kontrol edin, bazı çocukları ekleyin, artmamalıdır. Örneğin, parti düğümü, her doku için tek bir çizim çağrısı yapar ('sprite eklendi' ifadesinin aksine). ARC' olup olmadığını bilmiyorum, fakat eğer siz değilseniz, muhtemelen childA1'i yazılı olarak sızdırıyorsunuz (bu kurucu, otomatik olarak çalıştırılan bir nesneyi geri göndermez). – YvesLeBorg

+0

YvesLeBrog ile aynı fikirdeyim .. Cocos2d için Doku Belleği hakkında konuşuyorsanız, görüntü veya doku başına yüklenmiştir. Bir doku belleğe yüklendikten sonra, ne bellek ne de tekrar yüklenecek zaman alır, bu da oyunun performansında iyileşme sağlar. Sizin değişkenleriniz tarafından tüketilen bellekle ilgili olarak, bunun CCSprite örneklerinin kendi sınıfında otomatik olarak yayınlanması olduğundan bunun ideal bir yol olduğunu düşünmüyorum. Bu yüzden onların hafıza tüketimi hakkında endişelenmemize gerek yok. –

cevap

2

Kısa cevap, evet, CCSpriteBatchNode, tüm dolaylı alt öğeleri de dahil olmak üzere tüm çocuk düğümleri için tek bir çağrı yapacak. Bununla birlikte, bu düzenli CCSprites kullanmaktan daha iyi performans gösterip göstermediği, spriteları ne sıklıkta değiştirdiğinize bağlı olarak değişir. Bir CCSpriteBatchNode kullandığınızda, bir sprite'ı her değiştirdiğinizde, o sprite ve tüm çocukları için GPU yerine CPU kullanan doku atlas dörtlü koordinatlarını yeniden hesaplamanız gerekir. Örneğin, ChildA1 konumunu taşırsanız, ChildB1 - ChildB999 için koordinatlar bir sonraki çerçeve oluşturulmadan önce yeniden hesaplanır. Çoğu uygulamada, openGL çizimindeki azalma, ekstra aramaların maliyetini artırır, çünkü çekme çağrıları nispeten pahalıdır, ancak sonuçta uygulamanıza ve sprite nasıl kullanıldığına bağlı olacaktır. Bu bir performans darboğaz ise, uygulamanız.

İlgili konular