Ich arbeite an einem iOS-Spiel, das mindestens auf die 3gs abzielt. Wir verwenden HD-Assets für Retina-Anzeigegeräte (iPhone 4, iPod Touch 4. Generation).
In Bezug auf den Speicher scheint der Ipod Touch der 4. Generation für uns das Gerät mit den meisten Einschränkungen zu sein, da er über dieselbe RAM-Größe (256 im Vergleich zu 512 von Iphone 4) wie 3gs verfügt, wir jedoch HD-Assets verwenden. Die App stürzte früher ab, als versucht wurde, 100-110 MB RAM zu laden, aber jetzt, da wir nur noch 70 MB haben, hatten wir noch nie einen Absturz beim Laden.
Nach langem Suchen scheint es keine offizielle Grenze zu geben. Wie sollten wir also vorgehen, um zu wissen, welches Speicherbudget wir verwenden müssen, um sicher zu sein? Wir möchten den Künstlern ein Budget geben können, das sie ohne Speicherprobleme für jede Karte verwenden können.
quelle
Antworten:
Ich denke, Sie haben Ihre eigene Frage beantwortet: Versuchen Sie, die 70-MB-Grenze nicht zu überschreiten, aber es hängt wirklich von vielen Dingen ab: Welche iOS-Version Sie verwenden (nicht SDK), wie viele Anwendungen im Hintergrund ausgeführt werden, welcher genaue Speicher Sie verwenden usw.
Vermeiden Sie einfach die sofortigen Speicherspritzer (z. B. verwenden Sie 40 MB RAM und weisen dann 80 MB mehr für eine kurze Berechnung zu). In diesem Fall würde iOS Ihre Anwendung sofort beenden.
Sie sollten auch das verzögerte Laden von Assets in Betracht ziehen (laden Sie sie nur, wenn Sie sie wirklich benötigen und nicht vorher).
quelle
Testergebnisse mit dem Dienstprogramm Split geschrieben (Link ist in seiner Antwort):
Gerät: (Absturzmenge / Gesamtmenge / Prozentsatz der Gesamtmenge)
quelle
Ich habe ein kleines Dienstprogramm erstellt, das versucht, so viel Speicher wie möglich für den Absturz zuzuweisen, und das aufzeichnet, wann Speicherwarnungen und Abstürze aufgetreten sind. Auf diese Weise können Sie herausfinden, wie hoch das Speicherbudget für jedes iOS-Gerät ist.
https://github.com/Split82/iOSMemoryBudgetTest
quelle
In meiner App ist die Benutzererfahrung besser, wenn mehr Speicher verwendet wird. Daher muss ich mich entscheiden, ob ich wirklich den gesamten Speicher freigeben soll, in dem ich arbeiten kann
didReceiveMemoryWarning
. Basierend auf der Antwort von Split und Jasper Pol scheint die Verwendung von maximal 45% des gesamten Gerätespeichers ein sicherer Schwellenwert zu sein (danke Jungs).Für den Fall, dass sich jemand meine tatsächliche Implementierung ansehen möchte:
Swift (basierend auf dieser Antwort ):
quelle
Durch das Verzweigen des SPLITS-Repos habe ich eines erstellt, um den iOS-Speicher zu testen, der der heutigen Erweiterung zugewiesen werden kann
iOSMemoryBudgetTestForExtension
Das Folgende ist das Ergebnis, das ich in iPhone 5s bekommen habe
Speicherwarnung bei 10 MB
App bei 12 MB abgestürzt
Auf diese Weise lässt Apple lediglich zu, dass Erweiterungen ihr volles Potenzial entfalten .
quelle
Sie sollten Sitzung 147 aus den Videos der WWDC 2010-Sitzung ansehen . Es handelt sich um "Erweiterte Leistungsoptimierung unter iPhone OS, Teil 2".
Es gibt viele gute Ratschläge zur Speicheroptimierung.
Einige der Tipps sind:
NSAutoReleasePool
s, um sicherzustellen, dass Ihre Speichernutzung nicht ansteigt.CGImageSource
Option, wenn Sie Miniaturansichten aus großen Bildern erstellen.quelle
NSLog
Inside hinzufügendidReceiveMemoryWarning
und dann einige Tests durchführen, bei denen Sie unterschiedliche Speichermengen zuweisen und dann sehen, wann die Speicherwarnungen beginnen.Ab iOS13 gibt es eine von Apple unterstützte Möglichkeit, dies mithilfe von abzufragen
Hier vorgestellt: https://developer.apple.com/videos/play/wwdc2019/606/
Etwa min 29-ish.
Bearbeiten: Hinzufügen eines Links zur Dokumentation https://developer.apple.com/documentation/os/3191911-os_proc_available_memory?language=objc
quelle
Wenn Sie TASK_BASIC_INFO_COUNT anstelle von MACH_TASK_BASIC_INFO verwenden, erhalten Sie
kerr == KERN_INVALID_ARGUMENT (4)
quelle
Ich habe eine weitere Liste erstellt, indem ich die Jaspers-Liste nach dem RAM des Geräts sortiert habe (ich habe meine eigenen Tests mit dem Split-Tool durchgeführt und einige Ergebnisse korrigiert - überprüfen Sie meine Kommentare im Jaspers-Thread).
Geräte-RAM: Prozentbereich zum Absturz
Spezialfälle:
Geräte-RAM kann leicht gelesen werden:
Nach meiner Erfahrung ist es sicher, 45% für 1-GB-Geräte, 50% für 2/3-GB-Geräte und 55% für 4-GB-Geräte zu verwenden. Prozent für macOS können etwas größer sein.
quelle
Mit den vielen Antworten oben habe ich die neue Methode von Apples
os_proc_available_memory()
für iOS 13+ implementiert,NSByteCountFormatter
die eine Reihe nützlicher Formatierungsoptionen für eine bessere Ausgabe des Speichers bietet:Wichtiger Hinweis: Vergessen Sie das
()
am Ende nicht. Ich habe beideNSLog
Optionen in diememoryLoggingOutput
Methode aufgenommen, da Sie nicht gewarnt werden, dass sie fehlen, und wenn die Klammern nicht eingeschlossen werden, wird ein unerwartetes, aber konstantes Ergebnis zurückgegeben.Die von der Methode zurückgegebene Zeichenfolge
memoryStringForBytes
gibt folgende Werte aus:quelle