Hallo DGL Community! Ein Kumpel und ich arbeiten atm an einem Pacman in 3D. Allerdings lässt die Performance ein wenig zu wünschen übrig. Besonders wenn viele Wände der Map in Blickrichtung liegen. Im Anhang ist das Programm sowie eine Beispielmap, welche das Problem veranschaulicht. Wir hatten uns daher überlegt evtl. Frustum Culling für die Optimierung zu nutzen und haben zur Implementierung das ensprechende Tutorial genutzt (http://wiki.delphigl.com/index.php/Tuto ... um_Culling). Die Einbindung funktioniert soweit auch. Allerdings scheint das ganze überhaupt keinen Effekt zu haben. Die FPS drops bleiben weiterhin bestehen. Wo liegt da der Fehler? Oder liegt der Fehler vielleicht schon ganz woanders?
Wenn uns wer weiterhelfen könnte, wäre das super!
PS: Das Programm befindet sich noch in einer sehr frühen Phase von daher ist einges noch etwas unsauber und die Bedienung noch nicht gerade kompfortabel.
Willkommen bei DGL! Ok, ich hab mir den Code mal kurz angeschaut.
Ich glaube der Sinn von Frustum-Culling wurde nicht ganz verstanden. Ich habe das Tutorial nicht gelesen, möglich das das wichtige da nicht drin steht. Jedenfalls wird scheinbar für jedes Feld (=4 Quads) einzeln ein Sichtbarkeitstest ausgeführt? Das ist nicht sinnvoll, da die Grafikkarte selbst sowieso einen Sichtbarkeitstest für jedes Dreieck ausführt! Ein Sichtbarkeitstest auf der CPU macht nur Sinn wenn man dabei ein mit einem Test hunderte/tausende Polygone vom rendern ausschließt. Hier bieten sich Baumstrukturen an.
ABER die Map ist nur 50x50 groß wenn ich das richtig sehe. Entsprechend habt ihr 2500 Felder und damit gerade mal ~10000 Quads für die Map. Wenn man es richtig anstellt kann die Grafikkarte sowas im Schlaf. Frustum-Culling nicht wirklich notwendig! (Ist aber ggf. sinnvoll für Blöcke von 15x15 oder mehr Feldern)
HIER liegt der Hase begraben: Jedes Quad wird einzeln gerendert! Zwischen glBegin(GL_QUADS) und glEnd; kann man beliebig viele Quads packen. Ein glBegin ist ziemlich langsam da dort einiges initialisiert wird. Packe das gesamte Rendering der Map in ein einziges glBegin/glEnd-Paar...also quasi die Schleife da rein ziehen. Ihr werdet merken das ist massiv schneller.
Nichts desto trotz ist glBegin/glEnd, auch Immediate Mode genannt, verdammt langsam. In jedem Frame werden die Daten erneut auf die Grafikkarte hochgeladen. Schaut euch VBOs und Displaylisten an. Dieses sind noch einmal wesentlich schneller und ihr könnt recht problemlos hunderttausende Dreiecke rendern. Da sich z.B. die Map nicht ändert könnte man diese einfach mittels einer einzigen Displayliste rendern.
Registriert: Mi Jan 05, 2011 14:55 Beiträge: 47
Programmiersprache: Delphi, C++,C
Ach ja man kann auch im Forum schauen, das selbe hab ich auch vor nichmal einer Woche gefragt Hatte das gleiche Problem. Mit VOB's is mein Porgramm jetzt wesendlich resursenschonender und auch die Framerate hat sich verzehnfacht
Registriert: Fr Jan 04, 2008 21:29 Beiträge: 419 Wohnort: Lübeck
@nukular: Es heißt auch wesentlich und ressourcenschonender, aber das nur nebenbei^^
Öhm.. mir ist mal aufgefallen, dass hier im Forum mittlerweile jede dritte Frage darauf hinausläuft, dass man VBOs und Displaylisten empfiehlt, weil die Performance schlecht ist. Kann man das nicht einfach zusammenfassen und als Thread oben festpinnen? Ich meine, damit könnte man wohl schon von vornherein viele Probleme lösen. Als Titel würde ich vorschlagen "Performance FAQ zu OpenGL", dann könnte man da die typischen Probleme zusammenfassen, so wie sie auch im Wiki Eintrag drin sind, oder man linkt dort einfach hin. Ich finds mittlerweile nähmlich schon erdrückend, wenn man im Forum jeden Tag nen neuen "warum sind meine fps so niedrig"-Thread (Gott sei dank heißt es bei uns ja noch nicht "warum s1n m31n3 fsp soo00OO low o_O HLP RLY PLZ!!!111 kthxbye") findet. Immerhin sind die Lösungen fast immer die selben (VBO, Displaylisten, spatial partition & frustum culling). Es ist selten mal jemand dabei, der Optimierung in der Ausführungsgeschwindigkeit seines Shaders braucht. Selbst wenn das sein Problem sein sollte und er es noch nicht weiß, kann er doch trotzdem vorher solche grundlegenden Dinge gegenchecken. Das wäre auch förderlich für die Annahme von Opengl3.0+, da man so dem immediate Mode endlich an den Kragen geht. Klingt natürlich etwas harsch, als wenn ich nicht helfen wollte (ist ja nicht so), aber ständig das gleich zu wiederholen macht auf Dauer keinen Spaß und son geflame wie "nutz die Forensuche" will ich auch nicht loslassen müssen. Also ich mach dem User hier keine Vorwürfe, fragen ist ja erlaubt. Geht mir nur darum, dass immerwieder kehrende Probleme gepinnt werden könnten.
gruß, Sellmann.
PS: Falls das hier nicht hinpasst, kann das auch gerne ins Offtopic geschoben werden
Registriert: Do Sep 25, 2003 15:56 Beiträge: 7804 Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Aus diesem Grund wollen wir derartige Sachen zentral im Wiki zusammenfassen. Festpinnen hilft eh nix. Wer die Suche nicht benutzt schaut auch keine gepinnten Threads an. Außer man nennt den "Adminbereich - Geheim - Zugriff nur für Berechtigte" Dann schaut da vielleicht jamnd mal rein.
_________________ Blog: kevin-fleischer.de und fbaingermany.com
Öhm.. mir ist mal aufgefallen, dass hier im Forum mittlerweile jede dritte Frage darauf hinausläuft, dass man VBOs und Displaylisten empfiehlt, weil die Performance schlecht ist.
Das liegt meiner Meinung nach daran das nahezu sämtliche OpenGL Tutorials für Anfänger mit dem Immediate Mode anfangen. Dazu gab's mal nen Thread: viewtopic.php?f=4&t=9484
Registriert: Do Sep 25, 2003 15:56 Beiträge: 7804 Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Ich hätte nichts dagegen, wenn wir die Einsteigertutorials modernisieren. Wichtig wäre mir halt nur, dass der Einstieg nicht einen zu großen Sprung voraussetzt. Die alten Tutorials bringen einen Schritt für Schritt weiter, ohne das die Kurve zu steil ansteigt. Das hatte mir damals, da ich mit exakt 0 Vorwissen hier ankam, sehr geholfen.
_________________ Blog: kevin-fleischer.de und fbaingermany.com
In einem Forum habe ich gesehen, dass wenn man den Titel eines Beitrags eintippt ein Link erscheint welcher sagt, dass Fragen mit ähnlichem Titel gefunden wurden. Ich denke ein solches System bewegt den ein oder anderen dazu, sich vorher nochmal die verlinkten Suchergebnisse anzusehen. Das würde mehrfach Fragen verhindern.
Registriert: Fr Jan 04, 2008 21:29 Beiträge: 419 Wohnort: Lübeck
Das wäre natürlich auch ideal mit den Vorschlägen beim Threaderstellen. Müsste man aber schauen, wer dann wirklich die Funktion nutzt und ersteinmal die anderen Threads durchliest. Da gäbe es also das gleiche Problem wie bei dem Festgepinnten Thread. Anders gefragt, wäre es ein solcher Aufwand einen solchen Thread festzupinnen? Auch wenn es nur wenig Erfolg haben sollte, so wird es doch sicherlich trotzdem dem einen oder anderen helfen, oder? Wenn es tatsächlich nicht hilft, kann man ihn ja wieder entfernen.
Die Einsteigertutorials überarbeiten würde ich eher von abraten, die dürfen ruhig so bleiben (auch wenn ich es immer noch blöd finde, dass jetzt alles auf SDL umgemünzt ist). Vielleicht sollte man VBO und FBO eher als Einsteigertutorial umkonzipieren. So schwer ist es an sich nicht. Außerdem sollte jemand der in Grafik einsteigen will nicht vorgegaukelt bekommen, dass es einfach wäre. Das sieht man ja schon an dem Nachsitzen-Tutorial. => Aber das ist jetzt wieder ne ganz andere Diskussion.
Also im Endeffekt bin ich dafür einen festgepinnten Thread zumindest einmal auszuprobieren.
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Ich finde die Idee mit einem gepinnten Thread nicht schlecht und habe das gleich mal umgesetzt. Ich hoffe, dass damit diese guten Wiki-Artikel mal etwas mehr propagiert werden, dort steht ja schon einiges drin.
greetings
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Hi Leute! Wir danken euch für eure Antworten! Die Performance ist merklich besser geworden. Auch der oben gepostete Thread ist eine schöne Sache. Also nochmal danle. LG
Mitglieder in diesem Forum: Bing [Bot] und 9 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.