2013-07-31 11 views
18

To jest mój obecny setup: Robię renderowanie OpenGL przy użyciu SDL (obecnie na Linuksie). Zainicjowuję SDL (SDL_Init) i utworzę okno aplikacji (SDL_CreateWindow) w głównym wątku i przekazuję go do drugiego wątku. Ten drugi wątek tworzy z niego kontekst OpenGL (SDL_GL_CreateContext) i uruchamia pętlę renderowania, podczas gdy główny wątek nasłuchuje zdarzeń. Myślę, że ważne jest, aby zauważyć, że połączenia GL są całkowicie ograniczone do tego drugiego wątku; w rzeczywistości dzieje się tam większość logiki aplikacji, główny wątek jest odpowiedzialny tylko za obsługę zdarzeń, które wchodzą w skład SDL.SDL 2.0: Utwórz okno w głównym wątku, ale wykonaj wszystkie renderowanie w osobnym

Początkowo zrobiłem to na odwrót, ale okazało się, że nie można przetwarzać zdarzeń w nic poza głównym wątkiem na OSX i prawdopodobnie także w Windowsie, więc zmieniłem go tak, aby był kompatybilny z tymi dwoma w przyszłości .

Czy powinienem mieć jakiekolwiek obawy, że to nie zadziała na OSX/Windows? W Linuksie nie miałem żadnego. Jest wiele informacji w Internecie na temat udostępniania kontekstu i wykonywania wywołań GL z wielu wątków, ale wszystko, co chcę zrobić, to zrobić OpenGL w jednym wątku, który nie jest główny. Nie chciałbym dalej kodować mojej aplikacji, aby później przekonać się, że nie zadziała ona nigdzie indziej.

+0

Brzmi OK. Tutaj jest jeszcze jeden wątek ... [link] (http://stackoverflow.com/questions/6172020/opengl-rendering-in-a-secondary-thread?rq=1) – user1961169

+0

@ user1961169 Dzięki, już przeczytałem wątek, który łączyłeś. Ta osoba miała problemy z Linuksem/X11, która dla mnie działa idealnie, to tylko OSX/Win32, którego nie miałem pewności. Jednak w tym wątku pojawiły się komentarze, które sugerowały, że powinno być dobrze na tych platformach, więc dzięki za przypomnienie mi! – Ancurio

+0

Jedyne, co musisz zapewnić, to że wywołania systemowe OS są w głównym wątku aplikacji. Jeśli nie, to powoduje to często dziwne zachowanie (na wygranej i linuksie), takie jak unieważnienie uchwytów, sporadyczne wyjątki, artefakty graficzne, błędy interfejsu GUI, itp. – Spektre

Odpowiedz

2

Mam aplikację, która działa na Mac/iOS/Windows, który jest zorganizowany w ten sposób (wszystkie GL w wątku renderowania), ale nie używam SDL.

Właśnie rzuciłem okiem na SDL-a Cocoa_GL_CreateContext (wywołany przez SDL_GL_CreateContext na OS X) i wywołuje on wywołania z mojego głównego wątku, aby ustawić kontekst.

Jeśli napotkasz jakiekolwiek problemy, spróbuj utworzyć kontekst GL w głównym wątku, a następnie przenieś go do wątku renderującego (zamiast tworzyć kontekst GL w wątku renderowania).

2

OpenGL i wielowątkowość to w zasadzie wrogowie: tylko jeden wątek może "posiadać kontekst renderowania" w danym momencie - tak, możesz zmienić kontekst renderowania GL po każdym przełączeniu wątków, ale pomyśl o koszcie, a także rozważ to, od jednego sterownika OEM do drugiego, nie jest dobrze obsługiwany i prawdopodobnie działa dla niektórych osób, a nie dla innych. Jedyna logiczna (i rozsądna) alternatywa, to utrzymywanie wszystkich wywołań OpenGL w jednym wątku (uwaga: są wyjątki, są rzeczy, które każdy wątek może wywoływać w gl, odnoszące się do danych strumieniowych, bez konieczności posiadania własnego kontekstu renderowania). Niestety, nie możemy po prostu przekazać kontekstu GL wokół wątków zgodnie z sugestią, musimy wywołać (w) glMakeCurrent, który mówi GL "ten wątek wywołujący teraz jest właścicielem", ale nie informuje innych wątków, że ...

Powiązane problemy