2010-05-23 6 views
5

Ich möchte viele Polygone auf den Bildschirm zeichnen, aber ich merke schnell, dass es sich schnell verlangsamt. Als Test habe ich folgendes gemacht:Erstellen Sie viele Polygone mit OpenGL ist langsam?

for(int i = 0; i < 50; ++i) 
{ 
     glBegin(GL_POLYGON); 
     glColor3f(0.0f, 1, 0.0f); glVertex2f(500.0 + frameGL.GetCameraX(), 0.0f + frameGL.GetCameraY()); 
     glColor3f(0.0f, 1.0f, 0.0f); glVertex2f(900.0 + frameGL.GetCameraX(), 0.0f + frameGL.GetCameraY()); 
     glColor3f(0.0f, 0.0f, 0.5); glVertex2f(900.0 + frameGL.GetCameraX(), 500.0f + frameGL.GetCameraY() + (150)); 
     glColor3f(0.0f, 1.0f, 0.0f); glVertex2f(500 + frameGL.GetCameraX(), 500.0f + frameGL.GetCameraY()); 
     glColor3f(1.0f, 1.0f, 0.0f); glVertex2f(300 + frameGL.GetCameraX(), 200.0f + frameGL.GetCameraY()); 
     glEnd(); 
} 

Das sind nur 50 Polygone und schon ist es langsam. Ich kann sie nicht direkt auf die Karte hochladen, weil mein Programm dem Benutzer erlaubt, die Vertices neu zu gestalten.

Meine Frage ist, wie kann ich das beschleunigen. Ich benutze keine Tiefe. Ich weiß auch, dass es nicht meine GetCamera() -Funktionen ist, denn wenn ich 500.000 Polygone spreize, ist es in Ordnung, sie nur in der Ansicht zu zeigen. Wenn eine Grafikkarte 500.000.000 Bildschirm-Polygone pro Sekunde unterstützen kann, sollte das einfach sein, oder?

Dank

Antwort

14
  1. wie bereits erwähnt nicht tun glBegin und glEnd in der Schleife aber
  2. außerhalb für eine noch bessere Leistung Verwendung vertex arrays
  3. für eine optimale Leistung Verwendung vertex buffer objects

Die Lösungen sind geordnet in wie viel Geschwindigkeit gewinnen Sie erhalten, und umgekehrt, wie breit sie unterstützt werden. Das heißt, jede moderne Grafikkarte unterstützt all diese - Sie müssen nur vorsichtig sein, wenn Sie für eingebettete OpenGL-Systeme programmieren.

Zeitgenössische Spiele (diejenigen, die Ihre angegebenen 500kk Grenze erreichen) alle mindestens VBO verwenden (wenn nicht Geometrie Shader, aber das ist sogar einen Schritt darüber hinaus). Um die erwähnten Techniken effektiv zu erlernen, schlage ich ehrlich vor, sie Schritt für Schritt zu nehmen - z. erste Lern-Display-Listen, dann Vertex-Arrays, dann VBO's, weil in der Praxis jedes auf dem ersten aufbaut.

Immediate-Modus (gekennzeichnet durch die Verwendung eines GL-Befehls pro Objekt) ist extrem langsam und sogar im aktuellen GL-Standard veraltet - eine lange Theorie kurz, es liegt an einer der teuersten Grafikoperation (abgesehen von Texturmanipulation) Es sind Unentschieden - Anrufe zwischen der Grafikkarte und dem Prozessor - in der Praxis ist es also am besten, vorher alles vorzubereiten und es in einem Anruf (oder so wenig wie möglich) an die GPU zu senden.

Viel Glück!

+0

+1 für die Angabe einer geordneten Liste anstelle einer einzigen Möglichkeit als * die * Lösung. –

+0

VBOs bauen auf Vertex-Arrays auf, aber nicht auf Anzeigelisten. Sie können sicher überspringen, wenn Sie sich mit Anzeigelisten vertraut machen, oder sie kurz anschauen, damit Sie wissen, wann Sie sie verwenden müssen. – Thomas

+0

Nur eine Sache, was ist, wenn ich die GLU Tessellation verwende? – jmasterx

Verwandte Themen