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