Моя игра OpenGL выключает Aero DWM Glass - PullRequest
3 голосов
/ 20 апреля 2010

Несколько лет назад я написал бесплатную игру: http://www.walkover.org. Для лобби и меню используются обычные диалоги, такие как win32. Когда начинается настоящая игра, она использует OpenGL.

Теперь в Windows 7, когда начинается настоящая игра, она выключает стекло и выключает его, когда игра заканчивается.

Могу ли я что-нибудь сделать, чтобы этого не случилось? Некоторые специальные флаги, которые держат стекло включенным, если оно включено? (Для более нового я использую DirectX, и этого там не происходит.) Может быть, какой-то (новый) флаг мне нужно где-то указать?

Я использую этот пиксель в формате дескриптора:

    static PIXELFORMATDESCRIPTOR pfd =
    {
        sizeof(PIXELFORMATDESCRIPTOR),  // size of this pfd
        1,                              // version number
        PFD_DRAW_TO_WINDOW |            // support window
          PFD_SUPPORT_OPENGL |          // support OpenGL
          PFD_DOUBLEBUFFER,             // double buffered
        PFD_TYPE_RGBA,                  // RGBA type
        32,                             // 24-bit color depth
        0, 0, 0, 0, 0, 0,               // color bits ignored
        0,                              // no alpha buffer
        0,                              // shift bit ignored
        0,                              // no accumulation buffer
        0, 0, 0, 0,                     // accum bits ignored
        0,                              // 32-bit z-buffer
        0,                              // no stencil buffer
        0,                              // no auxiliary buffer
        PFD_MAIN_PLANE,                 // main layer
        0,                              // reserved
        0, 0, 0                         // layer masks ignored
    };

Ответы [ 4 ]

5 голосов
/ 20 сентября 2011

Эта проблема вызвана следующими причинами:

  • Windows 7
  • OpenGL
  • Создание окна, которое точно соответствует вашему прямоугольнику экрана (в полноэкранном режиме)
  • Второй раз вызывается буфер подкачки
  • Старые драйверы видеокарты

У меня та же проблема, и я протестировал 2 игровых движка AAA, использующих OpenGL, и могу подтвердить, что у них обоих была одинаковая проблема. DirectX кажется незатронутым.

Это означает, что создание вашего окна в порядке, это не проблема кода.

Я бы порекомендовал обновить драйверы вашей видеокарты для решения проблемы.

Краткосрочная работа, которую я нашел, заключалась в создании окна, которое на 1 пиксель больше вашего разрешения экрана (по ширине или высоте)

Это заставляет окна не обнаруживать, что вы перешли в полноэкранный режим, и не вызывает проблему.

1 голос
/ 22 апреля 2010

Я думаю, что это может произойти, если вы создадите контекст рендеринга OpenGL, который несовместим с Aero Glass. IIRC один из случаев, который может вызвать это, если вы создаете окно, используя 16-битный цвет. Aero Glass не может отображать в 16-битном цвете, поэтому по какой-то технической причине Windows вынуждена полностью отключить Aero Glass (даже если его использует только ваше приложение). Попробуйте использовать 32-битный цвет.

Там могут быть другие настройки, которые отключают его по аналогичным причинам. Короче говоря, дважды проверьте все настройки, с которыми вы создаете OpenGL, и подумайте: «Не выключится ли Aero Glass, если рабочий стол будет переключен в этот режим?»

0 голосов
/ 09 марта 2012

Однажды я столкнулся с проблемой в моем приложении, что GDI не мог читать содержимое окна, отображаемого OpenGL, при попытке сделать BitBlt из окна DC. Это было тогда, когда только что вышла Vista. Использование PFD_SUPPORT_GDI поможет обойти это, но также отключит Aero. Я полагаю, что из-за этой проблемы было сломано много старых приложений, поэтому в некоторых случаях они были включены. Не уверен, что ты здесь делаешь. Я бы поставил на проблему с заглушкой водителя.

Просто мой собственный ограниченный опыт работы с OpenGL, Aero и GDI.

0 голосов
/ 20 апреля 2010

Не совсем точно, что вы делаете, что является причиной этого, но это, вероятно, также хорошо - реализация Microsoft OpenGL в Windows 7 не совсем идеальна, чтобы выразиться. Фактически, в большей части моего кода OpenGL, я привык явно отключать DWM. В противном случае ошибки в реализации Microsoft в основном не позволяют ей работать вообще. Хотя я могу обойти эту проблему в некоторой степени другими способами, производительность настолько низкая, что в любом случае код становится практически непригодным для использования (я не проводил серьезных измерений, но сразу предположил, что по крайней мере скажу Потеря производительности 5: 1).

...