2 Stimmen

OpenGL wird sehr langsam ausgeführt

Ich arbeite an einem Spiel und habe meinen Renderer getestet. Leider läuft er nur mit etwa 4 Bildern pro Sekunde. Das Profiling zeigt, dass überraschenderweise nur 5% der Laufzeit auf meinen Code entfallen und die restlichen 95% der Gesamtlaufzeit in nvoglnt.dll .

Es wird jedoch nur eine 256x256-Textur verwendet, und darüber hinaus ist der einzige OpenGL-Code, den ich abgesehen von ein paar Kameratransformationen verwende, die folgende Codevorlage. Es wird nur 134217728 Mal für insgesamt 33554432 Quads ausgeführt.

glTexCoord2f(u, v);
glColor3f(r, g, b);
glVertex3f(x, y, z);

Was könnte ich falsch machen, dass OpenGL so langsam wird? Gibt es allgemeine Leistungstechniken, mit denen ich die Leistung verbessern kann?

4voto

Hannesh Punkte 6956

Wie datenwolf sagte, ist 134217728 eine Menge der Zeiten. 33 Millionen Quads sind sogar eine Menge, wenn Sie Vertex-Arrays verwenden würden. Aber moderne Karten sollten das ziemlich gut hinbekommen.

Der Engpass liegt hier komplett bei der CPU, Sie rufen 134 Millionen x 3 Funktionen auf. jeder Rahmen . Da Sie mit 4 FPS arbeiten. Das sind 1,6 Milliarden Funktionsaufrufe pro Sekunde! Kein Wunder, dass es so langsam läuft.

Was Sie tun sollten, ist die Verwendung von Vertex Buffer Objects. Es spielt keine Rolle, wie flüchtig Ihre Daten sind, auch wenn Sie sie bei jedem Frame aktualisieren müssen, es wird schneller sein.

Da das nun geklärt ist, frage ich mich, warum Sie 33 Millionen flüchtige Quads rendern müssen? Wenn Sie uns einen umfassenderen Überblick darüber geben, was Sie tun, können wir Ihnen andere Optimierungstechniken vorschlagen.

2voto

datenwolf Punkte 154484

Sie wird nur 134217728 Mal ausgeführt, was einer Gesamtzahl von 33554432 Quads entspricht.

Jeder dieser "wenigen" Aufrufe bringt Ihr System dazu, den Ausführungskontext zwischen Ihrem Programm und dem OpenGL-Treiber zu wechseln. Dies ist nicht "wenige". Ehrlich gesagt würde ich diese Frage als feines Trolling betrachten, denn jedes OpenGL-Tutorial dieser Tage wird Ihnen sagen den sofortigen Modus nicht zu verwenden, da er genau die von Ihnen beobachteten Leistungseinbußen verursacht. d.h. glBegin, glEnd, glVertex und so weiter.

Vertex-Arrays verwenden oder besser noch Vertex-Puffer-Objekte .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X