Große Zahl von Strecken effizient rendern (OpenGL, Java)?
-
Hallo Leute,
ich habe einen ungerichteten Graphen, der in jedem Frame vergrößert, nie aber verkleinert wird. Dabei werden Knoten-, und dementsprechend Kantenzahlen im Bereich von wenigen Millionen erreicht. Alle Kanten sollen gezeichnet werden.Mein limitierender Faktor sind momentan die draw-calls, die ich in Java über lwjgl mache. Das ist auch nicht verwunderlich, denn bisher mache ich das auf naivste Weise, indem ich jede Kante (mehrfach, wegen Ungerichtetheit) in glBegin(GL_LINES)/glEnd-Blöcken rendere (und ja, mir ist bewusst, dass das Steinzeit ist, aber die grafische Repräsentation ist eigentlich nicht mein Hauptansinnen).
Mit welcher Technik lässt sich das (also eine sehr große Menge von Primitiven, von denen viele doppelt vorkommen, rendern) effizient machen, wenn die Menge von Primitiven sich immer nur vergrößert?
-
Verwend VBOs oder zumindest Vertex Arrays.
-
Danke für das Stichwort.
Ich hab's nun mal via Vertex Arrays und glDrawElements() implementiert, hat super geklappt :).
Eine Sache macht bleibt:
Ich füge neue Knoten zu einer vertex-Collection und die neuen Kanten zu einer index-Collection hinzu und generiere daraus in jedem Frame die für LWJGL nötigen IntBuffer- bzw. FloatBuffer-Objekte. Das erfordert natürlich einen immensen Kopieraufwand, ich würde lieber gleich in den Buffer schreiben und diesen dynamisch vergrößern, wenn der Platz ausgeht.
Gibt es einen Standardweg in Java, um dynamische Buffer zu haben, oder muss ich mir da selbst einen Wrapper (der auch ungeordnete puts und gets hintereinander möglich macht) frickeln?
-
Ich verwend kaum Java, aber sollte eine Java ArrayList nicht genau so einen dynamischen Buffer implementieren?
Ansonsten kannst du natürlich selbst was basteln. Dann am besten gleich mit VBOs, indem du einfach ein VBO erzeugst, das du z.B. 1.5 mal so groß wie nötig machst und erst wenn das voll ist, machst du ein neues (wieder 1.5 mal so groß wie nun nötig) und kopierst.
Das Kopieren kannst du dir aber evtl. auch ganz sparen, indem du einfach z.B. Buffer für jeweils 30000 Linien machst und dann eben alles in 30000er Häppchen renderst. Das wär für deinen Anwendungsfall vermutlich eine gute Lösung.
-
Naja, eine ArrayList lässt sich zwar als "Pufferspeicher" gebrauchen, aber er implementiert halt leider nicht das Interface java.nio.Buffer.
Das stückweise Rendern wäre momentan auch mein Favorit gewesen, ich denke, so werd ich's machen.Danke für die Hilfe
-
primitivling schrieb:
Das stückweise Rendern wäre momentan auch mein Favorit gewesen, ich denke, so werd ich's machen.
Und dabei dann am besten VBOs verwenden statt VertexArrays