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

时间:2015-04-26 15:38:04

标签: c++ opengl sdl

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

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

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);
}

1 个答案:

答案 0 :(得分:2)

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

结果是您未渲染的帧显示在显示屏上。假设系统使用普通双缓冲,并且您进行两次交换调用,第一次交换调用将使用您呈现的帧呈现缓冲区,但紧接着的第二次交换调用将用另一个缓冲区替换它,该缓冲区可能包含任何内容。

在渲染过程中如何处理缓冲区,桌面组合过程与系统有很大关系。因此,确切的症状与系统有关,或者甚至可能随着时间的推移而变化也就不足为奇了。有效帧和无效帧之间的闪烁当然是其中一种可能性。

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