Hi
Ich bin noch ziemlich neu in Delphi und OpenGL und hab schon eine Frage die ich mir nicht selbst beantworten kann...
Ich programmiere im Moment ein Spiel, in diesem Spiel benötige ich eine Map aus Hexfeldern. So weit so gut, das Spielfeld kann ich schon zeichnen und Texturieren, das ist nicht das Problem.
Anschließend habe ich alles in eine Liste gespeichert.
Nun gut... schließlich wollte ich Frustum Culling einbauen, das ging auch gut, nur vielen die FPS seltsamerweise rapide ab! Nun bin ich draufgekommen, dass ich ja JEDEN Frame die Liste neu erstelle, die die Hexfelder UND die Berechnungen für das Frustum Culling beinhaltet...
Das habe ich dann geändert, damit die Liste nur einmal gezeichnet wird.
Ich mache das mit folgendem Code:
Code:
if MapLoaded =0then
begin
glGenLists(1);
glNewList(Landscape, GL_COMPILE);
Map.DrawMap;
glendlist;
MapLoaded :=1;
end;
In der Prozedur DrawMap befindet sich eben das Frustum und die Zeichnung... Nur das Problem ist ja jetzt, dass das Frustum Culling ebenfalls nur einmal berechnet wird.. das heißt ich sehe nur die Felder die ich Anfangs am Screen habe, und wenn ich scrolle sehe ich immer nur noch diese...
Meine Frage ist nun, wie ich Performance sparend trotzdem das Frustum Culling nutzen kann?! Die Listen fallen da ja scheinbar eher weg... Oder gibts ne Möglichkeit, dass ich das Frustum Culling trotzdem jedes Frame berechnen kann, aber nur der Sichtbare Teil der Liste ausgegeben wird?
Registriert: Do Sep 25, 2003 15:56 Beiträge: 7810 Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Du hast nen Grundlegenden Denkfehler im Bezug auf Displaylisten.
Max mal folgendes:
Bei Programmstart(!) kompilierst du die Komplette(!) Map in eine Displayliste. (Ohne Frustum Culling)
Beim Zeichnen(!) rufst du die Displayliste nur noch auf.
Es ist falsch die Displayliste bei jedem Durchgang zu erstellen. Das bremst dann natürlich. Was Displaylisten sind und wie sie funktionieren findest du in unserem Wiki nochmal beschrieben. Ließ das bitte nochmal nach.
_________________ Blog: kevin-fleischer.de und fbaingermany.com
Nimm am besten keine Display Listen, auch wenn sie sehr einfach sind, sondern Vertex Buffer. Die sind schneller und trotzdem flexibeler. Dort übergibt man OpenGL mit glBufferData einmal ein Array mit seinen Punkten. In jedem Frame ruft man dann glDrawElements auf und nimmt da nur die Indizes seiner Punkte. Das ist vielleicht ein wenig zu aufwändig für eine 2D Map, aber der bevorzugte Weg um seine Dreiecke zu zeichnen.
Hmn... danke, dass da irgendwo ein Denkfehler war, hab ich mir schon gedacht...
Werd mir mal die Vertexbuffer ansehen, aber auch nochmal die Wiki bei den Displaylisten.
Registriert: Sa Nov 13, 2004 11:00 Beiträge: 229 Wohnort: Steinhude
solltest du bei DLs bleiben wollen, würde nur noch bleiben das Terrain in mehrere Listen aufzuteilen und dann jeweils für jede Liste gegen das frustum zu testen und die dann entsprechend zu zeichnen / nicht zu zeichnen.
Hmn... irgendwie hab ich im Moment keine Ahnung von den Vertex Buffern. Gibts da auch irgendwie Beispiele/Tutorials?
Wie gesagt hab ich noch nicht viel Ahnung, mein Spiel soll zum lernen dienen.
Aber das mit den DP wär zumindest mal eine Möglichkeit, die ich verstehen würde... ^^
Registriert: Sa Nov 13, 2004 11:00 Beiträge: 229 Wohnort: Steinhude
schau mal unter tutorials ->extensions->GL_ARB_Vertex_Buffer_object nach
und natürlich inner wiki zu GL_Vertex_Array und Vertex Buffer objects
auf http://nehe.gamedev.net/ is glaub ich auch noch eins
Zuletzt geändert von Grizzly am Fr Apr 22, 2005 15:47, insgesamt 1-mal geändert.
Registriert: Do Sep 25, 2003 15:56 Beiträge: 7810 Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Na dann machs halt so wie Thunder das sagt. Einfach das Terrain in Bereiche aufteilen. Für jeden Bereich ne DL speichern und die Extremwerte der Bereiche. Mit den Extremwerten kannste Testen und wennd er Test sagt es muss gezeichnet werden dann rufste halt die liste auf.
_________________ Blog: kevin-fleischer.de und fbaingermany.com
Mitglieder in diesem Forum: 0 Mitglieder und 3 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.