首页 > 解决方案 > GLFW 应用程序启动时出现随机空白窗口(glfwSwapBuffers 无效)

问题描述

注意:这不是通用的“为什么我的应用程序没有绘制任何东西?”

这与矩阵无关,或清除深度缓冲区,或设置剪刀区域,或顶点缓冲区,或纹理,或 glEnabling 任何东西 :) 我不需要绘制任何东西,甚至不需要清除屏幕来解决这个问题显现。

这是一个非常非常具体的情况,我可以将其缩小到以下顺序:

  1. glfwInit() 成功
  2. glfwCreateWindow() 也成功
  3. glfwSwapBuffers()有时在窗口的生命周期内什么都不做

迄今为止的背景和调查:

自从最近的 Windows 更新以来,我们的游戏有时会随机启动到一个永久空白的白色窗口。没有错误,没有 glfw 错误,没有 gl 错误。该应用程序运行,并且似乎正常呈现和更新,但窗口始终保持空白。

好的,那么正常启动和空白启动有什么区别?

我使用 APITRACE 来捕获成功和不成功的启动。痕迹是相同的。

我还单步完成了窗口创建和缓冲区交换,一切都在板上并且实际上是相同的(禁止 glfw 返回的窗口的物理内存地址等,无论启动是否成功,这些地址都会随着启动而变化或不)

当您重放跟踪时,qapitrace 做了什么?

通过 qapitrace 重放成功的跟踪通常会显示应用程序的前几秒,有时还会显示空白的灰色窗口。

通过 qapitrace 重放(相同的)“空白”跟踪通常会显示应用程序的前几秒,有时还会显示空白的灰色窗口。

因此,该错误不是跟踪的一部分,也不是由应用程序的其他活动引起的,而是以其他方式表现出来,也随机影响 qapitrace。

qapitrace 报告没有错误。

错误何时出现?

很早。在最简单的复制案例中,我初始化 glfw,创建一个窗口,显示它,然后调用 glfwSwapBuffers。我不画任何东西,甚至不清除屏幕。

如果窗口显示为黑色,则第一次调用 glfwSwapBuffers 有效,并将在应用程序的整个生命周期内继续有效。

如果窗口显示为白色,则 glfwSwapBuffers没有工作(尽管它不会产生错误),并且在我重新创建窗口或重新启动应用程序之前永远不会工作。

(注意:通过 glfw 创建的任何窗口似乎都有大致相同的机会被卡住。我尝试在启动时销毁和重新创建窗口两次或更多次:每个打开的窗口将随机为黑色(随后可正常工作)或白色(永久空白)。由于没有生成错误,我无法知道窗口是否已“占用”,因此在获得功能窗口之前我什至无法继续尝试)

我已将复制步骤缩小到此:

<standard glfwInit>
glfwWindowHint( GLFW_RED_BITS,8 );
glfwWindowHint( GLFW_GREEN_BITS,8 );
glfwWindowHint( GLFW_BLUE_BITS,8 );
glfwWindowHint( GLFW_ALPHA_BITS,0 );
glfwWindowHint( GLFW_DEPTH_BITS,32 );
glfwWindowHint( GLFW_STENCIL_BITS,0 );
glfwWindowHint( GLFW_RESIZABLE,false );
glfwWindowHint( GLFW_DECORATED,true );
glfwWindowHint( GLFW_FLOATING,false );
glfwWindowHint( GLFW_VISIBLE,false );
glfwWindowHint( GLFW_DOUBLEBUFFER,true );
glfwWindowHint( GLFW_SAMPLES,0 );   
glfwWindowHint( GLFW_REFRESH_RATE,60 );

GLFWmonitor *monitor=0;

_window=glfwCreateWindow( width,height,_STRINGIZE(CFG_GLFW_WINDOW_TITLE),monitor,0 );
if( !_window ){
    <report error>
    abort();
}

glfwSetWindowPos( _window,(_desktopMode.width-width)/2,(_desktopMode.height-height)/2 );
glfwShowWindow( _window );
glfwMakeContextCurrent( _window );
glfwSwapInterval( 0 );
glfwSwapBuffers( _window );

如果窗口显示为黑色,则最后的第一个“swapbuffers”工作,随后的 swapbuffers 也将工作,允许应用程序正常显示。

如果窗口显示为白色(有时很少,有时连续多次),那么第一个“swapbuffers”已经失败,静默,并且在重新创建窗口之前永远不会工作。

我在 Intel HD Graphics 4600 上看到了这一点。它也发生在 880M 笔记本电脑上,我也收到了来自 AMD 用户的报告。AMD 报告是针对不相关的黑屏问题。仅限 Windows 10。

标签: openglwindows-10glfw

解决方案


推荐阅读