【问题标题】:Window blinking with OpenGL rendering on NVIDIA graphics card在 NVIDIA 显卡上使用 OpenGL 渲染的窗口闪烁
【发布时间】:2015-04-26 15:38:03
【问题描述】:

在我的项目中,我使用 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()的地方吗?这只是一个疯狂的猜测,但如果您每帧交换多次,您可能会得到这些类型的症状。
  • @RetoKoradi 哦,我怎么没注意到这一点。是的,我调用了 SDL_GL_SwapWindow() 2 次。所以现在程序运行良好。

标签: c++ opengl sdl


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-11
    • 1970-01-01
    • 2011-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多