Vertex Cache

Aus DGL Wiki
Wechseln zu: Navigation, Suche

Vor allem bei Vertexgebundenen Applikationen sollte man darauf achten den Vertex Cache möglichst effektiv zu nützen. Der Vertex Cache - oder Transform & Lighting Cache - wird unterteilt in Pre- und Post-T&L-Cache.

Pre-T&L-Cache

Der Pre-T&L-Cache ist vergleichbar mit dem Cache der CPU. Wenn wir mit der CPU auf ein Byte im RAM zugreiffen, so wird ja bekanntlich der gesamte Block (in dem sich das gesuchte Byte befindet) im Cache abgelegt. Wenn nun auf Bytes im selben Block zugegriffen wird, so befinden sich diese bereits im Cache und dieser erlaubt einen schnellen Zugriff. Auf sehr ähnliche Weise funktioniert der Pre-T&L-Cache. Wenn wir einen größeren Array von Vertices besitzen und über eine Index-Liste darauf zugreifen, so bewirkt ein Zugriff auf einen Vertex nicht nur das holen des gesuchten Vertex, sondern der gesamte Block in dem sich der Vertex befindet wird in den Pre-T&L-Cache geladen. Wird nun solange dieser Block im Cache liegt ein Index angegeben, welcher einen Vertex im selben Block referenziert, so kann dieser Vertex sehr schnell aus dem Cache ausgelesen werden.

Cache-Größe

Der Pre-T&L-Cache ist üblicherweise verhältnismäßig groß. Einige Beispiele:

Hinweise zur Performance

Bei diesem Cache können nur begrenzt allgemein gültige Hinweise zur Performance gegeben werden, da verschiedene Grafikkarten unterschiedliche Strategien und Implementierungen besitzen können. Üblicherweise sollten jedoch folgende Punkte beachtet werden:

  • Verhältnismäßig sequenzielle Zugriffe auf einen Vertex-Array sind wünschenswert.
  • Vertex-Array-Blöcke die zu groß für den Cache sind können sich negativ auswirken, vor allem bei eher wenigen sequenziellen Zugriffen.
  • Mehrere Vertex-Daten-Streams können sich negativ auswirken, wodurch meistens verschachtelte Streams (siehe glInterleavedArrays) vorzuziehen sind. Wenn jedoch beispielsweise die Vertex-Daten statisch sind jedoch die Farbwerte oder Texturcoordinaten dynamisch, so ist es natürlich dennoch besser wenn die Vertex-Daten getrennt im GPU-Speicher abgelegt werden.
  • Vor allem bei eher nicht sequenziellen Zugriffen ist es üblicherweise hilfreich wenn die Daten für einen Vertex eine "gut handhabbare" Größe besitzen (üblicherweise 32 Byte).

Post-T&L-Cache

Der Post-T&L-Cache dient dazu um Ergebnisse der Vertex-Pipeline zu speichern. Wenn ein vor kurzem berechneter Vertex identisch ist mit dem zu berechnenden Vertex, so wird das gespeicherte Ergebnis verwendet und somit muss dieser Vertex die Vertex-Pipeline nicht mehr durchlaufen. Zu beachten ist, dass dieser Cache üblicherweise als FIFO (First in first out) realisiert ist und nicht der für Cache-Systeme gängigere LRU (Least recently used) Algorithmus verwendet wird.

Cache-Größe

Die größe dieses Caches ist üblicherweise stark begrenzt. Einige Beispiele:

Hinweise zur Performance

Hier sollte man nur darauf achten, dass gleiche Vertices möglichst schnell hintereinander verwendet werden. Das typische Beispiel hierfür ist ein 2 dimensionales Gitternetz (beispeilsweise eine Heightmap) bei dem immer ein Streifen mit einem Triangle-Strip gezeichnet wird. Besitzen wir beispielsweise einen Vertex-Cache mit 16 Einträgen, so ist die optimale größe für einen Triangle-Strip 7 Vierecke (wofür wir genau 16 Eckpunkte benötigen). Zeichen wir nun den darunter liegenden Streifen, wo die Hälfte der Punkte mit dem oberen Streifen geteilt werden, so wird für jeden zweiten Punkt der Vertex-Cache verwendet. Werden hingegen 8 Vierecke je Streifen gezeichnet, so wird der Vertex-Cache überhaupt nicht verwendet. Wenn man also mehr als 7 Vierecke je Streifen besitzt, so ist es besser man zeichnet den ersten Streifen von links nach rechts und den zweiten Streifen von rechts nach links usw., wodurch wenigstens ein Teil der Punkte noch im Vertex-Cache zu finden ist.

Referenzen