Window 在 NVIDIA 显卡上使用 OpenGL 渲染闪烁

Window blinking with OpenGL rendering on NVIDIA graphics card

在我的项目中,我使用 SDL2 + OpenGL。有简单的代码。当我想清除缓冲区并开始在其中绘制时,函数 VPreRender() 被调用。之后,当我想在屏幕上显示这个缓冲区时,我使用函数 VPostRender().

使用集成显卡(HD Intel)启动程序时,window出现时不会闪烁。但是当我使用高性能 NVIDIA 视频卡启动程序时,它开始闪烁几秒钟然后停止。然后一切看起来都很好。如果我想调整 window 的大小,也会出现同样的情况。那我做错了什么?为什么 window 在闪烁?

bool SDLRender::VPreRender()
{
    glClearColor(m_backgroundColor.r, m_backgroundColor.g, m_backgroundColor.b, m_backgroundColor.a);
    glClear ( GL_COLOR_BUFFER_BIT );
}

bool SDLRender::VPostRender()
{
    SDL_GL_SwapWindow(m_pWindow);
}

您所描述的行为是每帧多次调用 window 系统交换函数的典型症状。

结果是您没有渲染的帧显示在显示器上。假设系统使用普通双缓冲,并且您进行了两次交换调用,那么第一次交换调用会向缓冲区显示您渲染的帧,但紧随其后的第二次交换调用会将其替换为另一个缓冲区,该缓冲区可能包含任何内容。

渲染期间如何处理缓冲区以及桌面合成过程非常依赖于系统。因此,确切的症状取决于系统,甚至可能随着时间而改变,这并不奇怪。在有效帧和无效帧之间闪烁肯定是一种可能。

为避免这种情况,您需要确保在完成所有渲染后每帧调用一次 SDL_GL_SwapWindow()