0

我正在尝试通过以下方式更改我的应用程序窗口的大小:

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

虽然我正在使用 vsync 交换缓冲区(在驱动程序 xorg-video-ati 中),但当窗口大小发生变化时,我可以看到闪烁(我猜是一个或多个黑框):

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

所以请有人知道,如果...
SDL_SetVideoMode 没有像 SDL_GL_SwapBuffers() 那样垂直同步?
还是它破坏了窗口并创建了另一个窗口,同时缓冲区是黑色的?
有人知道这样做的工作代码吗?也许在freeglut?

4

1 回答 1

3

在 SDL-1 中,当您使用窗口视频模式时,窗口会被完全拆除,并在更改视频模式时创建一个新窗口。当然,中间有一些未定义的数据,被认为是闪烁。此问题已在 SDL-2 中解决。要么使用它,要么使用不同的 OpenGL 框架,它可以调整窗口大小而无需完全重新创建窗口。


如果您使用的是全屏视频模式,那么还会发生一些不同的事情:

视频模式的改变实际上改变了从显卡到显示器的视频信号时序。进行此类更改后,显示器必须找到与新设置的同步,这需要一些时间。这当然会伴随一些闪烁,因为显示器可能会尝试使用旧设置显示不同时序的帧,直到它检测到那些不再匹配。这是一种物理效应,除了完全不改变视频模式外,您无法在软件中解决此问题。

于 2013-10-03T22:53:25.627 回答