Używam FBO + RBO, i zamiast regularnego podwójnego buforowania na domyślnym buforze ramki, rysuję do RBO, a następnie blit bezpośrednio na buforze GL_FRONT domyślnego FBO (0) w pojedynczym zbuforowanym kontekście OpenGL.podwójne buforowanie z FBO + RBO i glFinish()
Jest w porządku i nie dostaję żadnego migotania, ale jeśli scena robi się nieco skomplikowana, doświadczam OGROMNEGO spadku fps, czegoś tak dziwnego, że wiedziałem, że coś musi być nie tak. I nie mam na myśli od 1/60 do 1/30 z powodu pominiętej synchronizacji, mam na myśli nagły spadek o 90%.
Próbowałem glFlush() po blit - bez różnicy, a następnie próbowałem glFinish() po blit, i miałem 10x fps doładowania.
Więc użyłem zwykłego buforowania doble na domyślnym buforze ramki i swapbufferach(), a fps również dostał boost, jak przy użyciu glFinish().
nie mogę dowiedzieć się, co się dzieje. Dlaczego glFinish() robi tak wielką różnicę, kiedy nie powinno? i czy można używać RBO i blit bezpośrednio na buforze frontowym, zamiast używać wywołania swapbuffers w kontekście podwójnego buforowania? Wiem, że Im brakuje vsync, ale menedżer kompozytowy i tak będzie synchronizować (w rzeczywistości nie widzę żadnego łzawienia), to tak, jakby monitor brakuje 9 na 10 klatek.
A tak z ciekawości, czy native swapbuffers() użyć glFinish() na Windows lub Linux?
* "wtedy spróbowałem glFinish() po blicie, a miałem 10x fps boost" * - Raczej brzmi jak problem z twoją metodą pomiaru czasu, coś jak to nie jest zsynchronizowane dobrze z twoim GPU (który ' oczywiście glFinish). Jeszcze jeden kod byłby interesujący. –
Nie widzę sposobu, w jaki reimplementacja podwójnego buforowania byłaby lepsza, biorąc pod uwagę wszystkie elementy w sterownikach takich jak potrójne buforowanie, adaptacyjny VSync i tak dalej. –
@BartekBanachewicz Ma to sens, jeśli potrzebujesz bufora zarówno do renderowania na ekranie, jak i poza ekranem, ale naprawdę będziesz miał sporo pracy, aby (ponownie) zoptymalizować część ekranową. – KillianDS