D3D / DXGI управляют полноэкранным переходом

9

У меня есть приложение D3D11, и я хочу добавить правильную полноэкранную поддержку. Теперь я могу позволить DXGI переключить мое окно в полноэкранный режим для меня, и у меня сложилось впечатление, что DXGI позаботится обо всем, что нужно, чтобы своп-цепочка переворачивала передний и задний амортизаторы, а не отбрасывала их.

Однако позволить DXGI выполнить это кажется ненадежным с настройкой нескольких мониторов - вторичные экраны остаются полностью черными после переключения в течение длительного времени, без видимой причины или шаблона.

Может потребоваться несколько раз переключаться назад и вперед, прежде чем я получу полноэкранное окно, а остальная часть рабочего стола отображается на других экранах.

Видимо, я не одинок в этом, у Battlefield 3 и WoW, похоже, есть похожие проблемы для многих людей.

Теперь актуальный вопрос: я полагаю, поскольку даже те компании-разработчики игр AAA не могут заставить это работать, моя самая большая надежда состояла бы в том, чтобы как-то сам переключиться на полноэкранный режим.

Есть ли что-нибудь, что я могу сделать, чтобы перевести мой window / swapchain в правильный полноэкранный режим с переворотом в буфере?


источник
На момент написания этой статьи в текущей версии World of Warcraft больше не было проблем конфигурации экрана / утечек памяти, о которых вы упоминали. Они, конечно, были проблематичными, но были исправлены по состоянию на 7.3.2
Gazer

Ответы:

3

Насколько мне известно, единственное, что работает:

 DwmEnableComposition(DWM_EC_DISABLECOMPOSITION);

в начале вашего заявления и:

DwmEnableComposition(DWM_EC_ENABLECOMPOSITION);

прежде чем выйти. Для переходов действуйте как обычно. Я пробовал InvalidateRect(NULL, NULL, true)сразу после перехода в полноэкранный режим безрезультатно. Надеюсь это поможет.

сойка
источник
Попробовав все, кажется, вы правы. Только отключение композиции надежно предотвращает это. Не тот ответ, на который я надеялся, но лучше, чем ничего, я полагаю.
Обратите внимание, что Windows 8.1 и более поздние версии игнорируют этот параметр. Вы не можете отключить DWM.
Чак Уолборн
1

Вы действительно не единственный, кто сталкивается с этой проблемой . Первое, что нужно проверить: убедитесь, что вы используете последние / бета / первоклассные драйверы для видеокарты, которую вы используете.

Теперь я бы сказал, что есть лишь небольшая вероятность того, что вы сможете получить эту работу лучше, чем автоматическая реализация DXGI. Проблема такого рода сильно зависит от поставщика адаптера, версии драйвера и конфигурации монитора. Так что, установив его на одной машине, вы можете сломать его на другой.

Я не советую возвращаться в темные времена DirectX 9, где вам приходилось все делать вручную. Лучше было бы попробовать исправить автоматическое переключение. Некоторые следы, чтобы следовать:

  • Внимательно прочитайте (разреженную) документацию .

  • Если вы этого еще не сделали, попробуйте ответить на WM_SIZEсобытие, которое вы получите при переключении с / на полноэкранный режим, как описано здесь . Если вы это сделаете, убедитесь, что вы правильно освободили все ссылки на обратный буфер перед вызовом ResizeBuffers, как описано там . Невыполнение этого требования может вызвать такие странные проблемы.

  • Попробуйте начать прямо в полноэкранном режиме и создать цепочку обмена с одним из перечисленных режимов отображения . Если это работает постоянно, это может означать, что вы не используете один из перечисленных режимов отображения при обработке WM_SIZE(или не совсем, такие вещи, как частота обновления могут быть важны).

  • Попробуйте поиграться с эффектом подкачки и количеством буферов в описании цепочки подкачки . Возможно, вам следует использовать DXGI_SWAP_EFFECT_SEQUENTIALи a BufferCount> = 2. Возможно, ваш драйвер плохо поддерживает более «экзотические» опции.

Лоран Кувиду
источник
Изменение размера буферов работает нормально. Я также перепробовал все эффекты свопинга, они, кажется, не имеют значения, и я всегда использовал 2 буфера. Я бы попробовал полноэкранный режим (хотя я и не знаю, что вы подразумеваете под «использованием одного из перечисленных режимов отображения») - при ответе на WM_SIZE все, что я делаю, это ResizeBuffers, некуда передать режим отображения в качестве аргумента ) но я самопроизвольно установил windows 8 и угадаю, что, сейчас я не могу воспроизвести проблему ..
Вернулся в Windows7 и попытался создать swapchain в полноэкранном режиме с самого начала, но проблема остается.