2014-05-04 8 views
7

Gibt es eine Möglichkeit, eine SKTexture aus einem SKShapeNode zu erstellen? Es ist bekannt, dass Formknoten Speicherprobleme verursachen, und ich suche nach einer Möglichkeit, aus ihnen eine statische Grafik zu erstellen (vorzugsweise .png).Erstellen einer SKTexture aus einem SKShapeNode

textureFromNode:

Renders und gibt eine Sprite Kit Textur, die den Inhalt des Knotens enthält

+0

Aus Neugier, welche Arten von Speicherproblemen haben Sie mit SKShapeNodes? – prototypical

+0

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. –

+0

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

Antwort

11

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.

+0

Jetzt ist es spät, aber ich versuche, meinen ShapeNode in SpriteNode zu konvertieren und das Problem ist, dass die Textur nicht mit nodeFromTexture erstellt wird. NSLog meiner Textur kehrt zurück (null), so dass meine Textur leer ist, nachdem ich es kiste? – MOzeb

Verwandte Themen