0

アプリのウィンドウのサイズを次のように変更しようとしています:

    mysurface = SDL_SetVideoMode(width, height, 32, SDL_OPENGL);

vsync swapbuffers (ドライバー xorg-video-ati 内) を使用していますが、ウィンドウ サイズが変更されるとちらつきが見られます (1 つ以上の黒いフレームだと思います)。

    void Video::draw()
{
    if (videoChanged){
        mysurface = SDL_SetVideoMode(width, height, 32, SDL_OPENGL);
        scene->init(); //Update glFrustum & glViewPort
    }
    scene->draw();
    SDL_GL_SwapBuffers();
}

SDL_GL_SwapBuffers() のように、
SDL_SetVideoMode は vsync されていませんか?
または、ウィンドウを破棄して別のウィンドウを作成し、その間バッファは黒ですか?
誰かがこれを行うための作業コードを知っていますか? 多分フリーグルで?

4

1 に答える 1

3

SDL-1 では、ウィンドウ化されたビデオ モードを使用している場合、ウィンドウは完全に破棄され、ビデオ モードを変更すると新しいウィンドウが作成されます。もちろん、その間には未定義のデータがいくつかあり、ちらつきとして認識されます。この問題は SDL-2 で対処されています。それを使用するか、別の OpenGL フレームワークを使用して、ウィンドウ全体を再作成せずにウィンドウのサイズを変更します。


FULLSCREENビデオ モードを使用している場合は、さらに別のことが起こります。

ビデオ モードを変更すると、グラフィックス カードからディスプレイに送られるビデオ信号のタイミングが実際に変更されます。このような変更の後、ディスプレイは新しい設定との同期を見つける必要があり、それには時間がかかります。もちろん、これにはちらつきが伴います。これは、ディスプレイが古い設定で異なるタイミングのフレームを表示しようとする可能性があるため、それらが一致しなくなったことを検出するまでです。これは物理的な影響であり、ビデオ モードをまったく変更しない以外に、ソフトウェアでこれを修正する方法はありません。

于 2013-10-03T22:53:25.627 に答える