Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

BlueCobold

Community-Fossil

  • »BlueCobold« ist der Autor dieses Themas

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

1

05.08.2010, 09:36

[OpenGL] Performance von glBindBuffer wirklich so mies?

Moin.

Ich wollte zwecks Profiling meine bisherigen Draws von normalen VertexArrays auf VertexBufferObjects umstellen und habe daher eine Analyse der Performance durchgeführt. Erschreckender Weise stellte sich dabei heraus, dass glBindBuffer nahezu genauso viel Zeit braucht wie das Zeichnen meines Objektes an sich. Ist das wirklich so ein Performance-Fresser?

Hier mal die verglichenen Codes und deren Zeiten:

glDrawArrays mit normalen VertexPointern - 1.000.000 Durchläufe, 2.2 Sekunden benötigte Zeit

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
OpenGL.glEnableClientState ( OpenGL.GL_VERTEX_ARRAY );
OpenGL.glEnableClientState ( OpenGL.GL_TEXTURE_COORD_ARRAY );
OpenGL.glEnableClientState ( OpenGL.GL_COLOR_ARRAY );
OpenGL.glVertexPointer ( 2, OpenGL.GL_FLOAT, 0, m_UsedVertices );
OpenGL.glTexCoordPointer ( 2, OpenGL.GL_FLOAT, 0, m_BufferedTexCoords );
OpenGL.glColorPointer ( 4, OpenGL.GL_FLOAT, 0, m_UsedVertexColors );
OpenGL.glDrawArrays ( OpenGL.GL_TRIANGLE_STRIP, 0, 4 );
OpenGL.glDisableClientState ( OpenGL.GL_COLOR_ARRAY );
OpenGL.glDisableClientState ( OpenGL.GL_TEXTURE_COORD_ARRAY );
OpenGL.glDisableClientState ( OpenGL.GL_VERTEX_ARRAY );


glDrawArrays mit VertexBufferObjects - 1.000.000 Durchläufe, 4.3 Sekunden benötigte Zeit

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
OpenGL.glBindBuffer ( OpenGL.GL_ARRAY_BUFFER, mBuffer[0] );
OpenGL.glEnableClientState ( OpenGL.GL_VERTEX_ARRAY );
OpenGL.glEnableClientState ( OpenGL.GL_TEXTURE_COORD_ARRAY );
OpenGL.glEnableClientState ( OpenGL.GL_COLOR_ARRAY );
OpenGL.glVertexPointer ( 2, OpenGL.GL_FLOAT, 4 * 8, 0 );
OpenGL.glTexCoordPointer ( 2, OpenGL.GL_FLOAT, 4 * 8, 2 * 4 );
OpenGL.glColorPointer ( 4, OpenGL.GL_FLOAT, 4*8, 4*4 );
OpenGL.glDrawArrays ( OpenGL.GL_TRIANGLE_STRIP, 0, 4 );
OpenGL.glDisableClientState ( OpenGL.GL_COLOR_ARRAY );
OpenGL.glDisableClientState ( OpenGL.GL_TEXTURE_COORD_ARRAY );
OpenGL.glDisableClientState ( OpenGL.GL_VERTEX_ARRAY );
OpenGL.glBindBuffer ( OpenGL.GL_ARRAY_BUFFER, 0 );


Reines Profiling der glBindBuffer Funktionen - 1.000.000 Durchläufe, 1.8 Sekunden benötigte Zeit

C-/C++-Quelltext

1
2
OpenGL.glBindBuffer ( OpenGL.GL_ARRAY_BUFFER, mBuffer[0] );
OpenGL.glBindBuffer ( OpenGL.GL_ARRAY_BUFFER, 0 );


Ist das wirklich so extrem langsam? Oder mache ich eventuell was verkehrt beim Erstellen?

C-/C++-Quelltext

1
2
3
OpenGL.glGenBuffers ( 1, mBuffer );
OpenGL.glBindBuffer ( OpenGL.GL_ARRAY_BUFFER, mBuffer[0] );
OpenGL.glBufferData ( OpenGL.GL_ARRAY_BUFFER, 32*4, m_VBO.Values, OpenGL.GL_STATIC_DRAW );


Würde mich freuen, wenn da jemand was zu sagen kann. Denn selbst wenn man die 1.8 Sekunden für das Bind und die 2.2 Sekunden für das non-VBO-Draw addiert, so kommt man noch immer auf weniger Zeit (4.0 Sekunden), als das Ganze letztendlich tatsächlich benötigt (4.3 Sekunden).
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »BlueCobold« (05.08.2010, 09:43)


David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

2

05.08.2010, 09:51

Der Puffer muss ja auch nicht pro durchlauf neu gebunden werden. Und der Reset zurück zum Client-Memory hat in der Schleife ohnehin nichts verloren, der frisst nur Zeit.
@D13_Dreinig

BlueCobold

Community-Fossil

  • »BlueCobold« ist der Autor dieses Themas

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

3

05.08.2010, 10:50

Doch, das gehört sehr wohl in die Schleife, da es sich bei diesem Ausschnitt um den Code eines einzelnen, selbständigen Objektes handelt. Ich kann vorher nicht sagen, ob ein Bind nötig ist oder nicht, im Normalfall ist er aber nötig, weil vor und nach dem Call andere Objekte mit anderen VBOs (oder ohne!) behandelt werden.

Ich will ja hier nicht die schnellste Schleife programmieren, sondern komplette Draw-Methoden profilen. Und nur dafür existiert die Schleife überhaupt. Ich kann ja schlecht die Zeit für einen einzigen Draw-Call messen, das wäre ein wenig kurz und auch ungenau. Ich simuliere also das Zeichnen von 1.000.000 voneinander unabhängiger Objekte mittels einer Schleife.
Daher kann ich nicht einfach die Hälfte weglassen.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

4

05.08.2010, 11:05

Doch, das gehört sehr wohl in die Schleife, da es sich bei diesem Ausschnitt um den Code eines einzelnen, selbständigen Objektes handelt. Ich kann vorher nicht sagen, ob ein Bind nötig ist oder nicht, im Normalfall ist er aber nötig, weil vor und nach dem Call andere Objekte mit anderen VBOs (oder ohne!) behandelt werden.


glBindBuffer(GL_ARRAY_BUFFER, 0) hat da überhaupt nichts verloren. Es sei denn du wechselst ständig zwischen Client-Memory/Server-Memory. Und wer das macht ist selbst dran schuld...
@D13_Dreinig

BlueCobold

Community-Fossil

  • »BlueCobold« ist der Autor dieses Themas

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

5

05.08.2010, 11:12

Selbst wenn ich das weglassen würde indem ich ALLE Objekte auf VBOs umstellte (was für mich nicht weniger sinnvoll klingt), so wäre es immer noch langsamer als reine Vertex-Arrays, da das bind(0) nur 45% der gemessenen 1.8 Sekunden ausmacht und somit noch immer 1.0 Sekunden für das Setzen eines anderen VBO verbleiben.
Und das finde ich merkwürdig langsam.

PS:
Ansonsten fände ich es gut, wenn Du was zum Thema zu sagen hast, nämlich über die Performance von glBindBuffer. Denn das Geflame bezüglich "selber Schuld" & Co. kann ich hier nicht gebrauchen.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

6

05.08.2010, 11:37

Selbst wenn ich das weglassen würde indem ich ALLE Objekte auf VBOs umstellte (was für mich nicht weniger sinnvoll klingt)


Wieso sollte das kein Sinn machen?


PS:
Ansonsten fände ich es gut, wenn Du was zum Thema zu sagen hast, nämlich über die Performance von glBindBuffer. Denn das Geflame bezüglich "selber Schuld" & Co. kann ich hier nicht gebrauchen.


Danke, das steigert die Hilfsbereitschaft natürlich enorm... Zum einen ist man selbst schuld wenn man unnötige Calls tätigt. Zum anderen kann keine grundlegende Aussage bezüglich der Performance gemacht werden, weil das stark abhängig von diversen Faktoren (z.B. Treiberunterstützung) ist.
@D13_Dreinig

BlueCobold

Community-Fossil

  • »BlueCobold« ist der Autor dieses Themas

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

7

05.08.2010, 11:54

Na wenn du nichts dazu sagen kannst, dann lass es doch.

Und die Beurteilung, was Sinn macht oder nicht, die überlass doch bitte mir, da es mein Code ist.
Speziell dann, wenn das Ergebnis des Profilings eindeutig belegt, dass VBOs für meine Zwecke langsamer sind als normale Vertex-Arrays. Die Frage, warum sie also keinen Sinn machen, ist dadurch beantwortet.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

8

05.08.2010, 12:19

Na wenn du nichts dazu sagen kannst, dann lass es doch.


Ich hab doch was dazu gesagt. Nochmals: Es kann keine allgemeine Aussage über die Performance getroffen werden!
@D13_Dreinig

BlueCobold

Community-Fossil

  • »BlueCobold« ist der Autor dieses Themas

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

9

05.08.2010, 12:41

Na dann schreib das und nur das. Boar... Aber is klar, man kann also nicht die Performance einer Funktion mit der einer anderen vergleichen. Warum macht man dann überhaupt Profiling, wenn's nicht geht? Das is doch Quatsch. Klar kann man generelle Aussagen treffen. Wenn du es nicht kannst, gut, lass es. Niemand zwingt dich zu antworten.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

10

05.08.2010, 13:32

Na dann schreib das und nur das. Boar... Aber is klar, man kann also nicht die Performance einer Funktion mit der einer anderen vergleichen. Warum macht man dann überhaupt Profiling, wenn's nicht geht? Das is doch Quatsch. Klar kann man generelle Aussagen treffen. Wenn du es nicht kannst, gut, lass es. Niemand zwingt dich zu antworten.


Bleib mal sachlich!

Man kann keine generelle Aussage treffen. Höchstens eine speziell auf dein Problem getrimmte Aussage. Das Ganze hängt von diversen Faktoren ab (wie bereits oben erwähnt) wegen deren man keine generelle Antwort á la "Die Performance ist immer gut/schlecht" in dem Raum stellen kann... Es gibt z.B. Treiber mit extrem schlechter VBO Unterstützung bei denen deutliche Performanceeinbusen gegenüber anderen Methoden sichtbar werden.
@D13_Dreinig

Werbeanzeige