CPU- und GPU-Frame-Verarbeitungszeiten schätzen

Die Schätzung der CPU- und GPU-Frame-Verarbeitungszeiten (Frame-Times) ist entscheidend, um die Leistung Ihrer App zu verstehen und Engpässe zu finden. Wenn Sie eine App mit AGI profilieren, stellt der System Profiler Trace-Daten bereit, mit denen Sie Frame-Zeiten schätzen können.

CPU-Zeiten

In AGI können Sie die Gesamt- und aktiven CPU-Frame-Zeiten im CPU-Track eines Systemprofils aufrufen.

CPU-Gesamtzeit

Wenn Sie die gesamte CPU-Zeit messen möchten, wählen Sie den Zeitraum aus, der die Zeit zwischen aufeinanderfolgenden Frame-Einreichungsereignissen umfasst. Die Ereignisse für die Frame-Einreichung sind eglSwapBuffers (für OpenGL) und vkQueuePresentKHR (für Vulkan).

Ein Screenshot von eglSwapBuffer-Ereignissen.
Abbildung 1 Zeitspanne zwischen zwei eglSwapBuffer-Ereignissen.


Screenshot eines vkQueuePresentKHR-Ereignisses
Abbildung 2. Zeitspanne zwischen zwei vkQueuePresentKHR-Ereignissen.

Diese Messung ist eine Schätzung der gesamten CPU-Zeit,entspricht aber nicht unbedingt der aktiven CPU-Zeit. In GPU-gebundenen Apps wartet die CPU beispielsweise möglicherweise, bis die GPU ihre Arbeit abgeschlossen hat, bevor ein neuer Frame gesendet wird. Das geschieht häufig, wenn ein dequeueBuffer-, eglSwapBuffer- (für OpenGL) oder vkQueuePresent-Ereignis (für Vulkan) einen großen Teil der CPU-Zeit in Anspruch nimmt. Die Wartezeit ist in der CPU-Gesamtzeit enthalten, aber nicht in der aktiven CPU-Zeit.

Ein Screenshot, der eine lange Inaktivität während der Ereignisse „dequeueBuffer“ und „eglSwapBuffer“ zeigt
Abbildung 3: Die CPU ist während dequeueBuffer- und eglSwapBuffer-Ereignissen häufig inaktiv.

Aktive CPU-Zeit

Die aktive CPU-Zeit gibt an, wann die CPU den App-Code ausführt, ohne sich im Inaktivitätsmodus zu befinden.

Wenn Sie die aktive CPU-Zeit messen möchten, sehen Sie sich die Aktuell ausgeführten-Scheiben direkt über den CPU-Ereignissen an. Zählen Sie alle Teile des Tracings zwischen den beiden Frame-Einreichungsereignissen, die sich im Status Running befinden. Achten Sie darauf, dass Sie Arbeitsthreads angeben.

Ein Screenshot von zwei CPU-Zeiträumen, mit denen sich die aktive CPU-Zeit messen lässt
Abbildung 5: Zwei CPU-Zeiträume, mit denen die aktive CPU-Zeit gemessen werden kann.


Ein Screenshot einer mehrstufigen App, in der andere Threads aktiv sind, während der Hauptthread inaktiv ist.
Abbildung 6: Eine mehrstufige App, die andere laufende Threads hat, während der Hauptthread inaktiv ist.

Eine weitere Möglichkeit, die aktive CPU-Zeit zu messen, besteht darin, sich die App-Slices in den CPU-Tracks anzusehen. Diese Segmente geben an, wann die CPU ausgeführt wird, und entsprechen den Segmenten Aktiv.

Ein Screenshot, der den Ausführungsstatus eines angepinnten Threads zeigt, der dem CPU-Track entspricht.
Abbildung 7. Der Ausführungsstatus des angepinnten Threads stimmt mit dem CPU-Track überein.

Sie können Ihrer App ATrace-Markierungen hinzufügen, um App-Slices leichter zu identifizieren. Die Markierungen werden dann im CPU-Track des Systemprofilers angezeigt.

Screenshot von ATrace-Scheiben in einem CPU-Track
Abbildung 8. ATrace-Scheiben in einem CPU-Track.

GPU-Framezeiten schätzen

Sie können entweder GPU-Scheiben oder GPU-Zähler im Systemprofiler verwenden, um GPU-Framezeiten zu schätzen. Die Schätzung ist bei der Verwendung von GPU-Scheiben genauer.

GPU-Scheiben

Wenn im Systemprofiler Informationen zu GPU-Scheiben verfügbar sind, können Sie sehr genaue Informationen zur GPU-Frame-Zeit erhalten, indem Sie die Gesamtzeit messen, die Ihre App für Aufgaben aufwendet, die mit einem einzelnen Frame verknüpft sind.

Mali-Geräte

Auf Mali-Geräten haben GPU-Slices Fragment-, Nicht-Fragment- und gelegentlich zusätzliche Nicht-Fragment-Tracks. Bei weniger komplexen Frames werden die Fragment- und Nicht-Fragment-Arbeiten nacheinander ausgeführt. Die Arbeit eines Frames lässt sich also von der eines anderen unterscheiden, indem nach Lücken zwischen aktiven GPU-Arbeiten gesucht wird.

Wenn Sie mit der Arbeit vertraut sind, die an die GPU gesendet wird, können Sie anhand des Musters der gesendeten Renderingpässe Informationen dazu erhalten, wann ein Frame beginnt und endet.

Ein Screenshot mehrerer Frames, die nacheinander ausgeführt werden.
Abbildung 9. Mehrere Frames werden nacheinander ausgeführt.
Ein Screenshot, in dem die AGI auf einen einzelnen Frame gezoomt ist.
Abbildung 10. Hier ist ein einzelner Frame herangezoomt.

Bei Apps mit einem stärker parallelisierten GPU-Workflow können Sie die GPU-Frame-Zeiten abrufen, indem Sie im Bereich Auswahl für jeden Frame nach allen Frames mit derselben submissionID suchen.

Bei Vulkan-basierten Apps können mehrere Einreichungen verwendet werden, um einen Frame zu erstellen. Verwende den Vulkan-Ereignis-Track, um die Einreichungs-IDs im Blick zu behalten. Er enthält einen Snippet für jede Einreichung. Wenn Sie einen Beitragsausschnitt auswählen, werden alle GPU-Aktivitätsausschnitte hervorgehoben, die dem Beitrag entsprechen.

Ein Screenshot einer parallelisierten GPU-Arbeitslast, bei der sich die Arbeit an einem Frame mit der an einem anderen überschneiden kann.
Abbildung 11. Eine parallelisierte GPU-Arbeitslast, bei der sich die Arbeit an einem Frame mit der Arbeit an einem anderen überschneiden kann.


Ein Screenshot mehrerer Vulkan-Ereignisse, die für einen Frame ausgewählt wurden.
Abbildung 12. Für einen Frame wurden mehrere Vulkan-Ereignisse ausgewählt.

Adreno-Geräte

Auf Adreno-Geräten werden GPU-Slices im Track GPU-Queue 0 angezeigt und immer sequenziell dargestellt. Sie können sich also alle Slices ansehen, die die Rendering-Pässe für einen Frame darstellen, und damit die GPU-Frame-Zeiten messen.

Ein Screenshot mehrerer Frames, die nacheinander ausgeführt werden.
Abbildung 13. Mehrere Frames werden nacheinander ausgeführt.
Ein Screenshot, in dem AGI auf einen Frame mit mehreren Rendering-Durchläufen herangezoomt ist.
Abbildung 14 Heranzoomen eines Frames mit mehreren Rendering-Durchläufen.

Ähnlich wie beim zuvor beschriebenen Mali-Szenario: Wenn die App Vulkan verwendet, enthält der Track Vulkan-Ereignisse Informationen zur Arbeit, die zur Ausführung des Frames gesendet wird. Wenn Sie die Renderingpässe hervorheben möchten, klicken Sie auf die Vulkan-Ereignisse-Scheiben, die mit dem Frame verknüpft sind.

Ein Screenshot einer Vulkan-basierten App, in der Vulkan-Ereignisse des Frames ausgewählt sind.
Abbildung 15. Eine Vulkan-basierte App, in der Vulkan-Ereignisse für einen Frame ausgewählt werden.

In einigen Fällen ist es aufgrund der starken GPU-Bindung der App schwieriger, die GPU-Frame-Grenzen zu unterscheiden. Wenn Sie mit der Arbeit vertraut sind, die an die GPU gesendet wird, können Sie in diesen Fällen das Muster ermitteln, mit dem die Renderingpässe ausgeführt werden, und anhand dieser Informationen die Framegrenzen bestimmen.

Screenshot einer stark GPU-gebundenen App mit einem Rendering-Pass-Muster, das bei der Identifizierung von Frame-Grenzen hilft
Abbildung 16 Eine stark GPU-gebundene App mit einem Rendering-Pass-Muster, das zur Identifizierung von Frame-Grenzen beiträgt.

GPU-Zähler

Wenn in einem Trace keine Informationen zu GPU-Scheiben verfügbar sind, können Sie die GPU-Framezeit anhand der GPU-Zähler schätzen.

Mali-Geräte

Auf Mali-Geräten können Sie mit dem Messwert GPU-Auslastung die GPU-Framezeit für eine App schätzen, die nicht GPU-intensiv ist. Bei weniger GPU-intensiven Apps gibt es regelmäßige Phasen mit hoher und niedriger GPU-Aktivität, anstatt einer konstant hohen Aktivität. Wenn Sie die GPU-Frame-Zeiten anhand des GPU-Nutzungs-Tracks schätzen möchten, messen Sie die Dauer der Zeiträume mit hoher Aktivität im Track.

Ein Screenshot der GPU-Nutzung und der GPU-Warteschlange auf einem Mali-Gerät.
Abbildung 17. Die GPU-Auslastung und die GPU-Warteschlange auf einem Mali-Gerät.

Wenn die App GPU-intensiver ist, kann die GPU-Auslastung durchgehend sehr hoch sein. In diesem Fall können Sie die Tracks Fragment Queue Utilization (Auslastung der Fragmentwarteschlange) und Non-Fragment Queue Utilization (Auslastung der Warteschlange ohne Fragmente) verwenden, um die GPU-Aktivität zu überwachen und GPU-Frame-Zeiten zu schätzen. Wenn Sie nach Mustern in Fragment- und Nicht-Fragment-Tracks suchen, können Sie eine grobe Schätzung der Grenzen eines Frames erhalten und damit die GPU-Framezeit messen.

Ein Screenshot von Fragment- und Nicht-Fragment-Tracks
Abbildung 18: Fragment- und Nicht-Fragment-Tracks.

Adreno-Geräte

Wenn die App auf Adreno-Geräten nicht GPU-intensiv ist, können Sie die GPU-Frameraten auf die gleiche Weise schätzen wie bei Mali-Geräten im vorherigen Abschnitt.

Ein Screenshot der GPU-Auslastung in Prozent und der GPU-Warteschlangen auf einem Adreno-Gerät
Abbildung 19. Die GPU-Auslastung in Prozent und die GPU-Warteschlange auf einem Adreno-Gerät.

Wenn die App GPU-intensiver ist und die GPU-Auslastung konstant hoch ist, können Sie die Tracks Vertex-Anweisungen/Sekunde und Fragment-Anweisungen / Sekunde verwenden, um die GPU-Frame-Zeiten zu schätzen. Wenn Sie nach Mustern in den Aktivitätsniveaus dieser Tracks suchen, können Sie eine grobe Schätzung der Grenzen eines Frames erhalten und damit die GPU-Framezeit messen.

Screenshot der Vertex-Anleitung für den zweiten Track
Abbildung 20. Der Track Vertex Instructions / Second.

Diese anderen Datensätze enthalten möglicherweise ähnliche Informationen:

  • Schattierte Eckpunkte pro Sekunde
  • Schattierte Fragmente pro Sekunde
  • % der Zeit, in der schattende Vertice verwendet wird
  • % der Zeit, in der Fragmente schattiert werden