Displayliste: Unterschied zwischen den Versionen
K (=Befehle= Struktur) |
K (ein paar kleine Tippfehler entfernt) |
||
Zeile 1: | Zeile 1: | ||
= Konzept = | = 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 | + | 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 | + | 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 | + | 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 and 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. das 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. | Kleines Beispiel : Der AGP-Bus schafft im 8xModus ~2 GByte and 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. das 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. |
Version vom 9. Juli 2004, 15:26 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 and 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. das 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 animiete 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.
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.