Android bietet einige On-Device-Entwickleroptionen, mit denen Sie visualisieren können, wo bei Ihrer App möglicherweise Probleme beim Rendern der Benutzeroberfläche auftreten. Dazu gehören beispielsweise mehr Renderingaufgaben als nötig oder lange Thread- und GPU-Vorgänge. Auf dieser Seite wird beschrieben, wie Sie die GPU-Überzeichnung und das Profil-GPU-Rendering debuggen.
Weitere Informationen zu den Entwickleroptionen auf dem Gerät und zu ihrer Aktivierung finden Sie unter Entwickleroptionen auf dem Gerät konfigurieren.
Profil für GPU-Renderinggeschwindigkeit
Das Profil-GPU-Rendering-Tool zeigt als scrollbares Histogramm eine visuelle Darstellung der Zeit an, die zum Rendern der Frames eines UI-Fensters im Verhältnis zu einer Benchmark von 16, 67 ms pro Frame benötigt wird.
Bei weniger leistungsstarken GPUs kann die verfügbare Ausführungsrate (die Geschwindigkeit, mit der die GPU den Frame-Zwischenspeicher füllen kann) recht niedrig sein. Je mehr Pixel zum Zeichnen eines Frames erforderlich sind, desto länger dauert die Verarbeitung neuer Befehle durch die GPU. In diesem Fall muss das System warten, bis es wieder auf den neuesten Stand gebracht wird. Mit dem Profilerstellungstool können Sie feststellen, ob die GPU beim Zeichnen von Pixeln überfordert oder durch zu hohe Überschneidungen überlastet ist.
Profiler aktivieren
Prüfen Sie zuerst, ob Sie ein Gerät mit Android 4.1 (API-Level 16) oder höher verwenden, und aktivieren Sie die Entwickleroptionen. So starten Sie die Profilerstellung für das GPU-Rendering auf dem Gerät, während Sie Ihre App verwenden:
- Rufen Sie auf Ihrem Gerät die Einstellungen auf und tippen Sie auf Entwickleroptionen.
- Wählen Sie im Bereich Monitoring je nach der auf dem Gerät ausgeführten Android-Version Profil-GPU-Rendering oder HWUI-Rendering für Profil aus.
- Wählen Sie im Dialogfeld „Profil-GPU-Rendering“ die Option Auf dem Bildschirm als Balken aus, um die Diagramme auf dem Bildschirm Ihres Geräts einzublenden.
- Öffnen Sie die App, für die Sie ein Profil erstellen möchten.
Ausgabe prüfen
In der vergrößerten Abbildung der in Abbildung 1 gezeigten Profil-GPU-Rendering sehen Sie den farbigen Bereich, wie er unter Android 6.0 (API-Ebene 23) angezeigt wird.
Abbildung 1. Vergrößertes GPU-Renderingdiagramm für Profil.
Beachten Sie bei der Ausgabe Folgendes:
- Das Tool zeigt für jede sichtbare Anwendung ein Diagramm an.
- Jeder vertikale Balken entlang der horizontalen Achse stellt einen Frame dar und die Höhe jedes vertikalen Balkens gibt die Zeit an, die für das Rendering des Frames benötigt wurde (in Millisekunden).
- Die horizontale grüne Linie stellt 16,67 Millisekunden dar. Um 60 Bilder pro Sekunde zu erreichen, muss der vertikale Balken für jeden Frame unter dieser Linie bleiben. Immer wenn ein Balken diese Linie überschreitet, können Pausen in den Animationen auftreten.
- Das Tool hebt Frames hervor, die den Grenzwert von 16,67 Millisekunden überschreiten, indem der entsprechende Balken breiter und weniger transparent wird.
- Jeder Balken hat farbige Komponenten, die einer Phase in der Rendering-Pipeline zugeordnet sind. Die Anzahl der Komponenten hängt vom API-Level des Geräts ab.
Die folgende Tabelle enthält Beschreibungen der einzelnen Segmente eines vertikalen Balkens in der Profiler-Ausgabe, wenn ein Gerät mit Android 6.0 oder höher verwendet wird.
Komponente des Balkens | Renderingphase | Beschreibung |
---|---|---|
Zwischenspeicher tauschen | Stellt die Zeit dar, die die CPU darauf wartet, dass die GPU ihre Arbeit beendet. Wenn dieser Balken hoch wird, bedeutet dies, dass die App zu viel Arbeit auf der GPU ausführt. | |
Befehlsproblem | Gibt die Zeit an, die der 2D-Renderer von Android benötigt, um OpenGL zum Zeichnen und Neuzeichnen von Anzeigelisten zu senden. Die Höhe dieses Balkens ist direkt proportional zur Summe der Zeit, die jede Anzeigeliste zum Ausführen benötigt. Mehr Anzeigelisten entsprechen einem höheren roten Balken. | |
Synchronisieren und hochladen | Stellt die Zeit dar, die zum Hochladen von Bitmapinformationen in die GPU benötigt wird. Ein großes Segment bedeutet, dass die App viel Zeit benötigt, um große Mengen an Grafiken zu laden. | |
Zeichnen | Die zum Erstellen und Aktualisieren der Anzeigelisten der Ansicht verwendete Zeit. Wenn dieser Teil der Leiste hoch ist, bedeutet dies möglicherweise eine Menge an Zeichnung der benutzerdefinierten Ansicht oder viel Arbeit in onDraw-Methoden. | |
Messung / Layout | Stellt die Zeit dar, die für onLayout- und onMeasure-Callbacks in der Ansichtshierarchie aufgewendet wurde. Ein großes Segment weist darauf hin, dass die Verarbeitung der Ansichtshierarchie lange dauert. | |
Eingabeverarbeitung und Animation |
Stellt die Zeit dar, die benötigt wurde, um alle Animatoren zu bewerten, die für diesen Frame ausgeführt wurden, und alle Eingabe-Callbacks zu verarbeiten. Wenn dieses Segment groß ist, könnte dies darauf hindeuten, dass ein benutzerdefinierter Animator oder ein Eingabe-Callback zu viel Zeit für die Verarbeitung aufwendet. Ansichtsbindung beim Scrollen, z. B. RecyclerView.Adapter.onBindViewHolder() , tritt ebenfalls in der Regel während dieses Abschnitts auf und ist in diesem Segment häufiger die Ursache für Verlangsamungen.
|
|
Sonstige Zeit / VSync-Verzögerung | Stellt die Zeit dar, in der die Anwendung Vorgänge zwischen zwei aufeinanderfolgenden Frames ausführt. Dies könnte ein Indikator für zu viel Verarbeitung im UI-Thread sein, der auf einen anderen Thread übertragen werden könnte. |
Tabelle 1. Komponentenleisten in Android 6.0 und höher.
Android-Versionen zwischen 4.0 (API-Level 14) und 5.0 (API-Level 21) haben blaue, lilafarbene, rote und orangefarbene Segmente. Android-Versionen unter 4.0 haben nur die blauen, roten und orangefarbenen Komponenten. Die folgende Tabelle zeigt die Komponentenleisten in Android 4.0 und 5.0.
Komponente des Balkens | Renderingphase | Beschreibung |
---|---|---|
Prozess | Stellt die Zeit dar, die die CPU darauf wartet, dass die GPU ihre Arbeit beendet. Wenn dieser Balken hoch wird, bedeutet dies, dass die App zu viel Arbeit auf der GPU ausführt. | |
Ausführen | Gibt die Zeit an, die der 2D-Renderer von Android benötigt, um OpenGL zum Zeichnen und Neuzeichnen von Anzeigelisten zu senden. Die Höhe dieses Balkens ist direkt proportional zur Summe der Zeit, die jede Anzeigeliste zum Ausführen benötigt. Mehr Anzeigelisten entsprechen einem höheren roten Balken. | |
XFer | Stellt die Zeit dar, die zum Hochladen von Bitmapinformationen in die GPU benötigt wird. Ein großes Segment bedeutet, dass die App viel Zeit benötigt, um große Mengen an Grafiken zu laden. Dieses Segment ist auf Geräten mit Android 4.0 oder niedriger nicht sichtbar. | |
Aktualisieren | Die zum Erstellen und Aktualisieren der Anzeigelisten der Ansicht verwendete Zeit. Wenn dieser Teil der Leiste hoch ist, bedeutet dies möglicherweise eine Menge an Zeichnung der benutzerdefinierten Ansicht oder viel Arbeit in onDraw-Methoden. |
Tabelle 2. Komponentenleisten in Android 4.0 und 5.0.
Weitere Informationen zum Interpretieren der vom Profilerstellungstool bereitgestellten Informationen finden Sie unter Mit Profil-GPU-Rendering analysieren.
Hinweis:Dieses Tool heißt Profile GPU-Rendering, alle überwachten Prozesse werden jedoch in der CPU ausgeführt. Das Rendern erfolgt über die Übermittlung von Befehlen an die GPU. Diese rendert den Bildschirm asynchron. In bestimmten Situationen kann die GPU zu viel Arbeit haben und die CPU muss warten, bevor sie neue Befehle senden kann. In diesem Fall sehen Sie Spitzen in den orangefarbenen und roten Balken und die Befehlsübermittlung wird blockiert, bis mehr Platz in der GPU-Befehlswarteschlange gefunden wird.
GPU-Überschreibung visualisieren
Eine weitere Funktion in den Entwickleroptionen hilft Ihnen, Überschneidungen durch eine Farbcodierung zu erkennen. Eine Überschneidung tritt auf, wenn in Ihrer App dasselbe Pixel mehrmals in einem Frame gezeichnet wird. Diese Visualisierung zeigt also, wo Ihre App möglicherweise mehr Rendering-Aufgaben als nötig ausführt. Dies kann zu einem Leistungsproblem führen, da die GPU-Aufwand für das Rendern von Pixeln, die für den Nutzer unsichtbar sind, zu einem Leistungsproblem führen kann. Daher sollten Sie Überzeichnungsereignisse nach Möglichkeit beheben.
Falls noch nicht geschehen, aktivieren Sie die Entwickleroptionen. Gehen Sie dann so vor, um die Überzeichnung auf Ihrem Gerät zu visualisieren:
- Rufen Sie auf Ihrem Gerät die Einstellungen auf und tippen Sie auf Entwickleroptionen.
- Scrollen Sie nach unten zum Bereich Hardwarebeschleunigtes Rendering und wählen Sie GPU-Overdraw debuggen aus.
- Wählen Sie im Dialogfeld Fehlerbehebung für GPU-Überzeichnung die Option Überzeichnungsbereiche anzeigen aus.
UI-Elemente der Android-Farben zur Identifizierung des Überzeichnungsgrads:
- Richtige Farbe: Kein Überschreiben
Blau:1-mal überschritten
Grün:zweimal überzogen
Rosa:Dreimal überschrieben
Rot:Viermal oder öfter überschritten
![](https://developer.android.com/static/topic/performance/images/gpu/gpu-overdraw-before_2x.png?authuser=6&hl=de)
Abbildung 2. Eine Anwendung, wie sie normal angezeigt wird (links) und wie sie mit aktivierter GPU-Überschreibung angezeigt wird (rechts)
Diese Farben sind halbtransparent. Welche Farbe auf dem Bildschirm genau zu sehen ist, hängt vom Inhalt der Benutzeroberfläche ab.
Sie wissen nun, an welcher Stelle im Layout eine Überschneidung auftritt. Lesen Sie dazu den Artikel Überzeichnung reduzieren.
Überschneidungen sind unvermeidbar. Versuchen Sie bei der Feinabstimmung der Benutzeroberfläche Ihrer Anwendung, zu einer Visualisierung zu gelangen, die überwiegend echte Farben oder nur eine Überschneidung (Blau) aufweist.
![](https://developer.android.com/static/topic/performance/images/gpu/gpu-overdraw-after_2x.png?authuser=6&hl=de)
Abbildung 3. Beispiele für eine Anwendung mit viel Überschneidung (links) und viel weniger Überschneidung (rechts)