2017-09-07 15 views
2

私はこのコードでSDLを初期化します。私は、非SDLソフトウェアレンダラでレンダリングすると、このコードでウィンドウにそれを提示SDL_RenderPresent()はvsyncを待っていません - どのように待つのですか?

SDL_Init(SDL_INIT_VIDEO); 

SDL_Window* win = SDL_CreateWindow(
    "SDL Window", 
    SDL_WINDOWPOS_UNDEFINED, 
    SDL_WINDOWPOS_UNDEFINED, 
    WIDTH, 
    HEIGHT, 
    SDL_WINDOW_SHOWN 
); 

SDL_Renderer* ren = SDL_CreateRenderer(win, -1, SDL_RENDERER_SOFTWARE); 
SDL_GL_SetSwapInterval(1); // probably has no effect since it's not using GL 

SDL_UpdateTexture(screenBuffer, NULL, screenData, WIDTH*4); 

SDL_RenderClear(ren); 
SDL_RenderCopy(ren, screenBuffer, NULL, NULL); 
SDL_RenderPresent(ren); 

フレームレートが完全に非キャップで、なぜ私は分かりません。

をSDL_CreateRendererフラグに追加すると、単にウィンドウが空白の画面になります。 SDL_RENDERER_SOFTWAREフラグを使用する必要がありますが(私はSDLのソフトウェアレンダラーを使用してスクリーンを提示する以外には使用しませんが)、そうでなければSDL_RenderPresent()は非常に長い時間ストールし、1秒あたり約1フレームになります。

SDL_RenderPresent()はvsyncを待つか、それとも(正確に)自分自身を待つことができますか?

+1

SDLのUpdateWindowSurfaceはvsyncをサポートしていないようです(一部のプラットフォームでは非常に難しく、他のプラットフォームでは実際には使用できません)ので、SDLソフトウェアレンダラーにもその機能がありません。 Vsyncは3次元APIでかなり頑丈なので、減速の問題を解決する方がはるかに簡単かもしれません。 – keltar

+0

GPU APIに依存することで、バイナリスペースを無駄にしたり、互換性を低下させたくないと思います。 – Accumulator

+0

@genpfaultはい、ご迷惑をおかけしていただきありがとうございます。私はコメントを再投稿します。 – HolyBlackCat

答えて

0

VSyncはハードウェア機能です。 VSyncが有効になっていると、ビデオカードは、垂直シンクロニズムを示すモニターからの信号が到着するまで(つまり、最後のフレームの表示が終了したことを意味する)、レンダラーがフレームを表示するのを停止します。

ソフトウェアレンダラを使用している場合、レンダリングにビデオカードを使用していないため、この信号を検出する方法はありません。フレームレートを設定して次のフレームを待つのはあなた次第です。

毎秒60のフレームの例:少なくとも 15秒が経過した場合

#define TICKS_FOR_NEXT_FRAME (1000/60) 

int lastTime = 0; 

void update() { 
    while (lastTime - SDL_GetTicks() < TICKS_FOR_NEXT_FRAME) { 
     SDL_Delay(1); 
    } 

    ... // SDL_RenderCopy... 

    SDL_RenderPresent(renderer); 
    lastTime = SDL_GetTicks(); 
} 

updateの呼び出しがフレームのみを提示します。 15 msは、60 FPSのフレームレートに必要な時間です。

私はこの質問が古いことを知っていますが、私はそれを必要とする可能性のある他の人に答えを投稿することに決めました。

EDIT

コメントで述べたように、あなたがVBLANK信号に同期されていないので、これは裂けを防ぐことはできません。このコードは、フレームレートのキャッピングにのみ役立ちます。私が知る限り、ソフトウェアレンダラーを使用しているときに裂けるのを防ぐ方法はありません(vblank信号を検出できないためです)。

+0

vsyncはフレームレートではありません。あなたのコードは引き裂きを防ぎません。 vblank信号へのフレームの制限と同期は、全く異なる2つのことです。 –

+0

本当です。引き裂きを防ぎません。フレームレートを60FPSに制限します。 –

関連する問題