Mam dwa wątki: jeden główny wątek (OpenGL) do renderowania 3D i jeden wątek do logiki. Jak powinienem podłączyć wątki, jeśli chcę utworzyć siatkę pudełkową w wątku renderowania, jeśli zamówienie pochodzi z wątku logiki?

W tym przypadku wątek logiczny użyłby poleceń OpenGL, który nie jest możliwy, ponieważ każde polecenie OpenGL powinno być wypadane tylko w głównym wątku. Wiem, że nie mogę dzielić kontekstu OpenGL na różnych wątkach (co wydaje się być złym pomysłem), więc jak powinienem rozwiązać ten problem? Czy istnieje jakiś wzór projektu ogólnego przeznaczenia lub coś innego? Dzięki.

0
Lemonbonbon 24 luty 2019, 18:47

2 odpowiedzi

Najlepsza odpowiedź

Możesz zaimplementować kolejkę poleceń rysowania. Każda polecenie Draw zawiera wszystko, co jest potrzebne, aby wymagać wymaganych połączeń OpenGL. Każda klatka gwintu renderowania (atomowo) opróżnia kolejkę i przetwarza polecenia. Każdy inny wątek przygotowuje własne polecenia i (atomowo) w dowolnym momencie.

Polecenia Rysowe mogą być wdrażane jako hierarchia klasy z wirtualną metodą {X0}}. Oczywiście nie jest to niewielka zmiana, a ceny za wdrażanie tego systemu nie jest tak mały.

2
Quimby 24 luty 2019, 15:55

Istnieją różne sposoby podejścia do tego. Jednym z nich jest wdrożenie kolejki poleceń z wątkiem logiki, który jest producentem poleceń i wątku renderowania konsumentem.

Innym podejściem jest wykorzystanie pomocniczego kontekstu OpenGL, który jest konfiguracyjny, aby udostępnić podstawowe dane kontekstowe OpenGL. Możesz mieć oba konteksty prądu w tym samym czasie w różnych wątkach. A dla rdzenia OpenGL-3.X możesz wykonać aktualny kontekst bez szafy. Następnie możesz użyć kontekstu pomocniczego, aby załadować nowe dane, mapy i tak dalej.

2
datenwolf 24 luty 2019, 18:18