iPhone Speicher Management didReceiveMemoryWarning
Ok......
Ich bin die Implementierung ein einfaches OpenGL ES-Anwendung auf dem iPhone und vor kurzem habe ich in Pinch Media Analytics. Tun, das half, entdecken Sie eine Speicher-management-problem, und ich bin mir nicht ganz sicher, wie Sie damit umgehen.
In einer perfekten Welt, meine Anwendung, die PNGs lädt und .CAF-Dateien in didFinishLoading starten, laden Sie alle it-Ressourcen, und führen Sie just fine.
JEDOCH, wenn mein Programm bekommt einen Absturz (was, wie ich war, die Integration der Pinch-Media-Bibliotheken) oder wenn ich Safari, und öffnen Sie ein paar Seiten und dann starten mein Spiel, das Spiel zum Absturz, zurück zum Menü, weil es aus dem Speicher.
Dieses problem wird bestehen bleiben, bis ich einen hard-reset des Systems.
Die Standard-Antwort, dass Sie Art von online ist die Umsetzung des didReceiveMemoryWarning Methode wie unten aufgeführt....
- (void)didReceiveMemoryWarning
{
//default behavior is to release the view if it doesn't have a superview.
//remember to clean up anything outside of this view's scope, such as
//data cached in the class instance and other global data.
[super didReceiveMemoryWarning];
}
Aber dies nicht wirklich helfen, weil es die anderen Programme, die das festhalten an der Erinnerung nicht von mir. Ich will nicht loslassen meiner eigenen Sicht kann ich? Gibt es eine gute Beschreibung, wie mit dieser situation umzugehen und /oder was passiert in der didReceiveMemoryWarning Veranstaltung?
InformationsquelleAutor K2Digital | 2009-05-28
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie nur eine einzige Ansicht, dann das einzige, was man wirklich tun kann ist, um alle Daten, die Sie nicht verwenden, und faul sind, laden Sie Sie später.
Wenn du mehr als einen einzigen Blick, dann Sie möglicherweise freigegeben werden, wenn Sie nicht sichtbar sind. Wenn dies geschieht, werden die entsprechenden controller gesendet wird
setView:
mitnil
. Ich Griff dies geschieht, indem Sie unverzüglich die Freigabe alleIBOutlet
Variablen, damit Sie ordnungsgemäß eingestellt sind, wenn die Ansicht geladen wird, seinexib
wieder.Dies ist der Ansatz, den ich nehmen, in einer normalen, nicht-OpenGL ES-Anwendung, die hat >6 Ansichten, und arbeitet konsequent, auch wenn ich 4 Ebenen tief in einer navigation anzeigen und alle bisherigen Controller haben Ihre Einschätzungen zu
nil
- es gibt keinen crash, wenn ich rückwärts navigieren, obwohl es eine Verzögerung, da die Aussicht auf "reloaded".Wenn Sie nicht gefunden haben, es schon in den simulator gibt es einen Menüpunkt, um zu simulieren eine memory Warnung, die einfacher als zu zwingen, die in der Bedingung auftreten, in einem echten Gerät. Das heißt, es ersetzt nicht die Prüfung das gleiche Szenario in einem realen Gerät - so macht das testen einfacher.
InformationsquelleAutor freespace
Willkommen in der shared-memory-pool mit keine VM.... Es gibt nicht viel Sie hier tun können, aber es gibt ein paar Dinge (und es ist möglich, es ist eigentlich Ihre Schuld und Sie können das ganz fix). Spiele-Entwickler oft empfehlen Ihren Kunden neu starten, bevor Sie mit Ihnen aus diesem Grund, so müssen Sie möglicherweise im gleichen Boot, wenn Sie wirklich brauchen eine Menge Speicher, um wirksam zu sein.
Natürlich sollten Sie versuchen, minimieren Sie Ihre eigenen Speicher-footprint. Aber Sie sollten auch versuchen zu vermeiden, übermäßige Fragmentierung des Speichers. Manchmal ist das problem nicht, es gibt kein Gedächtnis, es gibt einfach keine Blöcke groß genug. Manchmal ist es besser, auf ein Veränderliches und halten Sie es ändern, anstatt ein neues zu generieren immutable Objekt. Dies gilt insbesondere für die großen NSStrings, die wirklich den Papierkorb Speicher.
Beachten Sie, dass
UIImage +imageNamed:
wird das Bild um, nachdem Sie es loslassen, so dass, wenn Sie brauchen Sie nicht mehr, Sie müssen Sie löschen diese aus. Legen Sie seine name auf null, bevor Sie es freigeben, um es zu stoppen Zwischenspeichern.Stellen Sie sicher, dass Sie Ihre app unter Instrumente. Sie können Essen, mehr Speicher, als Sie denken, Sie sind.
Vergessen Sie nicht, den autorelease-pool. Wenn Sie erzeugen eine Menge von autoreleased Objekte in einem einzelnen event-Schleife, die Sie möglicherweise benötigen, um zu entwässern Sie Ihren pool regelmäßig, damit Ihre nicht-spike-Speicher. Speicher spikes kann dazu führen, ein Programm mit bescheidenen Speicherbedarf plötzlich getötet.
Wenn Sie sagen "führen Sie Ihre app unter "Instrumente" ist die interessanteste Maßnahme "Live-Bytes?"
Ich verwende in der Regel die Zuweisungen instrument mit "Erstellt & Leben Noch" als die Lebensdauer (das ist die Standardeinstellung). Ich auch vor allem wie das wechseln der Track-Anzeige (klicken Sie auf die "i" -) Stil auf "Zuweisung Dichte." Diese im Grunde gibt dir die erste Ableitung der Anzahl der bytes verwendet, die es einfach macht, um Orte zu finden, sind Sie plötzlich die Zuteilung von viel Speicher.
InformationsquelleAutor Rob Napier
Können Sie versuchen, komprimierte PVRTC anstelle der Verwendung von PNG -, um Platz zu sparen (bei einem möglichen performance Kosten).
Es ist ein nettes, kleines tutorial hier:
http://iphonedevelopment.blogspot.com/2008/12/preparations-for-porting-nehe-lesson-06.html
Und halten Sie daran, Sie müssen neu schreiben einige von Ihren OpenGL-Aufrufe zu behandeln, diese unterschiedlichen komprimierte textur.
[Disclaimer: ich bin nicht eine OpenGL-ES-Optimierung guru. Nicht durch einen laaaangen shot.]
InformationsquelleAutor Kevin L.