2013-03-02 15 views
5

Kiedy wywołujesz funkcje OpenGL, takie jak glDraw lub gLBufferData, powoduje to zatrzymanie wątku programu i oczekiwanie na zakończenie połączenia przez GL?Czy funkcje OpenGL powodują zablokowanie głównego wątku?

Jeśli nie, to w jaki sposób GL radzi sobie z wywoływaniem ważnych funkcji, takich jak glDraw, a następnie natychmiast po zmianie ustawienia, które ma wpływ na wywołania ciągnienia?

+0

Tak, generalnie będą one blokować funkcje, nie jestem pewien, jak nie zrobiłem tego wcześniej, ale zakładam, że byłby uruchamiany w pętli i aktualizowany tylko wtedy, gdy jest to potrzebne, aby utrzymać szybkość odtwarzania. – PsyKzz

+0

@MattPsyK: Funkcje OpenGL, które nie wprowadzają punktu synchronizacji, nie są blokowane. – datenwolf

+0

Moje złe, założenia zostały dokonane. – PsyKzz

Odpowiedz

6

Nie, oni (głównie) nie. Większość funkcji GL jest buforowana, gdy są używane i faktycznie wykonywane później. Oznacza to, że nie można myśleć o procesorze i GPU jako dwóch procesorach pracujących razem w tym samym czasie. Zwykle CPU wykonuje garść funkcji GL, które są buforowane i, gdy tylko zostaną dostarczone do GPU, to one je wykonują. Oznacza to, że nie można wiarygodnie kontrolować, ile czasu zajęło wykonanie określonej funkcji GL przez porównanie czasu przed i po jego wykonaniu.

Jeśli chcesz to zrobić, musisz najpierw uruchomić glFinish(), tak aby faktycznie czekał on na wszystkie wcześniej buforowane wywołania GL, a następnie możesz zacząć liczyć, wykonać połączenia, które chcesz porównać, Ponownie wywołaj glFinish, aby upewnić się, że te wywołania również zostały wykonane, a następnie zakończ test porównawczy.

Z drugiej strony, powiedziałem "głównie". Dzieje się tak dlatego, że funkcje odczytu będą rzeczywiście POTRZEBNE, aby zsynchronizować się z procesorem GPU, aby pokazać rzeczywiste wyniki, a więc w tym przypadku Zaczekaj i zatrzymaj główny wątek.

edytuj: Wydaje mi się, że samo wyjaśnienie odpowiada na pytanie zadane przez Ciebie jako drugie, ale na wszelki wypadek: fakt, że wszystkie połączenia są buforowane, umożliwia wykonanie losowania jako pierwszego, a następnie zmianę ustawienia później dla kolejnych połączeń

+0

więc czy funkcje odczytu niejawnie nazywają glFinish()? –

+0

@DanWebster: [\ * kaszel \ *] (http://www.opengl.org/wiki/Synchronizacja) –

1

To ściśle zależy od wywołania OpenGL i stanu OpenGL. Podczas wywoływania OpenGL, implementacja najpierw umieszcza je w kolejce wewnętrznie, a następnie wykonuje je asynchronicznie do wykonania wywołującego programu. Jedną z ważnych koncepcji OpenGL są punkty synchronizacji. Są to operacje w kolejce roboczej, które wymagają blokowania OpenGL do momentu spełnienia określonych warunków.

Obiekty OpenGL (tekstury, obiekty buforów itp.) Są czysto abstrakcyjne i według specyfikacji uchwyt obiektu w programie klienta zawsze do danych, obiekt ma czas wywołania funkcji OpenGL, które odnoszą się do tego obiektu. Więc weź na przykład tę sekwencję:

glBindTexture(GL_TEXTURE_2D, texID); 

glTexImage2D(..., image_1); 
draw_textured_quad(); 

glTexImage2D(..., image_2); 
draw_textured_quad(); 

Pierwszy draw_textured_quad może powrócić nawet długo zanim cokolwiek zostało sporządzone. Jednak wywołanie OpenGL tworzy wewnętrzne odniesienie do danych przechowywanych obecnie przez teksturę. Kiedy więc glTexImage2D zostanie wywołany po raz drugi, co może się zdarzyć przed narysowaniem pierwszego quada, OpenGL musi wewnętrznie utworzyć dodatkowy obiekt tekstury, który ma stać się teksturą texID i być używany przez drugie wywołania draw_textured_quad. Jeśli zostałby wywołany glTexSubImage2D, musiałby nawet zmodyfikować jego kopię.

Połączenia OpenGL będą blokować tylko wtedy, gdy wynik połączenia modyfikuje pamięć po stronie klienta i zależy od danych wygenerowanych przez poprzednie wywołania OpenGL. Innymi słowy, podczas wykonywania wywołań OpenGL, implementacja OpenGL wewnętrznie generuje drzewo zależności, aby śledzić, co zależy od czego. A gdy punkt synchronizacji musi go blokować, to przynajmniej zablokuje się, aż wszystkie zależności zostaną spełnione.

Powiązane problemy