2012-11-12 9 views
6

Mam CCSpriteBatchNode w konfiguracji jak poniżej:CCSpriteBatchNode: Czy dziecko dziecka otrzymuje przyrost wydajności rysunku?

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

Jeżeli wszystkie dzieci (ChildA1, ChildB1, ChildA2 ...) są CCSprite obiekty. CCSpriteBatchNode i wszystkie dzieci, ale ChildA1 tworzony jest poprzez:

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

ChildA1 jest tworzony tak:

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

Uwaga: To czyni dobrze i widzę wyjście spodziewam, gdzie childB1 „s pozycja jest określana jako childA1, a przenoszenie childA1 powoduje przesunięcie childB1.

Moje pytanie brzmi następująco: Czy widzę wzrost wydajności na rysunku każdego z childB1 - childB999? Z tego co rozumiem, CCSpriteBatchNode optymalizuje rysunek wszystkich dzieci w ramach CCSpriteBatchNode, rysując razem całe swoje dziecko CCSprites. Czy odnosi się to również do dzieci tych CCSprites?

Dla tych, którzy chcą wiedzieć, dlaczego to robię: Istnieje wiele warstw w tej grze i grupowanie CCSprites wewnątrz CCSprite w CCSpriteBatchNode pozwala mi manipulować grupę CCSprites manipulując tylko rodzica, który grupa duszków.

+3

AFAIK, tak. Jeśli używasz cocos2.0 lub wyższej, sprawdź liczbę losowań, dodaj trochę dzieci, nie powinno to wzrosnąć: np. Węzeł wsadowy zużywa jedno losowanie na każdą dodaną teksturę (w przeciwieństwie do "dodania sprite'a"). Nie wiem, czy jesteś ARC'ing, ale jeśli nie jesteś prawdopodobnie wyciekasz childA1 jak napisano (konstruktor nie zwraca autoreleased obiektu). – YvesLeBorg

+0

Zgadzam się z YvesLeBrog .. Jeśli mówisz o pamięci tekstury dla Cocos2d, jest ona załadowana na obraz lub teksturę. Gdy tekstura zostanie załadowana do pamięci, ani jej pamięć, ani czas nie wymagają ponownego załadowania, co powoduje poprawę wydajności gry. Odnośnie do pamięci zużywanej przez zmienne, nie sądzę, aby było to idealne rozwiązanie, ponieważ instancje CCSprite są autorelease w samej klasie. Nie musimy więc martwić się o zużycie pamięci. –

Odpowiedz

2

Krótka odpowiedź brzmi, tak, CCSpriteBatchNode wykona jedno wezwanie do losowania dla wszystkich węzłów potomnych, w tym wszystkich pośrednich potomków.

Jednak to, czy działa to lepiej niż zwykłe CCSprites zależy od tego, jak często modyfikujesz duszki. Kiedy używasz CCSpriteBatchNode, za każdym razem gdy modyfikujesz duszka, będzie musiał ponownie obliczyć współrzędne kwadratu atlasu tekstury dla tego duszka i wszystkich jego dzieci używając procesora zamiast GPU. Na przykład, jeśli przeniesiesz pozycję ChildA1, współrzędne od ChildB1 do dozostaną ponownie obliczone przed wyrenderowaniem następnej klatki. W większości aplikacji redukcja rysunków w OpenGL wywołuje wagę kosztów dodatkowych obliczeń, ponieważ wywołania remisowe są stosunkowo kosztowne, ale ostatecznie zależy to od aplikacji i sposobu użycia sprite'ów - sugerowałbym więc wykonanie rzeczywistych pomiarów dla twoja aplikacja, jeśli jest to wąskie gardło wydajności.

Powiązane problemy