können Sie die textureFromNode:
Hier ist von der Referenz genannt SKView
Methode verwenden.
- (SKTexture *)textureFromNode:(SKNode *)node
Parameter
Knoten
Ein Knoten Objekt, das die Inhalte, die Sie auf die Textur machen möchten.
Rückgabewert
Ein Sprite Kit Textur, die das gerenderte Bild hält.
Diskussion Der gerenderte Knoten muss nicht in der dargestellten Szene der Ansicht angezeigt werden. Die neue Textur wird mit einer Größe erstellt, die dem Rechteck entspricht, das von der calculateAccumulatedFrame-Methode des Knotens zurückgegeben wird. Wenn der Knoten kein Szenenknoten ist, wird er mit einer klaren Hintergrundfarbe gerendert ([SKColor clearColor]).
UPDATE-- Nach SKShapeNode ein wenig zu erkunden und es in der Tat ein Speicherverlust Problem revolvierenden war die Überprüfung um einen Pfad zuweisen und dann den Knoten zu entfernen, ich hatte eine Idee ...
Nicht wirklich eine neue Idee, mehr von einem zweckentfremdeten. Diese wunderbare Idee erlaubte mich eigentlich SKShapeNodes mein Herz Inhalt zu verwenden :)
POOLING
Yep ... Ich habe gerade einen Pool von SKShapeNodes, die ich je nach Bedarf wiederverwendet werden. Was für ein Unterschied das macht :) Definieren Sie den Pfad einfach neu, wann immer es nötig ist, wenn Sie mit zurück zu Ihrem Pool gehen, und er wird dort warten, damit Sie zu einem späteren Zeitpunkt wieder mit ihm spielen können.
Sie definieren den Pfad einfach neu, wann immer Sie ihn benötigen, wenn Sie mit zurück zu Ihrem Pool gehen, und er wird dort warten, damit Sie zu einem späteren Zeitpunkt wieder mit ihm spielen können.
Erstellen Sie einen Ivar oder Eigenschaft NSMutableArray
in Ihrem Pool SKScene
und erstellen Sie es, wenn Sie die SKScene
initiieren. Sie können das Array entweder mit Ihren Formknoten während der Initialisierung füllen oder Sie können sie nach Bedarf erstellen.
Das ist etwas, schnelle Methode, die ich für die Ergreifung eines neuen Knotens aus dem Pool erstellt:
-(SKShapeNode *)getShapeNode
{
if (pool.count > 0)
{
SKShapeNode *shape = pool[0];
[pool removeObjectAtIndex:0];
return shape;
}
// if there is not any nodes left in the pool, create a new one to return
SKShapeNode *shape = [SKShapeNode node];
return shape;
}
Egal, wo in der Szene, die Sie eine SKShapeNode müssen Sie dies tun würde:
SKShapeNode *shape = [self getShapeNode];
// do whatever you need to do with the instance
Wenn Wenn Sie den Formknoten verwenden, geben Sie ihn einfach in den Pool zurück und setzen Sie den Pfad auf. Zum Beispiel:
[pool addObject:shape];
[shape removeFromParent];
shape.path = NULL;
Ich weiß, dass es eine Abhilfe ist und keine ideale Lösung, aber sicherlich ist dies eine sehr praktikable Abhilfe für alle, die eine große Anzahl von SKShapeNodes zu verwenden und nicht Speicher bluten.
Aus Neugier, welche Arten von Speicherproblemen haben Sie mit SKShapeNodes? – prototypical
Hier ist ein paar Infos dazu http://sartak.org/2014/03/skshapenode-you-are-dead-to-me.html Ich habe ungefähr 80 statische nicht-animierende Formknoten in meiner Szene (ein Brettspiel) und Es läuft rund 20fps auf einem iPad der 3. Generation. –
Das Ausführen von 20 Bildern pro Sekunde ist kein Speicherproblem, das ist ein Leistungsproblem. Ich habe die Einschränkungen von 'SKShapeNode' in Bezug auf Speicher nicht getestet, aber es scheint, dass CGPath das eigentliche Problem ist. Verwendet 'SKShapeNode' nicht nur den Pfad, den Sie mit CGPath erstellt haben? Eine weitere Möglichkeit, das Framrate-Problem zu lösen, besteht schließlich darin, den 'SKShapeNode' in einen' SKEffectNode' einzubinden und die 'shouldRasterize' Eigenschaft des' SKEffectNode' zu verwenden. Das wird das Bild "flatten" und die Leistung drastisch erhöhen, wenn Sie viele Formknoten haben. – prototypical