Displayliste

Aus DGL Wiki
(Weitergeleitet von Displaylisten)
Wechseln zu: Navigation, Suche

Displaylisten bieten eine einfache Möglichkeit (statische) Daten, die Frame-für-Frame an die GPU gesendet werden, im Grafikkartenspeicher abzulegen und diese somit viel schneller zu rendern.

Konzept

Anstatt wie im Immediate-Modus alle Befehle und Vertexdaten in jedem Frame über die passenden Funktionen (z.B. glVertex) an die GPU zu senden, erstellt man in einer Initialisierung eine Displayliste (via glNewList mit dem Token GL_COMPILE) und legt dort alle (für Displaylisten gültigen) Befehle, Statechanges und Vertexdaten ab. Diese werden dann nur einmal an die Grafikkarte gesendet, dort vom Treiber so weit wie möglich optimiert (wie gut diese Optimierung klappt, hängt vom Treiber selbst ab) und dann im lokalen Grafikkartenspeicher abgelegt.

Möchte man diese Informationen nun rendern, reicht es, innerhalb der Renderprozedur die Displayliste über glCallList oder glCallLists aufzurufen und ihr Inhalt wird gerendert. Statt wie beim Immediate-Mode müssen die Daten jedoch nicht über den (recht langsamen) Bus erst an die Grafikkarte gesendet und dort ausgewerter werden, sondern werden von der GPU direkt optimiert aus dem lokalen Grafikkartenspeicher entnommen. Im Normalfall (es kommt darauf an, wo und wie die Anwendung limitiert ist. Wenn diese z.B. füllratenlimitiert ist, werden Displaylisten natürlich kaum etwas bringen) bringt diese eine sehr starke Geschwindigkeitssteigerung, hat jedoch zum Nachteil, dass Displaylisten je nach Inhalt recht viel Grafikkartenspeicher belegen können.

Was können Displaylisten leisten?

Kleines Beispiel : Der AGP-Bus schafft im 8xModus ~2 GByte an Daten/s, und über diesen Bus müssen alle Daten gesendet werden (im Immediate Modus). Eine moderne Grafikkarte (z.B. ein Radeon 9700) hat ein 256-Bit Speicherinterface mit recht hoher Geschwindigkeit (>300Mhz), und kann Daten so mit > 20 GByte/s aus dem lokalen Grafikkartenspeicher auslesen. D.h., dass eine Displayliste also rein theoretisch (die Praxis sieht IMMER etwas anders aus) auf einer solchen Karte ~10 mal so schnell gelesen und dargestellt werden kann.

Hinweise

Displaylisten eignen sich vom Prinzip her nur für statische Modelle/Daten (im Gegensatz zu VBOs), denn das Kompilieren einer Liste dauert in der Regel vergleichsweise lange, so dass man animierte Modelle nicht bei jeder Bewegung neu kompilieren kann, ohne dass die Anwendung darunter leiden wird. Als Alternative kann man je nach Animationsart für jeden Animationsframe eine eigene Displayliste erstellen, was je nach Animationslänge allerdings recht viel Speicher verbrauchen kann.

Nur der Inhalt einer Displayliste ist statisch. Wo eine Diplayliste gerendert wird, kann immer noch mit Befehlen wie z.B. glTranslate verändert werden. (Auch Skalieren (via glScale) ist möglich.)

WICHTIG: Displaylisten sind renderkontextabhängig!
Das heißt: Hat man 2 Renderkontexte (z.B. um auf 2 verschiedenen Oberflächen zu rendern), können diese nicht dieselben Displaylisten nutzen. Mittels wglShareLists kann dies trotzdem erreicht werden. In der Erklärung zu wglShareLists finden Sie mehr Informationen zu Displaylisten und ihrer Gültigkeit.


Befehle

Folgende OpenGL-Befehle stehen zur Verfügung um Displaylisten zu erstellen / nutzen :

  • glGenLists erstellt einen neuen (freien) Namen für eine DisplayListe.
  • glNewList startet eine neue Displayliste.
  • glEndList beendet diese Liste und legt diese dann (GL_COMPILE) kompiliert im Grafikkartenspeicher ab.
  • glCallList/glCallLists ruft eine/mehrere Displaylisten auf.
  • glDeleteLists löscht Displaylisten.
  • glIsList gibt an, ob sich hinter einem Namen eine Displayliste verbirgt.
  • wglShareLists ermöglicht es einem Renderkontext, die Displaylisten eines anderen RC zu nutzen.


Siehe Auch

Tutorial Lektion 5, Renderkontext, VBO