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

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

1

16.04.2012, 20:13

OpenGL Shared Render Contexts für Multi-Threading

Hi, ich versuche mich endlich mal an multi-threaded rendering bzw. multi-threaded resource-generation mit OpenGL.
Den Einstieg dazu habe ich hier gelesen.

Für multi-threading mit OpenGL braucht man mehrere RenderContexte (unter Windows HGLRC Objekte) die man mit "wglShareLists" verbinden kann.
Außerdem muss man im jeweiligen Thread immer einen RenderContext aktivieren und wieder deaktivieren:

C-/C++-Quelltext

1
2
3
4
Thread1:
wglMakeCurrent(DeviceHandle, SharedRenderContext);
// Lade Texturen ...
wglMakeCurrent(0, 0);


Meine Frage: wie teuer sind diese Kontext-wechsel und wie effizient ist es haufen Weise 'Shared-RenderContexts' zu haben, die alle mit dem 'Haupt-RenderContext' per wglShareLists verbunden sind?
Über sonstige Tips zu multi-threaded rendering allgemein oder speziell zu OpenGL würde ich mich auch freuen :)

Gruß,
Lukas

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

16.04.2012, 20:56

Multi-threaded rendering ist in OpenGL praktisch unmöglich, zumindest ist mir kein vernünftiger Weg bekannt.
Wie teuer die Switches sind, kann ich dir nicht genau sagen, aber das ist imo auch nicht wirklich wichtig, da du in der Regel sowieso einfach nur einen Context pro Thread wirst haben wollen. Ein ständiges hin und her switchen ist imo jedenfalls kaum sinnvoll, da du dabei effektiv ja erst wieder alles serialisieren würdest. Das Beste, was du mit OpenGL meines Wissens nach machen kannst, ist asynchrones Erzeugen von Ressourcen. Und schon dabei musst du meiner Erfahrung nach wahnsinnig vorsichtig sein...

Abgesehen davon, würde ich empfehlen, statt wglCreateContext() und wglShareLists() mit wglCreateContextAttribsARB() zu arbeiten. Das ist, wie man es heutzutage macht. Dabei kannst du auch gleich ein entsprechendes Core Profile verlangen, was ich ebenfalls zu Herzen legen würde.

Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von »dot« (16.04.2012, 21:08)


LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

3

16.04.2012, 21:18

Jo meinte ich ja, also nicht multi-threaded rendering aber eben resource-Erzeugung. Oder z.B. wenn man eine Skelet-Animation hat die man in einem Thread updaten will und dann in diesem dann auch gleich per "glBufferData" der manipulieren Vertex-Daten an die Grafikkarte schicken will.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

4

16.04.2012, 21:22

Aber für das brauchst du einfach nur einen ganz normalen Context der seine Objekte mit dem Hauptcontext shared ;)

Werbeanzeige