2010-04-18 16 views
5

Pracuję nad aplikacją, która musi odczytać całą ramkę z przedniego bufora aplikacji OpenGL. Mogę przejąć bibliotekę opengl aplikacji i wstawić mój kod do swapbufferów. W tej chwili z powodzeniem używam prostego, ale rozdzierającego wolnego polecenia glReadPixels bez PBO.Asynchroniczne odczytywanie z bufora przedniego opengl przy użyciu wielu PBO

Teraz czytam o użyciu wielu PBO, aby przyspieszyć rzeczy. Chociaż wydaje mi się, że znalazłem wystarczającą ilość zasobów, aby faktycznie to zaprogramować (nie jest to takie trudne), mam kilka pytań operacyjnych. Chciałbym zrobić coś takiego:

  1. stworzyć serię (np 3) PbO za
  2. użytku glReadPixels w moim swapBuffers przesłonić do odczytu danych z bufora przedniej do PBO (powinny być szybko i bez blokowania, prawo ?)
  3. Utwórz osobny wątek, aby wywołać glMapBufferARB, raz na PBO po glReadPixels, ponieważ będzie to blokowane, dopóki piksele nie znajdą się w pamięci klienta.
  4. przetwarzać dane z kroku 3.

Teraz moim głównym problemem jest oczywiście w krokach 2 i 3. Czytałem o glReadPixels użytych PBO będącego nieblokującą będzie to problemem, jeśli wydam nowy opengl polecenia po tym bardzo szybko? Czy te polecenia opengl będą blokować? Czy też będą kontynuowali (moje przypuszczenie), a jeśli tak, to sądzę, że tylko swap-bufery mogą stanowić problem, czy to się zatrzyma, czy będzie glReadPixels z przedniego bufora był wielokrotnie szybszy niż zamiana (około 15-> 30 ms) lub, najgorszy przypadek scenariusz, czy zostaną wykonane swapbuffery, podczas gdy glReadPixels nadal będzie odczytywał dane do PBO? Moje obecne przypuszczenie jest takie, że ta logika zrobi coś takiego: skopiuj FRONT_BUFFER -> ogólne miejsce w VRAM, skopiuj VRAM-> RAM. Ale nie mam pojęcia, które z tych 2 jest prawdziwym wąskim gardłem, a co więcej, jaki wpływ ma normalny strumień poleceń opengl.

Następnie w kroku 3. Czy rozsądnie jest robić to asynchronicznie w wątku oddzielonym od normalnej logiki OpenGL? W tej chwili myślę, że nie, Wydaje się, że po wykonaniu tej czynności musisz przywrócić normalne działanie bufora i nie mogę zainstalować obiektów synchronizacji w oryginalnym kodzie, aby tymczasowo je zablokować. Myślę więc, że najlepiej jest zdefiniować pewne opóźnienie wymiany przed odczytaniem ich, np. wywoływanie glReadPixels na PBO i% 3 i glMapBufferARB na PBO (i + 2)% 3 w tym samym wątku, powodując opóźnienie o 2 klatki. Ponadto, gdy wezwę glMapBufferARB do wykorzystania danych w pamięci klienta, czy to będzie wąskie gardło, czy też glReadPixels (asynchronicznie) będzie wąskim gardłem?

I wreszcie, jeśli masz jakieś lepsze pomysły na przyspieszenie odczytu ramki z GPU w OpenGL, proszę powiedz mi, ponieważ jest to bolesne wąskie gardło w moim obecnym systemie.

Mam nadzieję, że moje pytanie jest wystarczająco jasne, wiem, że odpowiedź będzie prawdopodobnie również gdzieś w internecie, ale przede wszystkim wymyślił wyników, które wykorzystywane PBO, aby zachować bufor w pamięci wideo i zrobić tam przetwarzanie. Naprawdę muszę odczytać bufor przedni do pamięci RAM i nie znajduję w tym przypadku żadnych jasnych wyjaśnień dotyczących wydajności (czego potrzebuję, nie mogę polegać na "szybszym", muszę wyjaśnić, dlaczego jest to szybsze).

Dziękujemy

Odpowiedz

3

Czy na pewno chcesz odczytać z przedniego bufora? Nie jesteś właścicielem tego bufora iw zależności od systemu operacyjnego może on zostać zniszczony, np. Przez inne okno na nim.

Dla Państwa przypadku użycia, ludzie zwykle zrobić

  • losowanie N
  • rozpocząć PBO czytać N z tylnym buforze
  • losowanie N + 1
  • rozpocząć PBO czytać n + 1
  • synchronizację PBO przeczytano N
  • proces N
  • ...

z jednego wątku.

+0

Wiem, że chcę odczytać z przedniego bufora (lub z bufora tylnego tuż przed wywołaniem), to nie jest problem. Twoja odpowiedź pomaga mi w moim pytaniu o wątki, które tak naprawdę już podejrzewałem. Ale naprawdę chciałbym wiedzieć, co dzieje się za ekranami na GPU, kiedy to robisz, co jest blokowane, a co nie, czy rozsądnie jest próbować użyć więcej niż dwóch PBO, .... Dzięki za odpowiedź już i tak :)! – KillianDS

+0

Korzystanie z tylnego bufora jest lepszym rozwiązaniem. To, co dzieje się za kulisami, zależy od kierowcy. Zazwyczaj odczyt asynchroniczny jest wysyłany do GPo fifo, gdzie będzie przetwarzany, gdy jest on na swoją kolej przez GPU. Po zakończeniu GPU odeśle token informujący sterownik, że operacja się zakończyła - co odblokuje mapBuffers. Aby uzyskać coś bardziej szczegółowego, musisz porozmawiać z inżynierem nVidia/AMD. Może być użyteczne użycie więcej niż dwóch buforów, w zależności od tego, ile klatek chcesz mieć "w locie". Wystarczy zaimplementować konfigurowalny i przetestować go. – eile

Powiązane problemy