フルスクリーンから復帰時の画面の乱れについて
なんか、ゲームをまったり、バージョンアップしてみています。
どうも、SDLフルスクリーンから復帰したときに画面が乱れるのはSDLかOSかドライバかハードの問題のように思えてきました。
というのは、640x480以下の解像度から戻ったときだけ乱れてるからです。
Cで書かれたプログラムでも、乱れてる。。。
原因を調べたら、ChangeDisplaySettingsというWinAPIを使って画面モードを変えてそのあとopenglのSDL_GL_SwapBuffers()を呼び出し、ChangeDisplaySettings(0,null)で復帰すると、乱れてしまうということみたいです。
SDLを使わずにopenglを呼び出してみればいいんだろうけど、そこまではやってみてません。
まぁとにかく、これ書いとけば自分所では、フルスクリーンから戻るときに画面が乱れなくて、見た目上それほど悪くなく戻ってきてくれます。
version(Windows1) { import std.c.windows.windows; struct DEVMODEA { BYTE dmDeviceName[36]; WORD dmSize; BYTE dummy[118]; } enum :uint { ENUM_CURRENT_SETTINGS = -1, CDS_RESET = 0x40000000, } extern(Windows) export BOOL EnumDisplaySettingsA( char* lpszDeviceName, uint iModeNum, DEVMODEA* lpDevMode); extern(Windows) export int ChangeDisplaySettingsA( DEVMODEA* lpDevMode, uint dwFlags); void closeSDL() { for (int i = 0; i < 2; i++) { glClearColor(0f, 0f, 0f, 0f); glClear(GL_COLOR_BUFFER_BIT| GL_DEPTH_BUFFER_BIT); SDL_GL_SwapBuffers(); } DEVMODEA dm; dm.dmSize = DEVMODEA.sizeof; EnumDisplaySettingsA(null, ENUM_CURRENT_SETTINGS, &dm); ChangeDisplaySettingsA(&dm, CDS_RESET); SDL_Quit(); } } else { void closeSDL() { SDL_Quit(); } }