SDL + OpenGL oraz SDL_GL_SwapBuffers()

Ostatnio, pisząc AGE, natknąłem się na pewien mały problem wydajnościowy związany z funkcją SDL_GL_SwapBuffers(). Okazało się bowiem, że gdy rysowałem w okienku wszystko było w miarę, ale po przełączeniu do pełnego ekranu kolory były jakieś nienormalne i wydajność spadła do ~70FPS. Przy pustym ekranie…

Po szybkim zastosowaniu metody włączeń i wyłączeń (lub jeśli ktoś woli: zkomenć, odkomenć 😉 ) odnalazłem winowajcę – nieszczęsną funkcję podmieniającą bufory. Rozpocząłem więc poszukiwania w internecie i oczywiście wiele było takich problemów, ale wszyscy genialnie radzili wyłączyć synchronizację…
Rozpocząłem się testować z różnymi wartościami przy opcjach ustawień obrazu i po jakiejś chwili odkryłem, ze wina była oczywiście moja. Problematyczne okazały się dwie instrukcje:

SDL_GL_SetAttribute(SDL_GL_BUFFER_SIZE, 24);
SDL_SetVideoMode(width, height, 16,
 SDL_OPENGL | SDL_GL_ACCELERATED_VISUAL |
 (full?SDL_FULLSCREEN:0);

Cudownym lekiem okazała się być zmiana z głębi 16 na 24 bity w SDL_SetVideoMode(). FPS od razu wskoczyło na kilka tysięcy, a po narysowaniu kilku obrazków spadło do ~660. Jest więc tak jak być powinno.

Mała rzecz, a tyle może przysporzyć kłopotów…

Reklamy

Skomentuj

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Wyloguj / Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Wyloguj / Zmień )

Zdjęcie na Facebooku

Komentujesz korzystając z konta Facebook. Wyloguj / Zmień )

Zdjęcie na Google+

Komentujesz korzystając z konta Google+. Wyloguj / Zmień )

Connecting to %s