2016-08-03 43 views
0

Ich habe eine Anwendung, die Texturen Szene Kit folgendes erzeugt:Wie Speicher von SKTexture erstellt freizugeben

 let texture = SKTexture(image: image) 

Das Problem ist, dass nach mehreren Anrufen, stürzt die Anwendung aufgrund der geringen Speicher.

Ich brauche wirklich nur die zuletzt erstellte Textur, so dass bei der Erstellung einer neuen, der Speicher der Vorschau freigegeben werden kann, aber Scene Kit scheint diese Texturen zu halten, auch wenn sie nicht mehr verwendet werden (Die Knoten sind nicht länger Teil der Szene).

Wie kann ich Scene Kit manuell mitteilen, um den Speicher und Cache der Textur freizugeben, damit ich nicht in die Situation des Absturzes mit wenig Speicher gerät?

Ich weiß auch, dass die SceneKit-Dokumentation empfiehlt, alle Verweise auf die Textur zu entfernen, indem Knoten und dergleichen entfernt werden, aber das sollte geschehen und doch wird die Textur nicht freigegeben. Gibt es eine gute Möglichkeit zu debuggen und zu sehen, was sich an der Referenz hält?

Beim erneuten Überprüfen des Codes erstelle ich eine Szene, in der das Bild in der primären Szene gerendert werden soll (dessen Knoten sich nicht ändert). Grundsätzlich gibt es ein Objekt in der Szene, das ein Bild oder ein Video anzeigen kann und das durch das Zurückgeben einer Szene, die als Material für diffuse Inhalte verwendet wird, ersetzt wird.

let texture = SKTexture(image: image) 
let sprite = SKSpriteNode(texture: texture) 
let scene = SKScene(size: sprite.size) 
sprite.position = CGPointMake(CGRectGetMidX(scene.frame), CGRectGetMidY(scene.frame)); 
scene.addChild(sprite) 

Und dann hier verwendet:

primaryObjectMaterial.diffuse.contents = scene 

Ich würde erwarten, wenn das Knotenmaterial Inhalt verändert der Szene, diese Szene (und die Textur und Bild) freigegeben würden, da es nicht mehr wären irgendwelche Hinweise darauf, aber vielleicht hängt das Caching-System an etwas oder ich mache etwas falsch?

+0

http://stackoverflow.com/questions/21025295/how-do-i-ge-rid-of-skisteures –

+0

Ich sehe, wo Sie legen, dass die Knoten nicht mehr ein Teil der Szene sind, aber entfernen Sie tatsächlich die Knoten? –

+0

@Oleksii: Dieser Link empfiehlt nicht Imagenamed zu verwenden, was ich mache. – Gujamin

Antwort

0

Es ist schwer, Ihnen eine genaue Antwort zu geben, mit aus Ihrem Code oder zu wissen, wie die App-Werke sehen, aber Sie müssen den Knoten nehmen, die die Textur auf und entfernen es

nameOfNode.removeFromParentNode 

Dieses aus entfernen wird es Speicher und Sie müssen einen neuen Knoten mit der neuen Textur hinzufügen.

+0

Das Ding ist der Knoten wird nicht entfernt. Ich ändere nur den Inhalt des Materials. Der Materialinhalt kann ein Bild oder ein Video sein, weshalb der Materialinhalt eine eigene Szene ist. Wäre es besser, einen Verweis auf diese Szene zu behalten und sie manuell zu zerstören, bevor die Ersatz-Szene erstellt wird? – Gujamin