【问题标题】:Is it possible to vsync SDL_SetVideoMode?是否可以 vsync SDL_SetVideoMode?
【发布时间】:2013-10-10 19:22:08
【问题描述】:

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

    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 中?

【问题讨论】:

    标签: opengl sdl flicker double-buffering vsync


    【解决方案1】:

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


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

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

    【讨论】:

    • 我尝试了 SDL2 并且闪烁仍然存在...但我现在认为闪烁是 Xorg 功能或 radeon 功能...我查找了 glxgears 源代码,当发生调整大小时,重绘是立即制作......所以fps保持vsync'ed但闪烁发生,我无法理解...... :(
    • 也许这会导致很多程序闪烁,包括我的:background-pixmap ->“除非窗口的背景为无,否则服务器会自动将区域与窗口的背景平铺。”跨度>
    • 我从 glxgears 中删除了背景像素,并将背景像素图更改为无。现在 glxgears 没有闪烁。但我的 SDL 窗口仍然存在。如果我可以禁用它,我会问另一个问题。非常感谢!
    猜你喜欢
    • 2016-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多