Bandbreitennutzung des Texturspeichers analysieren

Die Speicherbandbreite von Texturdaten kann ein potenzieller Engpass für die GPU-Leistung Ihrer App sein. Einige Zähler in einem AGI-Systemprofil können bei der Diagnose von Problemen mit der Bandbreite des Texturspeichers helfen.

Qualcomm Adreno-Zähler

Auf Geräten mit Qualcomm Adreno-GPUs sind unter anderem folgende Zähler verfügbar:

Zähler Beschreibung
Bandbreite für das Lesen von Texturspeicher (Byte/Sekunde) Bandbreite der Texturdaten, die aus dem externen Speicher gelesen werden.
% Texture L1 Miss L1-Cache-Fehler beim Abrufen von Texturen.
% Nicht-Basisebenen-Texturen Prozentsatz der Texturabrufe, die Mipmaps sind.
% Anisotrop gefiltert Prozentsatz der Texel, die anisotrop gefiltert werden.

ARM Mali-Zähler

Auf Geräten mit ARM Mali-GPUs sind unter anderem die folgenden Zähler verfügbar:

Zähler Beschreibung
Texturlesevorgänge aus externem Speicher Daten werden von der Textureinheit aus dem externen Speicher gelesen und über die Shader-Cores gemittelt.
Texturlesevorgänge aus dem L2-Cache Datenbits, die von der Textureinheit aus dem L2-Cache gelesen werden, gemittelt über die Shader-Cores.
[Mehr]

Um die Gesamtbandbreite aus den durchschnittlichen Lesevorgängen zu berechnen, wird der Zählerwert mit der Busbreite (in der Regel 16 Byte) und der Gesamtzahl der Shader-Cores multipliziert.

Gegenanalyse

Um das Verhalten dieser Zähler zu messen, erfassen Sie die durchschnittliche und maximale Bandbreite im Laufe eines einzelnen GPU-Frames und grenzen Sie sie dann mit einem zusammenhängenden Block der GPU-Auslastung ab.

Bandbreite für das Lesen von Texturspeicher für einen einzelnen Frame mit einem Durchschnittswert von 565 MB/s und einem Spitzenwert von 2, 30 GB/s
Abbildung 1. Bandbreite für das Lesen von Texturspeicher für einen einzelnen Frame mit einem Durchschnittswert von 565 MB/s und einem Spitzenwert von 2, 30 GB/s

Wir empfehlen eine durchschnittliche Bandbreite für das Lesen von Texturspeicher von maximal 1 GB/s und eine Spitzenbandbreite von maximal 3 GB/s. Die Anzahl der L1-Cache-Fehler bei Texturen sollte nicht höher als 10 % sein. Höhere Werte für Bandbreite oder L1-Cache können auf schwerwiegendere Texturprobleme hinweisen, z. B.:

  • Texturen sind zu groß: Große Texturen erhöhen die Paketgröße, sind teurer und können die Cache-Effizienz verringern.
  • Texturen sind nicht komprimiert: Alle Android-Smartphones unterstützen bestimmte Arten der Texturkomprimierung, z. B. ETC1 oder ASTC. Texturen sollten komprimiert werden, um die Paketgröße und die Texturbandbreite zu verringern.
  • Sonstiges: Es gibt eine Reihe weiterer Texturprobleme, die berücksichtigt werden sollten, darunter Texturen mit Potenz von 2, Mipmapping und anisotropes Filtern. Einige dieser Probleme lassen sich anhand des Systemprofils beobachten (siehe unten), während andere eine genauere Untersuchung erfordern.

Bei dreidimensionalen Spielen mit einer kostenlos beweglichen Kamera sollten Textur-Assets Mipmapping verwenden, damit Objekte, die sich in einiger Entfernung von der Kamera befinden, eine geringere Speicherbandbreite, einen effizienteren Textur-Cache und eine bessere Bildqualität aufweisen. Bei Geräten mit Qualcomm Adreno-GPUs können Zähler für Texturen ohne Basisebene, die im Durchschnitt unter 10 % liegen, auf unzureichendes Mipmapping hinweisen.

Nicht auf der Basisebene befindliche Texturen für einen einzelnen Frame mit einem Durchschnittswert von 9, 2%
Abbildung 2. Nicht-Basisebenen-Texturen für einen einzelnen Frame mit einem Durchschnittswert von 9, 2%

Eine weitere Überlegung ist die Verwendung von anisotropem Filtern, das durch den Zähler % Anisotropic Filtered für Qualcomm Adreno-GPUs für den Anteil der Texel beschrieben wird, die anisotrop gefiltert werden. Dies kann zwar die visuelle Qualität einiger Spiele verbessern, ist aber auch sehr rechenintensiv. Die Verwendung sollte daher gegen die Kosten für die GPU-Leistung abgewogen werden.

Prozentsatz der anisotropen Filterung für einen einzelnen Frame mit einem Durchschnittswert von 10, 8%
Abbildung 3. Prozentsatz der anisotrop gefilterten Pixel für einen einzelnen Frame mit einem Durchschnittswert von 10, 8%

Am besten lassen sich spezifische Probleme diagnostizieren, indem Sie einen Frame-Profil-Trace erstellen, um Textur-Assets zu analysieren.