2010-02-04 14 views
15

Zastanawiam się od dawna, jaki byłby najlepszy sposób obsługi obiektów OpenGL FrameBuffer Objects (FBO). Przełączanie FBO może być kosztowne, ale także definiowanie nowych załączników.Jaki jest najlepszy sposób na obsługę wiadomości FBO w OpenGL?

Jak to zrobić szybko?

Waham się między tymi 3:

  • 1 FBO za wszystko, przywiązanie zmienić, ale nie przełączać się między FBOs

  • 1 FBO dla każdego rozmiaru renderowanie docelowych (+) w formacie renderowania ścieżka. Oznacza to, że ponownie wykorzystam ten sam serwer reklamowy dla podobnych celów renderowania. Ale w ten sposób niestandardowe rozmycie kosztowałoby 4+ FBO.

  • 1 FBO dla każdego uczynić docelowe, ustawianie narzędzia tylko raz, a następnie przełączać się między FBOs

Ponadto, należy zminimalizować liczbę przełączników FBO (jak zminimalizować liczbę wiązań tekstury)?

+0

najpierw ... co to jest FBO? Jeśli chcesz używać akronimu kilka razy, zalecamy jego nieużywanie za pierwszym razem. – fortran

+4

FBO = Framebuffer Object – ponce

+0

Ładne pytanie. Pierwsza część odpowiedzi podana poniżej jest sprzeczna z tym, co jest powiedziane w książce "OpenGL Insights". Książka stwierdza, że ​​przełączanie między wieloma serwerami typu FBO jest kosztowne, a najlepszą rzeczą do zwiększenia wydajności jest wykorzystanie wiele załączników do tego samego podmiotu prowadzącego przedsiębiorstwo spożywcze. –

Odpowiedz

14

Zaktualizowane referencje:


NVIDIA 2005 (prawdopodobnie nieaktualne): Ostatnia oficjalna rekomendacja wydajność przez NVIDIA Wiem, że ma prawie pięć lat.W swoim GDC presentation Simon Zielona zaleca następującą (slajd 29):

w kolejności rosnącej wydajności:

  1. Wiele FBOs
    • utworzyć oddzielną FBO dla każdej fakturze chcesz renderowanie do
    • przełącznika przy użyciu BindFramebuffer()
    • może być 2x szybciej niż wglMakeCurrent() w sterownikach beta NVIDIA
  2. pojedyncze FBO, wiele załączników tekstury
    • tekstury powinny mieć taki sam format i wymiary
    • użytkowania FramebufferTexture() przełączania między teksturami
  3. Pojedyncze FBO, wielu załączników tekstura
    • dołącz tekstury do różnych kolorowych załączników
    • użycie glDrawBuffer() aby przełączyć na różne załączniki rendering kolorów

Z mojego doświadczenia wynika, drugi przypadek jest naprawdę szybciej niż pierwszy (ATI Radeon HD4850, GeForce 8800GT). Nie próbowałem trzeciego przypadku, ponieważ skomplikowałoby to mój kod.

+0

Prezentacja [Prezentacja GDC] (https://developer.nvidia.com/sites/default/files/akamai/gamedev/docs/Porting%20Source%20to%20Linux.pdf) wspomina o tym, aby nie przełączać załączników, ponieważ najwyraźniej prowadzi do zły występ. Jest to sprzeczne z tym porządkiem wydajności. – Deathicon

+0

Należy pamiętać, że prezentacja, o której wspomniałem, pochodzi z 2005 roku, a moje wyniki pochodzą z 2009 roku. Nie zdziwiłbym się, gdyby kolejność wyników zmieniła się w ciągu ostatniej dekady. –

+0

Dodałbym również ten link (https://software.intel.com/en-us/articles/opengl-performance-tips-swap-frame-buffer-objects-fbo-instead-of-surfaces-using- a-single), które wspominają o lepszej wydajności do przełączania FBO (nr 1) zamiast przełączania załączników (nr 2 i nr 3). Byłoby dobrze zaktualizować odpowiedź na to pytanie. – Deathicon

4

W ramach filozofii modyfikacja stanu obiektu wymaga jego ponownej weryfikacji. Zamiast tego, po prostu zmiana powiązania obiektu (która jest już ważna z poprzedniej ramki) powinna być szybsza dla kierowcy [1].

Więc jako pierwszego wdrożenia, pójdę za 1 FBO dla każdego celu nadania (lub dokładniej, renderowanie cel ustawić. Zazwyczaj czyni do wielu buforów na raz).

Mimo to nic nie przebije testu porównawczego Twojej aplikacji z wieloma implementacjami.

[1] Wspominam o kierowcy, ponieważ zmiana FBO może wymusić spłukiwanie GPU, w zależności od architektury. W większości przypadków wprowadzi bąbelki. Jest to zdecydowanie coś, czego nie chcesz robić często. Jest ważniejsze niż optymalizacja wiązań tekstur, np.

Powiązane problemy