Application performance - ARKit bzw. neuste Versionen

memory could not get reserved

Möglicherweise kennst du das Problem schon: Du hast ein Programm erstellt, welches Grafiken erstellt und wenn die Grafik dann in die GPU geladen werden soll, damit sie gerendert werden kann, kommt es zu einem Freeze, weil der GPU Cache voll ist. Und das ist genau dass, was bei der App, deren Statistik du oben sehen kannst, passiert ist.

 

Wenn der Fehler vorkommt, kommt es häufig zu Abstürzen, da folge Prozesse auf die 3D Modelle angewiesen sind. Aufgrund von einem Update, wurde die CoreCode Library geändert, dass heisst, iOS hat jetzt noch mehr Funktionen und da dies mehr memory benötigt, treten solche Fehler im Moment vermehrt auf.

 

Process:         fseventsd [70]

Path:            /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/FSEvents.framework/Versions/A/Support/fseventsd

Load Address:    0x101cb6000

Identifier:      fseventsd

***-[_NSPlaceholderDictionary initWithObjects:forKeys:count:]: attempt to insert nil object from objects

 

Auf dem Bild kann man ein Beispiel des Fehlers sehen, dabei konnten Daten nicht gespeichert werden und deshalb versuchte eine folge Funktion nil, also gar nichts, durch eine Abfrage zu lassen.

 

Beachte die folgenden Tipps, um deine Apps trotzdem schneller zu machen bzw. dafür zu sorgen, dass sie weiterhin flüssig sind:

 

1.Teile grosse Prozesse und Funktionen auf. Lasse die CPU oder GPU den Prozess nacheinander durchführen.

2.Memory-Managment: Trenne dich von nicht benutzten Objekten oder unnötigen Dingen, wenn ein Fehler kommt.

override func didReceiveMemoryWarning() {

        super.didReceiveMemoryWarning()

        let deinevariabel = nil

 

    }

3.Nehmen wir mal an, dass du eine Klasse benötigst, zum Beispiel willst du ein SKNode auf der SKScene platzieren. Dazu geht man ja meist so vor:

 

let node = SKNode()

node.position = CGPoint(0,0)

node.name = "deinemutter"

 

let color = [array, of, colors]

let chosen = arc4ramdom_uniform(color.count)

 

node.color = chosen

 

Das Problem bei dieser Methode ist, dass auch nach dem hinzufügen durch self.sceneView.addChildNode(node) die Variabeln weiterhin im RAM bleiben. Ich empfehle dir, dass du nicht mehr gebrauchte Variabeln einfach löschst, in dem du folgendes tust: Setze nil ein. let node = nil

 

4.Lösche den RAM nach frame Update, wenn gerade keine essentiellen Prozesse laufen.

 

5.Nutze ein effizientes Anti-Viren Programm. Klicke auf den Banner unten, um ein effizientes und günstiges Programm zu kaufen.

Software-Shop

Ich würde dir empfehlen, deinem Nutzer den Fortschritt anzuzeigen, denn jeder verzweifelt wenn ein Programm ewig lang nicht reagiert.


Beispiel: Ausschnitt aus einer Projektdokumentation von mir:

 

Als ich die App zum ersten mal ausgeführt habe, ist mir aufgefallen, dass die App gerade dann wenn der Nutzer etwas zitterte, stark laggte (kommt vom Wort laggen, bedeutet einfach gesagt, dass eine Grafik stockt und nicht flüssig läuft). Also musste ich mir überlegen, was ich machen könnte, um das Problem zu beheben. Es ist zwar so, dass ich die Mexikaner bereits beim initieren (dem ersten Starten der Kamera) hinzufüge, aber die Grafikkarte berechnet trotzdem jedesmal, wie die Mexikaner aussehen würden, auch dann, wenn der Nutzer in eine andere Richtung schaut. Grafiken und Animationen werden aus einzelnen Bildern hergestellt, je mehr dieser Bilder pro Sekunde verarbeitet werden können, desto klarer sehen die Animationen aus. (Die Anzahl der Bilder pro Sekunde, kann bei dem Wort FPS und Animations gesehen werden).  

Diese einzelnen Bilder werden jedesmal gesamt (also als 360° Bild) gerendert, was mich auf die Idee gebracht hat, Inhalte aus nicht angezeigten Chunks (Teile des Bildes) einfach zu entfernen. Da die Bilder so häufig neugerendert werden und gleichzeitig eine Plane Detection lief und Fake-News EasterEggs (kleine Features, die Entwickler programmieren, aber normalerweise versteckt sind) geladen wurden, war der Cache, der GPU (Grafikkarte)) völlig „vollgestopft“. 

 

 

Cache: Ein Smartphone verfügt über einen sogenannten Arbeitsspeicher, der die Daten, die benötigt werden, enthält. Wenn nun eine Grafik ausgeführt werden soll, dann lädt die Grafikkarte die benötigten Daten in den eigenen kleinen Arbeitsspeicher, damit sie schneller auf die Daten zugreifen kann.

 

Der Cache ist flüchtig, was bedeutet, dass der Cache automatisch gelöscht wird, wenn ein Prozess beendet ist. Man könnte die Situation des Caches in diesem Moment also mit einem Bus vergleichen: Wenn man 100 Leute von A nach B bringen will, der Bus aber nur Platz für 20 hat, dann gehen die Leute halt nacheinander und man presst nicht 100 Leute hinein, da die sonst ersticken oder der Bus platzen könnte :)

Um eben die Situation (welche ich mit dem Bus verglichen habe) zu verhindern, prüfe ich beim Laden von jedem Einzelbild in welche Richtung der Nutzer schaut und verarbeite nur die Mexikaner, die der Nutzer auch wirklich sehen kann, denn ansonsten würden alle Mexikaner (auch die, die man nicht sieht) ihre Animationen durchlaufen, was wertvolle Ressourcen verschwenden würde.

 

 

Das Hauptproblem war aber, dass normale Apps keinen Zugriff auf die Speicherverwaltung hat, weshalb ich die 3D Modelle einfach nacheinander geladen habe und bevor ein neues kam, habe ich einfach den Arbeitsspeicher gelöscht (dies kann man auf Unix Geräten mit dem Befehl: sudo purge, tun (Unix ist die Urversion von Linux auf der auch macOS und iOS basieren).

 

 

Bei meiner App konnte ich beobachten, dass  es sogar effizienter war, Variabeln (Daten) auf der Festplatte zu speichern, obwohl diese langsamer ist, denn dies hatte den Vorteil, dass der Arbeitsspeicher geschont wurde.

 

21th Century The Game ist keine sehr komplizierte AR App, aber trotzdem belegte meine App c.a 80 % des Arbeitsspeichers bzw. Des GPU Caches und dazu kommen dann noch andere Funktionen des Handys, so laufen ständig Prozesse, die auf den Push-Messaging Servern von anderen Apps nach neuen Nachrichten suchen und weitere Prozesse. 

 

Wenn man im Augmented-Reality Screen auf das Plus drückt, dann kann man die Verbrauchsstatistiken sehen, so fällt zum Beispiel auf, dass beim ersten Laden (dort habe ich noch nicht mit der Sparmethode gearbeitet), der Cache sehr voll ist und dann nach ca. 1 Sekunde fast leer ist.

 

Um einen Absturz zu verhindern, greift die App ständig auf die Statistiken zu, werden zum Beispiel weniger als 30 Bilder pro Sekunde angezeigt, so ist die Wahrscheinlichkeit gross, dass die App abstürzen wird bzw. dass das Nutzer-Erlebnis schlecht ist, weshalb die App in diesem Fall, den Prozess selbst beendet und den Nutzer zum nächsten Gamemode sendet.

 

 

 

 

Abschliessend kann ich jedem App Entwickler, die folgenden Tipps geben:

 

 

  • Verwenden Sie die NSURLSession-Hintergrundsitzung
  • Minimieren Sie die Verwedung des kontinuierlichen Standortes und wählen Sie die Genauigkeit effizient aus
  • Vermeiden Sie Timer

Kommentar schreiben

Kommentare: 1
  • #1

    Levina (Freitag, 15 Juni 2018 14:33)

    Gute Ideeen. Bei mir ist meist aber auch der CPU Cache voll.

Click the button



KONTAKT

Bitte den Code eingeben:

Hinweis: Bitte die mit * gekennzeichneten Felder ausfüllen.


ADCELL

Hey! Thats me!

Severin Kämpfer Bremgarten bei Bern

16 years old trekkie.

Persönliche Webseite:

https://www.severin-kaempfer.ch

Unterstütze KKTVCAM mit 1 CHF! Bezahle mit Bitcoin!


*: Bedeutet, dass KKTVCAM das Produkt/die Seite evtl. getestet hat und nun Affiliate der betreffenden Firma ist.

Made with ♥ in Bern (Switzerland)!

KKTVCAM ÜBERNIMMT KEINE HAFTUNG FÜR ALLE ANGABEN AUF DIESER SEITE.