在我的项目中,我使用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);
}

最佳答案

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

结果是您尚未渲染的帧显示在显示屏上。假设系统使用普通的双重缓冲,并且您进行了两次交换调用,则第一个交换调用将向您呈现所渲染帧的缓冲区,但是紧随其后的第二个交换调用会将其替换为可以包含任何内容的另一个缓冲区。

在渲染和桌面合成过程中如何处理缓冲区非常依赖于系统。因此,确切的症状取决于系统,甚至可能随时间变化也就不足为奇了。有效帧和无效帧之间的闪烁当然是可能性之一。

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

关于c++ - NVIDIA显卡上的OpenGL渲染窗口闪烁,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29879689/

10-13 06:30