Opengl 是否可以使用vsync SDL_设置视频模式?

Opengl 是否可以使用vsync SDL_设置视频模式?,opengl,sdl,flicker,double-buffering,vsync,Opengl,Sdl,Flicker,Double Buffering,Vsync,我正在尝试通过以下方式更改我的应用程序窗口的大小: mysurface = SDL_SetVideoMode(width, height, 32, SDL_OPENGL); 虽然我使用的是vsync swapbuffers(在驱动程序xorg video ati中),但当窗口大小改变时,我可以看到闪烁(我猜是一个或多个黑色帧): 所以请有人知道,如果… SDL_设置视频模式与SDL_GL_SwapBuffers()不同步? 或者它正在破坏窗口并创建另一个窗口,同时缓冲区是黑色的? 有人

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

    mysurface = SDL_SetVideoMode(width, height, 32, SDL_OPENGL);
虽然我使用的是vsync swapbuffers(在驱动程序xorg video ati中),但当窗口大小改变时,我可以看到闪烁(我猜是一个或多个黑色帧):

所以请有人知道,如果…
SDL_设置视频模式与SDL_GL_SwapBuffers()不同步?
或者它正在破坏窗口并创建另一个窗口,同时缓冲区是黑色的?

有人知道这样做的工作代码吗?可能在freeglut中?

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


如果您使用的是全屏视频模式,则会发生一些不同的情况:


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

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


如果您使用的是全屏视频模式,则会发生一些不同的情况:


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

我尝试了SDL2,但闪烁仍然存在。。。但我现在认为闪烁是Xorg功能或radeon功能。。。我寻找glxgears源代码,当发生调整大小时,会立即重新绘制。。。所以fps保持同步,但是闪烁发生了,我不明白的是…:(可能这会导致很多程序出现闪烁,包括我的:background pixmap->“服务器会自动使用窗口的背景平铺区域,除非窗口的背景为None。”我从glxgears中删除了背景像素,并将背景像素映射更改为“无”。现在glxgears没有闪烁。但我的SDL窗口仍然有闪烁。我会问另一个问题是否可以禁用此功能。非常感谢!我尝试了SDL2,但闪烁仍然存在…但我现在认为闪烁是Xorg功能或radeon功能…我寻找了glxgears源代码,当发生调整大小时,会立即进行重新绘制…因此fps保持vsync'ed,但会发生闪烁,我无法理解…:(可能这导致很多程序中出现闪烁,包括我的:background pixmap->“除非窗口的背景为无,否则服务器会自动使用窗口的背景平铺区域。”我将背景像素从glxgears中删除,并将背景像素映射更改为无。现在glxgears没有闪烁。但我的SDL窗口仍然有。如果我可以禁用此功能,我将问另一个问题。非常感谢!
    void Video::draw()
{
    if (videoChanged){
        mysurface = SDL_SetVideoMode(width, height, 32, SDL_OPENGL);
        scene->init(); //Update glFrustum & glViewPort
    }
    scene->draw();
    SDL_GL_SwapBuffers();
}