Windows8(以降?)でSDL_delayの挙動が変わったのかしら?と言う話
今テストで作っているゲームがあって、それはWindows7(64bit)で開発してるんだけど、それをWindows8.1(32bit/With Bing)で実行するとどうも30フレで動いてるなーという挙動になった。
テストで作っているのは単純なシューティングで、自機が出て自機の弾が出る以外まだ何もない状態。敵すら出ていない。
んで、色々調べていたら表題の件に行き着いた、と言う次第。以下に記事がある。
Sleep(1) and SDL_Delay(1) takes 15 ms http://stackoverflow.com/questions/23258650/sleep1-and-sdl-delay1-takes-15-ms
んで、どう解決するかというと、SDL2から「SDL_GetPerformance〜()」という関数が追加されていて、それでまあ下記のような感じで組んで解決した。
static Sint64 interval; static Sint64 nowTick; interval = (Sint64)SDL_GetPerformanceFrequency() / 60; ... game_exec(); game_draw(); while(SDL_TRUE){ if(((Sint64)SDL_GetPerformanceCounter() - nowTick) >= interval){ break; } SDL_Delay(0); } nowTick = SDL_GetPerformanceCounter(); screen_clear();
とりあえず問題なさそう。Windows10でも問題なく動いてる。