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…

Przyczyny problemów z STL

Na kanale #warsztat krajek męczył mnie abym spróbował jeszcze raz z tym STL-em i dał kilka rad. Jedną z rad było używanie Interfejsów i wyeksportowanie z DLL-a tylko jednej funkcji tworzącej interfejs główny. Zrobiłem tak.

Ale to nie to 😉

Pobadałem trochę przyczyny takiego stanu rzeczy i okazało się, że błędy wyskakują kiedy jakaś funkcja jako parametr pobiera np.: std::string. Po zamianie typu parametru na char* i późniejszym (w środku funkcji) stworzeniu std::string wszelkie problemy znikły.

std::map też nie ma problemów z działaniem. Teraz pozostało mi już tylko dokończyć tworzenie interfejsów – trochę roboty przy tym będzie, ale przynajmniej nikt mi później nie powie, że jest nie-obiektowo 😉

No to tyle. STL wróciło do AGE więc mogę już spać spokojnie 🙂