Displayliste: Unterschied zwischen den Versionen

Aus DGL Wiki
Wechseln zu: Navigation, Suche
K (Wiki-Link)
 
(4 dazwischenliegende Versionen von 4 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
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.
+
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 ==
 
== 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.
+
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.
+
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? ==
 
== Was können Displaylisten leisten? ==
Zeile 10: Zeile 10:
  
 
== Hinweise ==
 
== Hinweise ==
Displaylisten eignen sich vom Prinzip her nur für '''statische''' Modelle/Daten (Im Gegensatz zu [[VBO]]s). 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.
+
Displaylisten eignen sich vom Prinzip her nur für '''statische''' Modelle/Daten (im Gegensatz zu [[VBO]]s), 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)
+
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 [[Renderkontext|renderkontextabhängig]]!'''<br>
 +
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.
  
'''WICHTIG: Displaylisten sind [[Renderkontext]]abhängig!'''<br>
 
Das heißt: Hat man 2 Renderkontexte (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.
 
  
<br>
 
  
 
== Befehle ==
 
== Befehle ==
Folgende OpenGL-Befehle stehen zur Verfügung um Displaylisten zu erstellen / nutzen :<ul>
+
Folgende OpenGL-Befehle stehen zur Verfügung um Displaylisten zu erstellen / nutzen :
<li>[[glGenLists]] erstellt einen neuen (freien) Namen für eine DisplayListe.</li>
+
*[[glGenLists]] erstellt einen neuen (freien) Namen für eine DisplayListe.
<li>[[glNewList]] startet eine neue Displayliste.</li>
+
*[[glNewList]] startet eine neue Displayliste.
<li>[[glEndList]] beendet diese Liste und legt diese dann (GL_COMPILE) kompiliert im Grafikkartenspeicher ab.</li>
+
*[[glEndList]] beendet diese Liste und legt diese dann (GL_COMPILE) kompiliert im Grafikkartenspeicher ab.
<li>[[glCallList]]/[[glCallLists]] ruft eine/mehrere Displaylisten auf.</li>
+
*[[glCallList]]/[[glCallLists]] ruft eine/mehrere Displaylisten auf.
<li>[[glDeleteLists]] löscht Displaylisten.</li>
+
*[[glDeleteLists]] löscht Displaylisten.
<li>[[glIsList]] gibt an ob sich hinter einem Namen eine Displayliste verbirgt.</li>
+
*[[glIsList]] gibt an, ob sich hinter einem Namen eine Displayliste verbirgt.
<li>[[wglShareLists]] ermöglicht es einem Renderkontext die Displaylisten eines anderen RC zu nutzen.</li>
+
*[[wglShareLists]] ermöglicht es einem Renderkontext, die Displaylisten eines anderen RC zu nutzen.
</ul>
+
 
 +
 
  
 
== Siehe Auch ==
 
== Siehe Auch ==
[[Renderkontext]], [[VBO]]
+
[[Tutorial Lektion 5]], [[Renderkontext]], [[VBO]]

Aktuelle Version vom 24. Mai 2008, 13:38 Uhr

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