
Lesen Sie den zweiten Teil des Artikels, der auf den Materialien des Berichts von Luke Parkham auf der MBLT DEV-Konferenz im letzten Jahr basiert . Der erste Teil des Artikels ist hier verfügbar.
Unter der Katze finden Sie nicht nur nützliche Tipps, sondern auch die neuesten Frühbuchertickets für MBLT DEV 2018 - Sie können sie erst heute kaufen.
Kernanimation
Core Animation (CA) ist eine Voreinstellung im Profiler, die FPS-Messungen (Bilder pro Sekunde) verwendet, um festzustellen, ob Animationen verzögert sind oder nicht. Selbst wenn Problembereiche der Anwendung gefunden werden, bleiben häufig Leistungsschwierigkeiten bestehen. Der Grund dafür ist, dass bei der Arbeit mit UI-Frameworks UIView verwendet wird, jedoch eine Instanz von CATransaction unter der Haube erstellt wird (oder das System dies selbst tut) und alle diese Anweisungen zur Verarbeitung an den Server gesendet werden. Der Server für das Rendern ist für die Erstellung der Animation verantwortlich. Wenn eine Animation mit einem UIView ausgeführt wird, z. B. der animate(withDuration:animations:)
, wird sie vom Render-Server verarbeitet, der als separater Thread betrachtet wird und mit allen Animationen in der Anwendung funktioniert.
Sie können dafür sorgen, dass der Render-Server langsam arbeitet, sodass er nicht im Zeitprofiler angezeigt wird, die Anwendung jedoch weiterhin verlangsamt wird. So sieht es aus:


Oben befindet sich der Bildratensensor. Nachfolgend finden Sie den wichtigsten Teil - Debugging-Optionen. Es gibt zwei Schlüssel und dennoch einfach zu konfigurierende Parameter. Das erste sind color blended layers
. Das Problem zu beheben ist ziemlich einfach. In iMessage, Apples beliebter App, treten sogar Probleme auf.

Rot kennzeichnet Bereiche mit weißem Hintergrund. Sie überlappen sich mit einem anderen weißen Hintergrund und erscheinen aus irgendeinem Grund transparent. Es stellt sich heraus, dass das Programm diese Farben miteinander mischt - Weiß mit Weiß, und das Ergebnis ist wieder Weiß. Infolgedessen werden für jedes rot markierte Pixel zusätzliche Berechnungen durchgeführt, die keinen Nutzen bringen - es wird ein weißer Hintergrund erhalten.
Regel Nr. 3
Machen Sie die Ebenen nach Möglichkeit undurchsichtig - vorausgesetzt, sie haben dieselben Farben, die sich überlappen. Die Ebene hat die opacity
, die auf Eins gesetzt werden muss. Überprüfen Sie immer, ob die Hintergrundfarbe eingestellt und undurchsichtig ist.

Offscreen-Rendering
Die nächste Option ist das Rendern außerhalb des Bildschirms. Wenn Sie diese Funktion aktivieren, werden die Abschnitte gelb hervorgehoben.
Der Komfort von Core Animation ist die Möglichkeit, andere Anwendungen anzuzeigen. Sie können die Optionen aktivieren, die Anwendung starten und sehen, was falsch läuft. Auf dem Bildschirm in Instagram oben befinden sich kleine gelbe Kreise, in denen die Geschichten des Benutzers angezeigt werden.

Auf dem iPhone 6s werden sie beispielsweise eher langsam geladen. Und wenn Sie sie auf dem iPhone 5 oder dem alten iPod-Modell betrachten, wird der Download noch langsamer. Dies liegt an der Tatsache, dass das systeminterne Rendering viel schlechter ist als das Alpha-Blending. Es lädt die GPU. Infolgedessen muss das Gerät ständig zusätzliche Berechnungen zwischen dem Grafikprozessor und dem Zentralprozessor durchführen, sodass zusätzliche Verzögerungen in den meisten Fällen vermieden werden können.
Regel 4
Verwenden Sie nicht den Parameter cornerRadius
. Die Verwendung von viewLayer.cornerRadius
führt zu einem Offscreen-Rendering. Stattdessen können Sie die UIBezierPath
Klasse sowie etwas verwenden, das der Arbeit mit CGBitMap ähnelt, wie dies zuvor bei der JPEG-Decodierung der Fall war. In diesem Fall wird der UIGraphics context
.

Dies ist eine weitere Instanzmethode der UIImage-Klasse. Hier können Sie die Größe einstellen und abgerundete Ecken machen. Bezierpath
wird verwendet, um einen Bildbereich hervorzuheben. Dann wird das Fragment vom UIImageContext zurückgegeben. So erhalten wir das fertige Bild mit abgerundeten Ecken, anstatt die Rahmen abzurunden, in die das Bild eingefügt wird.

Auf der GIF - Twitter Seite. Bild in Echtzeit gezeigt. Die Seite soll sich öffnen und Informationen ausgeben, aber der Text und andere Elemente des Bildschirms wurden außerhalb des Bildschirms gerendert, sodass sich die Animationen sehr langsam bewegen.
Regel Nr. 5
Mit der Eigenschaft der shouldRasterize
Klasse aus dem CALayer-Satz können Sie gerenderte Texturen zwischenspeichern. Besser, es zu vermeiden. Wenn shouldRasterize
für eine bestimmte Anzahl von Millisekunden nicht verwendet wurde, verlässt es den Cache und bietet das Rendern jedes Frames. Das schafft also mehr Probleme als Gutes.
Beschleunigen Sie
- Vermeiden Sie das Rendern und Überblenden transparenter Ebenen außerhalb des Bildschirms.
- Verwenden Sie sie nur, wenn Sie nicht ohne sie auskommen können. Das Rendern außerhalb des Bildschirms wird aufgrund von Schatten, abgerundeten Ecken usw. angezeigt.
- Machen Sie Bilder undurchsichtig.
- Verwenden Sie keinen CornerRadius, sondern Bezier-Kurven.
- Verwenden Sie beim Arbeiten mit Text nicht die Eigenschaft layer.shadow, sondern ersetzen Sie sie durch NSShadow.
Aktivitätsspur
Die Aktivitätsverfolgung ähnelt der von Time Profiler, ist jedoch kleiner. Es ermöglicht Ihnen, Flüsse und ihre Interaktion miteinander zu betrachten.
Regel Nr. 6
Verwenden Sie die Systemverfolgung, um Zeiträume für bestimmte Ereignisse zu verfolgen. Sie können eine Möglichkeit finden, Ereignisse oder Codeabschnitte zu verfolgen und zu sehen, wie viel Zeit sie für die eigentliche Arbeit der Anwendung benötigen. System Trace bietet Informationen darüber, was im System geschieht:
- Der „Sing Post“ signalisiert, dass etwas Wichtiges passiert.
- Markierungen sind einzelne Ereignisse, die es wert sind, gesehen zu werden, beispielsweise das Erscheinungsbild einer Animation.
- Anhand des Intervalls des Ereignisses können Sie verfolgen, wie lange die Dekodierung dauert.

Das Programm zeigt also, wie der Code mit dem Rest des Systems interagiert.
Auf dem Bildschirm sehen Sie ein Beispiel für das Erstellen einer Systemablaufverfolgungsvorlage:
- 1 - Bild hochladen
- 2 - Bilddecodierung
- 3 - Neigungsanimationen.
Sie müssen einige Optionen hinzufügen, um zu verstehen, welche Farbe sich herausstellen wird. In der Regel werden ihnen Nummern wie 1 oder 2 zugewiesen, und sie werden je nach Einstellung rot oder grün. In Objective-C müssen Sie den Befehl kdebug_signpost
für kdebug_signpost
schreiben. In Swift sind sie bereits verfügbar.

Dann müssen Sie diese Funktion aufrufen, indem Sie kdebug_signpost
oder kdebug_signpost_start
und kdebug_signpost_end
.

Wir geben 3 Ereignisse zusammen mit den im Code geschriebenen Zahlen und ein Schlüsselelement für jedes spezifische Ereignis an. Die letzte Zahl gibt die Farbe an. Zum Beispiel ist 2 rot.
Als nächstes kommen wichtige Ereignisse, besondere Objekte. Ein vereinfachtes Diagramm ist in Lukes Testprojekt zu Swift beschrieben.
Der Screenshot zeigt, wie es aussehen wird, wenn Sie den Trace starten. Wenn die Anwendung gestartet wird, gibt das Programm zunächst keine Informationen aus. Sobald die Anwendung jedoch abstürzt, werden die Berechnungen angezeigt.

Das Herunterladen von Bildern dauert etwa 200 Millisekunden. Dann kommt die Dekodierung, die ungefähr 40 Millisekunden dauert. Es ist nützlich, diese Daten zu verfolgen, wenn die Anwendung viele Vorgänge enthält. Sie können Ereignisse im Programm auflisten und dann beobachten und Informationen darüber erhalten, wie viel Zeit für ihre Implementierung erforderlich ist und wie sie miteinander interagieren.
Zusätzliche Werkzeuge
Auf dem Bildschirm - AR-Projekt für Zeitlupenaufnahmen eines Smartphones. Die Anwendung ähnelt Snapchat. Es wurde der Fotoretuschierungseffekt verwendet, und für jedes Bild wurden 26,4% aller Rechenvorgänge darauf verwendet. Aus diesem Grund schoss die Kamera langsam mit etwa 10 Bildern pro Sekunde. Beim Lernen sehen wir, dass die oberste Linie den größten Teil der Arbeit erledigt hat. Sie war für das aktive Senden von Daten verantwortlich. Wenn Sie die Ursachen für Leistungsabfälle untersuchen, werden Sie feststellen, dass der Punkt die starke Verwendung von NSDispatchData
.

Diese Unterklasse von NSData
empfängt nur in einem bestimmten Intervall eine Folge von Bytes mit der Methode getBytes
und übergibt sie an einen anderen Speicherort. Es scheint jedoch so einfach zu sein, dass alles, was diese Methode intern ausführt, 18% von 26% der Berechnungen erfordert.

Regel Nr. 1
Verwenden Sie
NSData
und
getBytes
. Dies ist eine einfache Operation unter Objective-C. Wenn sie jedoch Probleme im System verursacht, sollten Sie auf Ebene C zu einer Funktion niedrigerer Ebene wechseln. Da das Problem darin besteht, schwebende Werte zu erhalten, können Sie die Kopierspeicherfunktion verwenden. Damit können Sie ein Datenelement an einen anderen Ort verschieben. Dies spart erheblich Rechenleistung des Geräts.
NSData hat viele Operationen. Im Beispiel wird der Quellcode rot hervorgehoben. Mit der Funktion
getBytes
können
getBytes
Daten in Gleitkommazahlen übersetzen. Die Methode zum Kopieren des Speichers ist fast dieselbe. Es ist recht einfach und führt eine Größenordnung weniger Operationen aus.

Wenn Sie den Ansatz ändern und die Anwendung erneut starten, ist ersichtlich, dass der Prozentsatz der für das Ändern des Fotos aufgewendeten Rechenvorgänge von 26% auf 0,6% gesunken ist. Dies liegt an der Änderung nur einer Codezeile zum Kopieren des Speichers. Die Bildrate hat sich deutlich erhöht.

Regel Nr. 2
Vermeiden Sie überlappende Pixel, wenn Sie eine Anwendung mit Rendering erstellen.
In den meisten Fällen tritt dies bei einer Frequenz über 60 Bildern pro Sekunde auf. Mit CADisplayLink
können Sie die Aktualisierung der Benutzeroberfläche verlangsamen. Es gibt einen preferredFramesPerSecond
Parameter. Dies gilt nur für iOS 10 und höher. Bei älteren Systemen müssen Sie dies manuell tun. Wenn Sie in neuen Versionen von iOS arbeiten, können Sie die gewünschte Anzahl von Bildern pro Sekunde festlegen. In den meisten Fällen 15 Bilder pro Sekunde oder so, um keine Rechenleistung zu verschwenden und der Anwendung keine unnötige Arbeit hinzuzufügen.

Regel Nr. 3
Bei der Arbeit mit Objective-C ist es nützlich, das Caching von IMP-Zeigern (Zeiger auf die Implementierung von Methoden) zu verwenden. Wenn die Methode
under the hood
in Objective-C aufgerufen wird, wird die Funktion
objc_msgSend()
. Wenn die Ablaufverfolgung anzeigt, dass der Anruf lange dauert, können Sie ihn entfernen. Tatsächlich ist dies ein Cache-Repository mit Zeigern auf eine Funktion, denen die Namen einiger Methoden zugewiesen werden können. Anstatt diese Suche jedes Mal durchzuführen, lohnt es sich daher, das Caching wie folgt durchzuführen: Setzen Sie Funktionszeiger in den Cache und rufen Sie sie direkt auf. Dies geschieht normalerweise doppelt so schnell.

Wenn kein Zeiger vorhanden ist, wird die Methode mit dem Befehl methodForSelector aufgerufen. Um diese Hilfsmethode der üblichen Aufruffunktion aufzurufen, müssen Sie den Namen des Objekts in die Auswahl eingeben, die die Suchergebnisse erzeugt. Vielleicht ist dies nicht der bequemste, aber schnellste Weg.
Regel 4
Verwenden Sie kein ARC (automatische Referenzzählung). ARC fügt viel zusätzliche Arbeit hinzu.
Wenn der ARC aktiviert ist, streut der Compiler selbst die Speicherung / release
an den richtigen Stellen. Wenn es jedoch Stellen gibt, an denen das retain
und release
zu lange dauert, sollten Sie den ARC löschen. Tun Sie dies, wenn eine Optimierung erforderlich ist, da dies viel Zeit in Anspruch nimmt.
Manchmal lohnt es sich, sogar Swift aufzugeben, insbesondere wenn die Anwendungsleistung empfindlich auf Änderungen reagiert. Swift hat einige wirklich coole Funktionen, aber um auch kleine Aufgaben ausführen zu können, müssen viele Codezeilen geschrieben werden, um ein hohes Maß an Funktionalität zu erreichen.
Nützliche Materialien
Der erste Teil des Artikels ist hier verfügbar. Für weitere Einblicke in das Thema empfiehlt Luke Parham, das Buch „ iOS und MacOS: Leistungsoptimierung “ zu lesen und seine Tutorials anzusehen .
Die Videoaufzeichnung von Lukes Bericht über MBLT DEV 2017 ist jetzt gemeinfrei:
Weitere Kenntnisse und Tipps bei MBLT DEV 2018
Die ersten Redner kündigten an:
- John C. Fox von Netflix wird über eine qualitativ hochwertige Lokalisierung sprechen, die mit aggressiven Netzwerkbedingungen und A / B-Tests arbeitet.
- Krzysztof Zabłocki, New York Times, bereitet einen Bericht über Muster in iOS vor.
- Laura Morinigo, Google Developer Expert, spricht über die besten Firebase-Praktiken.
Die neuesten Frühbucher-Tickets fliegen heute weg.
