Wie kann ich richtig nutzen CCSpriteFrameCache und CCSpriteBatchNode?
Verstehe ich nicht, was ich genau tun, wenn ich einen CCSpriteFrameCache oder CCSpriteBatchNode zu meinem cocos2d-Anwendung. Kann jemand bitte erklären Sie die folgenden Punkte (es wäre hilfreich, wenn Sie erklären könnten, ein paar; bitte schreiben Sie die entsprechenden Buchstaben vor deiner Antwort nach, welche Frage Sie beantworten):
[alle Fragen implizieren die Erreichung der besten Leistung und den niedrigsten memory-Nutzung]
a) Ist es entscheidend, zum erstellen von spritesheets für jede einzelne Schicht ? (Beispiel: Menü - eigene spritesheet, GameLayer - eigenen spritesheet...)
b) Kann jemand erklären, warum ich die hinzufügen von sprites, um die batch-Knoten, und was für eine batch-Knoten im Allgemeinen ist ?
b1)Also, warum kann ich nicht einfach etwas wie:
[[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"menusprites.plist"];
CCSpriteBatchNode *spriteSheet = [CCSpriteBatchNode batchNodeWithFile:@"menusprites.png"];
[self addChild:spriteSheet];
Und dann fügen Sie einfach die sprites auf meiner Schicht durch den Aufruf
CCSprite *mySprite = [CCSprite spriteWithSpriteFrameName:@""];
[self addChild:mySprite];
ohne Zugabe von Sie zu dem Knoten "batch"? Weil von dem, was ich verstehe, es funktioniert wie folgt :
Ich meine spritesheet mit allen sprites auf es auf den Bildschirm. Meine app geht dann in die plist und sucht die Koordinaten des Sprites, die ich anzeigen möchten, und dann stellen Sie es auf dem Bildschirm. Also, warum soll ich anrufen,
[spriteSheet addChild:mySprite];
?
c) Wie mache ich das dann loszuwerden, das spritesheet für das Gedächtnis dienen, wenn ich nicht, brauchen es nicht mehr ?
- Hier ist ein ziemlich guter 3 Teil Erklärung von code und web - Spiel sprites Film
Du musst angemeldet sein, um einen Kommentar abzugeben.
a) Es ist am besten als paar spritesheets (CCSpriteBatchNodes), wie möglich ist. Sprite-Dosierung reduziert draw-Aufrufe. Draw-Aufrufe sind teuer. Noch, jedem batch-Knoten erstellt eine draw-Aufruf. Deshalb wollen Sie so wenig wie möglich, weil das ultimative Ziel ist es, zu halten draw-Aufrufe so gering wie möglich.
b) Die CCSpriteBatchNode, dass alle seine Kinder in einem Zug, in einem Batch-zeichnen aufrufen. Das ist, warum Sie müssen hinzufügen von sprites, um die batch-Knoten, so kann es machen Sie alle zusammen. Nur sprites mit der gleichen textur wie der batch-Knoten können Hinzugefügt werden, um eine batch-Knoten, da kann man nur batch-schöpfen aus der gleichen textur. Wenn der Motor zum Umschalten von einer textur zur anderen, gibt es eine neue Attraktion nennen.
b1) Sie können das nicht, weil die batch (Knoten) erbringt Ihre Kinder. Wenn Sie fügen Sie die sprites zu einem anderen Knoten, jedes sprite zeichnet sich selbst, was bedeutet, dass eine zusätzliche draw-call-pro-sprite. Und die sprite-batch-Knoten nichts zu tun hat.
c) Die CCSpriteBatchNode ist einfach nur ein normaler Knoten. Sie können entfernen Sie es aus der Szene, wie alle anderen Knoten. Die textur und sprite-frames werden zwischengespeichert, in der CCTextureCache und CCSpriteFrameCache singleton-Klassen. Wenn Sie möchten, entfernen Sie die Texturen und sprite-Bildern aus dem Speicher Sie haben, es zu tun über die cache-Klassen.
a) keine
b) batchNode erhöht Ihre Leistung, wenn Sie zeichnen müssen viele sprites zur gleichen Zeit, im Falle der kleinen Anzahl von sprites (10, 20. etc.) ich glaube nicht, dass Sie bemerken, die Leistung steigt. batchNode ist viel schneller, da opengl ziehen sollte nur um zu sehen, alle Inhalte. im anderen Fall opengl zeichnen Sie alle Ihre Objekte separat. das ist - wenn Sie haben 500, 600, 700 sprites, die
draw()
undvisit()
Methoden aufgerufen werden können. wenn Sie alle platziert werden, um das batchNode, es wird nur eindraw()
Anruf und einvisit()
nennenc) Sie können die purge Cache-Daten manuell zu erzwingen, Speicher freigeben, indem Sie den Aufruf dieser Methoden: