ПРИМЕЧАНИЕ. Это не общее «Почему мое приложение ничего не рисует?»
Это не имеет ничего общего с матрицами, очисткой буфера глубины или настройкой ножниц.область, или вершинные буферы, или текстуры, или glEnabling что-либо :) Мне не нужно ничего рисовать или даже очищать экран, чтобы эта проблема проявилась.
Это очень, очень специфическая ситуация, которую яудалось сузить до следующей последовательности:
- glfwInit () успешно
- glfwCreateWindow () также успешно
- 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 );
Если окно выглядит черным, то эти первые «свопбуферы» вend работал, и последующие swapbuffers также будут работать, позволяя приложению отображаться как обычно.
Если окно выглядит белым (иногда редко, иногда несколько раз подряд), то первый «swapbuffers» не удался,тихо, и никогда не будет работать, пока окно не будет воссоздано.
Я вижу это на Intel HD Graphics 4600. Это также происходит на ноутбуке 880M, и я получаю отчеты от пользователей AMD какхорошо. Отчеты AMD были для несвязанной проблемы пустого экрана.Только для Windows 10.