代码之家  ›  专栏  ›  技术社区  ›  Weber K.

是否可以对SDL_SetVideoMode进行vsync?

  •  0
  • Weber K.  · 技术社区  · 11 年前

    我正在尝试使用以下内容更改应用程序的窗口大小:

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

    尽管我使用的是vsync swapbuffer(在驱动程序xorg视频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()那样同步?
    还是它破坏了窗口并创建了另一个窗口,同时缓冲区是黑色的?
    有人知道这样做的工作代码吗?也许是免费的?

    1 回复  |  直到 11 年前
        1
  •  3
  •   datenwolf    11 年前

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


    如果您正在使用 全屏显示 视频模式下,还会发生一些不同的事情:

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