今日の雑記

生きることでいっぱいいっぱい

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でも問題なく動いてる。