Frage

Mein Programm verwendet Pyopengl (also ist es Python) mit Psyco.

Ich habe rund 21.000 Liniensegmente, die ich in jedem Rahmen meines Renders rendern muss (es sei denn, der Benutzer zoomt ein. In diesem Fall werden die Zeilensegmente beschleunigt und überhaupt nicht an die Karte gesendet). Dies dauert derzeit rund 1,5 Sekunden pro Rahmen. Das ist einfach nicht gut genug, also suche ich nach Möglichkeiten, die Anzahl der unterschiedlichen Liniensegmente zu verringern.

Ich kann mir vorstellen, dass es Fälle geben würde, in denen mehrere Liniensegmente in eine große Linie verschmolzen werden können, aber ich weiß ehrlich gesagt nicht einmal, wo ich damit anfangen soll. Ich habe den Startpunkt und den Endpunkt jeder Linie gespeichert, sodass die Dinge helfen können. Beachten Sie, dass ich beim Start so lange dauern kann, und das Speicherverbrauch ist kein allzu großes Problem.

Alle Ideen wären sehr geschätzt.

War es hilfreich?

Lösung

Es ist mit ziemlicher Sicherheit der Overhead aller unmittelbaren Modus -Funktionsaufrufe, die Ihre Leistung töten. Ich würde Folgendes machen.

Verwenden Sie nicht GL_LINE_STRIPS, Verwenden Sie eine einzige Liste von GL_LINES Stattdessen können sie auf einmal gerendert werden.

Verwenden glDrawArrays Anstelle eines sofortigen Moduswechsels:

float* coordinates = {....}; //x and y coordinate pairs for all line segments
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(2, GL_FLOAT, 2 * sizeof(float), coordinates);
glDrawArrays(GL_LINES, 0, 2 * linecount);
glDisableClientState(GL_VERTEX_ARRAY);

(Für eine noch bessere Leistung können Sie den Scheitelpunktpuffer in einem sogenannten Vertex -Pufferobjekt speichern, aber dies sollte von Anfang an in Ordnung sein)

Eine letzte Sache, wenn Sie pro Zeilenbasis keulen, ist es wahrscheinlich schneller, es einfach zu überspringen und alle Zeilen an die GPU zu senden.

Andere Tipps

20K -Segmente sind nicht so viel. Außerdem haben Sie Glück, wenn Sie 10-100 Zeilen pro Rahmen zusammenführen können, sodass die Beschleunigung durch diese Optimierung vernachlässigbar ist. Der Rendering -Prozess ist wahrscheinlich langsam, da Sie das Modell immer wieder erstellen. Verwenden glNewList() Um alle Rendering -Befehle in einer GL -Render -Liste auf der Karte zu speichern, und dann einfach nur ausgeben glCallList() um es mit einem einzigen Befehl zu rendern.

Sie können eine Fehlermetrik für das Zusammenführen von zwei Zeilensegmenten in einen definieren und dann alle Segmentepaare testen und dann zusammenführen, wenn der Fehler unter einem bestimmten Schwellenwert liegt.

Ein Beispiel ist dieser Algorithmus:

  1. Konstruieren Sie ein neues Liniensegment X aus den beiden Punkten, die in den beiden Liniensegmenten A und B. am weitesten voneinander entfernt sind
  2. Finden Sie den Mindestabstand zu X für alle Punkte in A und B.
  3. Weisen Sie den Fehler als Maximum dieser minimalen Entfernungen zu.
  4. Ersetzen Sie A und B durch X, wenn der Fehler unter Ihrem Schwellenwert liegt.

Dies ist nicht der beste Algorithmus, aber es ist einfach zu implementieren.

Bearbeiten 1

Versuchen Sie auf jeden Fall Anzeigelisten oder Vertex -Puffer -Objekt -Rendering, bevor Sie dies implementieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top