[WinAPI/OpenGL - Solved] Eigener RenderingContext für mehrere Fenster mit Multithreading
-
Hallo,
folgendes Problem:
Ich muss eine Applikation entwickeln, die eine beliebige Zahl an Fenstern innerhalb eines gegebenen Parentwindows erstellt und den Zeichenoperationen in jedem Fenster einen eigenen Thread zuweist. Habe dazu eine Window-Klasse erstellt, die das ganze kapselt und einen WindowManager, der die Windows verwaltet und auch die WindowProc eines jeden Windows anspricht (statische WndProc im WindowManager mit Weiterleitung an die WindowProc in der Klasse Window). Das funktioniert auch soweit ganz gut, z.B. kann ich in jedes Window eine Zahl schreiben, die von dem zugehörigen Thread sekündlich inkrementiert wird. Das ganze funktioniert bisher sehr gut.Nun muss ich die Funktionalität dergestalt erweitern, dass jedes Fenster seinen eigenen OpenGL-RenderingContext bekommt, in dem im zugehörigen Thread gezeichnet wird. Es gibt zu Multithreading auch Beispiele bei MSDN, allerdings beschränkt sich das nun auf immer nur einen RC bzw. ein Fenster.
Meine Frage nun:
Inwiefern ist OpenGL unter Windows threadsafe, wenn es mehrere RCs gibt, von denen zu jeder Zeit maximal einer per wglMakeCurrent aktuell ist? Die MSDN scheint sich darüber auszuschweigen oder ich habe die betreffende Stelle übersehen. OpenGL ist ja bekanntlich eine Statemachine. Werden die States nun für jeden RC separat geführt oder gibt es nur eine globale Statemachine für alle RCs?Hat jemand sonst schon Erfahrung mit mehreren Windows und separaten RCs gemacht?
gruß
Martin
-
Ok, es funktioniert mittlerweile, mit einzelnen RCs für jedes Fenster.
Einziges Problem nun noch:
Das jeweils zuletzt erstellte Fenster flackert ziemlich übel. Dieses Flackern hält an bis ein weiteres Fenster erstellt wird, welches dann das Flackern übernimmt.Ideen?
-
Rufst du wglMakeCurrent(HDC, HGLRC); auf bevor du renderst? Das könnte evtl. helfen denke ich...
rya.
-
Klar, der Aufruf ist drin.
-
Ok, es scheint so, dass die OpenGL-Implementierung unter Windoof nur wirklich globale States kennt. K.A. was der Standard dazu sagt...
Auf jeden Fall speicher ich mir jetzt sämtliche States in meiner Window-Klasse und setze den ganzen Kram wie Viewport, Hintergrundfarbe, Lighting, ... usw ... vor jedem Rendervorgang auf die Werte, die das betreffende Window gespeichert hat. Geht etwas an die Performance, aber läuft wunderbar.