Cum utilizez corect CCSpriteFrameCache și CCSpriteBatchNode?

Nu înțeleg ce fac atunci când adaug un CCSpriteFrameCache sau CCSpriteBatchNode în aplicația mea cocos2d. Poate cineva să explice următoarele puncte (ar fi util dacă ați putea explica câteva dintre ele, scrieți scrisoarea corespunzătoare în fața răspunsului dvs. în funcție de care răspuns răspundeți):

[toate întrebările implică atingerea celei mai bune performanțe și a celei mai mici utilizări a memoriei]

a) Este crucial să creați foi de sprite pentru fiecare strat? (De exemplu: Meniu - foaie de date proprie, GameLayer - foaie de date proprie ...)

b) Poate cineva să explice de ce trebuie să adaug sprites la nodul lotului și, în general, nodul lot?

b1) Deci, de ce nu pot face ceva de genul:

      [[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"menusprites.plist"];
       CCSpriteBatchNode *spriteSheet = [CCSpriteBatchNode batchNodeWithFile:@"menusprites.png"];
      [self addChild:spriteSheet];

Și apoi adăugați sprites la nivelul meu prin apel

CCSprite *mySprite = [CCSprite  spriteWithSpriteFrameName:@""]; 
[self addChild:mySprite];

fără a le adăuga la nodul lotului? Deoarece din ceea ce înțeleg că funcționează astfel:

Îmi adaug prietena cu toți spritele pe ecran. Aplicația mea merge apoi în plist și caută coordonatele spritei pe care vreau să o afișez și apoi o plasează pe ecran. Deci, de ce ar trebui să sun

[spriteSheet addChild:mySprite];

?

c) Cum să scap de foaia de spirite în memorie atunci când nu mai am nevoie de ea?

0
Iată o explicație destul de bună din 3 părți prin cod și pe web - joc de filme sprites
adăugat autor uchamp, sursa

2 răspunsuri

a) Cel mai bine este să creați cât mai puține foi de lucru (CCSpriteBatchNodes). Dozarea de sprite reduce apelurile. Egalările sunt scumpe. Totuși, fiecare nod de lot creează un apel de remiză. Deci, doriți să utilizați cât mai puține posibil, deoarece obiectivul final este de a menține apelurile cât mai mici posibil.

b) CCSpriteBatchNode îi redă pe toți copiii într-o singură etapă, într-un apel de egalitate. De aceea, trebuie să adăugați sprites la nodul lotului, astfel încât să le poată face toate împreună. Numai sprite folosind aceeași textura ca și nodul lot pot fi adăugate la un nod lot, deoarece puteți doar lotul trage din aceeași textura. Ori de câte ori motorul trebuie să treacă de la o textura la alta, emite un nou apel de remiză.

b1) Nu puteți face acest lucru, deoarece nodul de lot își face copiii. Dacă adăugați sprites la orice alt nod, fiecare sprite se trage singur, ceea ce înseamnă un apel suplimentar de extragere pe sprite. Și nodul lotului sprite nu are nimic de făcut.

c) CCSpriteBatchNode este doar un nod obișnuit. Puteți să o eliminați din scenă ca orice alt nod. Straturile de textură și sprite sunt stocate în cachele CCTextureCache și CCSpriteFrameCache singleton. Dacă doriți să eliminați texturile și cadrele sprite din memorie, trebuie să le faceți prin clasele cache.

0
adăugat
Înțeleg acum ... Întotdeauna durează ceva timp pentru a înțelege pe deplin ce se întâmplă, dar acum înțeleg, vă mulțumesc.
adăugat autor the_critic, sursa
Wow! Tocmai am obținut cea mai mare experiență AHA de când am început cu Cocos2d. Nu pot să cred că nu am mai făcut asta. Am incercat in ultima vreme sa construiesc un motor de tigla hexagonala care pastreaza un echilibru de 50-60FPS dar nu am putut intelege de ce era lent, desi aveam doar un tip de tigla care folosea batchnode. Dar am facut greseala de a pune spritele in alt nod, de asemenea, si am continuat sa primesc apeluri de 70-80 pentru toate piesele vizibile pe ecran. Voi încerca acest lucru de îndată ce am mâinile pe computerul meu din nou. Mulțumesc, Steffen!
adăugat autor bobmoff, sursa
Deci, există o limită predefinită a numărului de foi de sondaj pe care le putem folosi?
adăugat autor Renaissance, sursa
  • a) nu

  • batchNode îți mărește performanța atunci când trebuie să desenezi mai multe sprite simultan, în cazul unui număr mic de sprites (10, 20 etc.) nu cred că vei observa o creștere a performanței. batchNode este mult mai rapidă, deoarece opengl ar trebui să deseneze doar pentru a vedea tot conținutul. în cazul în care opengl va atrage toate obiectele separat. care este - dacă veți avea 500, 600, 700 sprites, vor fi invocate metodele draw() și visit() . dacă toate vor fi plasate în lotul Nod, va fi doar un apel draw() și un call apel

  • c) puteți șterge manual datele cache pentru a forța eliberarea memoriei apelând aceste metode:


[CCTextureCache purgeSharedTextureCache];
[CCSpriteFrameCache purgeSharedSpriteFrameCache];
[CCAnimationCache purgeSharedAnimationCache];
0
adăugat