Effiziente und speicherschonende Mesherstellung in OpenGL
Verfasst: 19.01.2015, 03:09
Hallo mal wieder,
ich bastel gerade wieder an OpenGL Code, und habe ein Problem: Ich erstelle eine Menge Objekte, die jeweils einige Zeit verwendet werden (zumeist einige Hundert Frames). Die Vertices werden nicht aus Dateien geladen, sondern berechnet. Der Detailgrad ist dabei von der Kameraperspektive abhängig, daher ist die Vertex-Anzahl bis zum erstellen unbekannt. Ich fülle die Daten daher in einen etwas optimierten Container (ähnlich std::vector<float>). Dann werden sie mit glBufferData mit dem Hint GL_DYNAMIC_DRAW, oder wenn ein altes Buffer Object wiederverwendet wird, mit glBufferSubData kopiert.
Ich weiß nicht, wie lange das kopieren dauert, aber im Falle einer GPU ohne dedizierten Speicher kommt es mir sinnlos vor. Außerdem ist es schwierig, die umgeladenen Container immer zeitnah wegzuräumen, wenn ich das mache wird der Heap schön durchgerührt, wenn ich es aber nicht mache, habe ich bei nicht-dediziertem Speicher schnell ein Speicherproblem. In der Tat verbraucht mein Prozess mit einer Intel GPU unter Linux etwas mehr als doppelt so viel physischen Speicher wie es Vertexdaten zum rendern hat, offenbar wird hier der reservierte Grafikspeicher sauber dem Prozess zugehörig angezeigt.
Gibt es eine schlaue Weise, wie man diese Verdoppelung von Speicher und Schreibvorgängen vermeiden kann? Früher war es ja üblich, GL direkt von Array-Pointern zeichnen zu lassen. Würde diese Technik heute noch funktionieren, und bei integrierten GPUs das kopieren vermeiden?
ich bastel gerade wieder an OpenGL Code, und habe ein Problem: Ich erstelle eine Menge Objekte, die jeweils einige Zeit verwendet werden (zumeist einige Hundert Frames). Die Vertices werden nicht aus Dateien geladen, sondern berechnet. Der Detailgrad ist dabei von der Kameraperspektive abhängig, daher ist die Vertex-Anzahl bis zum erstellen unbekannt. Ich fülle die Daten daher in einen etwas optimierten Container (ähnlich std::vector<float>). Dann werden sie mit glBufferData mit dem Hint GL_DYNAMIC_DRAW, oder wenn ein altes Buffer Object wiederverwendet wird, mit glBufferSubData kopiert.
Ich weiß nicht, wie lange das kopieren dauert, aber im Falle einer GPU ohne dedizierten Speicher kommt es mir sinnlos vor. Außerdem ist es schwierig, die umgeladenen Container immer zeitnah wegzuräumen, wenn ich das mache wird der Heap schön durchgerührt, wenn ich es aber nicht mache, habe ich bei nicht-dediziertem Speicher schnell ein Speicherproblem. In der Tat verbraucht mein Prozess mit einer Intel GPU unter Linux etwas mehr als doppelt so viel physischen Speicher wie es Vertexdaten zum rendern hat, offenbar wird hier der reservierte Grafikspeicher sauber dem Prozess zugehörig angezeigt.
Gibt es eine schlaue Weise, wie man diese Verdoppelung von Speicher und Schreibvorgängen vermeiden kann? Früher war es ja üblich, GL direkt von Array-Pointern zeichnen zu lassen. Würde diese Technik heute noch funktionieren, und bei integrierten GPUs das kopieren vermeiden?