2013-08-13 18 views
7

Funkcje OpenGL są zdefiniowane tak, jakby działały synchronicznie. Jednak funkcje renderowania (i inne) często są wykonywane asynchronicznie przez GPU. OpenGL skutecznie to ukryje: jeśli zrobisz coś, co wymaga rezultatów operacji (takich jak odczyt z bufora ramki, który został wyrenderowany), OpenGL zatrzyma procesor CPU, dopóki GPU nie osiągnie tego punktu.Czy istnieje sposób sprawdzenia, czy operacja OpenGL została zakończona?

Jest to funkcjonalne, ale prawie idealne rozwiązanie pod względem wydajności, ponieważ procesor zasadniczo blokuje się do momentu zakończenia pracy GPU. Czy istnieje sposób określenia, czy dana operacja została zakończona, aby wiedzieć, że zależna operacja zostanie wykonana bez tak dużego blokowania procesora?

Odpowiedz

6

Tak, jest. Zakładając, że masz dostęp do OpenGL 3.2+ lub rozszerzenia ARB_sync.

Jeśli chcesz wiedzieć, kiedy określone polecenie zostało zakończone, możesz wstawić "ogrodzenie" sync object do strumienia poleceń natychmiast po wydaniu tego polecenia. Odbywa się to za pomocą glFenceSync function.

Należy przechowywać wskaźnik zwrócony przez tę funkcję. Mając ten wskaźnik w ręku, możesz zapytać, czy ogrodzenie zostało ukończone, sprawdzając, czy ogrodzenie jest sygnalizowane przez glGetSync function. W ten sposób:

Jeśli zabraknie Ci innych rzeczy do zrobienia, nie musisz czekać na zakończenie synchronizacji; możesz po prostu zrobić dowolny proces OpenGL, który chciałeś zrobić. To wywoła dla ciebie blok CPU.

Gdy skończysz z obiektem synchronizacji, musisz go usunąć: . Aby to zrobić, użyj glDeleteSync function.

+0

Świetne pytanie.Ale jest w porządku zarówno pytać, jak i odpowiadać w tym samym czasie? ;) Czy taka kontrola synchronizacji nie może dodać więcej niepotrzebnych kosztów do potoku? –

+1

@MichaelIV: "* Ale czy w porządku jest jednocześnie proszenie i odpowiadanie? *" Tak. To dlatego, kiedy zadajesz pytanie, na dole znajduje się pudełko, które pozwala ci odpowiedzieć na to pytanie, zanim się o to zapyta. Jeśli chodzi o dodawanie "niepotrzebnych kosztów ogólnych", oczekuje się, że ogrodzenia będą dość lekkie. Wewnętrzne procesy sterowników używają zawsze ogrodzeń, dzięki czemu * oni * mogą stwierdzić, kiedy skończy się obiekt bufora i tak dalej. –

Powiązane problemy