注意:这不是通用的“为什么我的应用程序无法绘制任何内容?”
这与矩阵,清除深度缓冲区,设置剪刀区域,顶点缓冲区,顶点缓冲区或纹理或启用任何东西无关:)我不需要绘制任何东西甚至不需要清除屏幕即可这个问题得以体现。
这是一个非常非常特殊的情况,我能够缩小为以下顺序:
到目前为止的背景和调查:
自从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 );
如果窗口显示为黑色,则末尾的第一个“交换缓冲区”起作用,随后的交换缓冲区也将起作用,从而使该应用正常显示。
如果窗口显示为白色(有时很少,有时连续多次),则第一个“交换缓冲区”将以静默方式失败,并且直到重新创建窗口后才起作用。
我在Intel HD Graphics 4600上看到了这一点。这也发生在880M笔记本电脑上,我也收到了AMD用户的报告。 AMD报告是关于一个无关的黑屏问题。仅Windows 10。