Случайное пустое белое окно при запуске приложения GLFW (glfwSwapBuffers не работает) - PullRequest
0 голосов
/ 28 сентября 2018

ПРИМЕЧАНИЕ. Это не общее «Почему мое приложение ничего не рисует?»

Это не имеет ничего общего с матрицами, очисткой буфера глубины или настройкой ножниц.область, или вершинные буферы, или текстуры, или 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 );

Если окно выглядит черным, то эти первые «свопбуферы» вend работал, и последующие swapbuffers также будут работать, позволяя приложению отображаться как обычно.

Если окно выглядит белым (иногда редко, иногда несколько раз подряд), то первый «swapbuffers» не удался,тихо, и никогда не будет работать, пока окно не будет воссоздано.

Я вижу это на Intel HD Graphics 4600. Это также происходит на ноутбуке 880M, и я получаю отчеты от пользователей AMD какхорошо. Отчеты AMD были для несвязанной проблемы пустого экрана.Только для Windows 10.

...