Displayliste: Unterschied zwischen den Versionen

Aus DGL Wiki
Wechseln zu: Navigation, Suche
K (Befehle)
(Konzept)
Zeile 10: Zeile 10:
  
 
Hinweis : Displaylisten eignen sich vom Prinzip her nur für '''statische''' Modelle/Daten. Denn das Kompilieren einer Liste dauert i.d.R. recht lange (vergleichsweise), so dass man animierte Modelle nicht bei jeder Bewegung neu kompilieren kann, ohne das 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.
 
Hinweis : Displaylisten eignen sich vom Prinzip her nur für '''statische''' Modelle/Daten. Denn das Kompilieren einer Liste dauert i.d.R. recht lange (vergleichsweise), so dass man animierte Modelle nicht bei jeder Bewegung neu kompilieren kann, ohne das 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 ([[glScale]] ist möglich)
  
 
'''WICHTIG: Displaylisten sind Rendercontextabhängig!'''<br>  
 
'''WICHTIG: Displaylisten sind Rendercontextabhängig!'''<br>  

Version vom 30. Januar 2005, 16:08 Uhr

Konzept

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.

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 dieses eine mal 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.

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.

Hinweis : Displaylisten eignen sich vom Prinzip her nur für statische Modelle/Daten. Denn das Kompilieren einer Liste dauert i.d.R. recht lange (vergleichsweise), so dass man animierte Modelle nicht bei jeder Bewegung neu kompilieren kann, ohne das 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 (glScale ist möglich)

WICHTIG: Displaylisten sind Rendercontextabhängig!
Das heißt: Hat man 2 RCs (z.B. um auf 2 verschiedenen Oberflächen zu rendern) können diese nicht dieselben DLen nutzen. Mittels wglShareLists kann dies trotzdem erreicht werden. In der Erklärung zu wglShareLists finden Sie mehr Informationen zu DL 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 Rendercontext die Displaylisten eines anderen RC zu nutzen.