У меня есть приложение D3D11, и я хочу добавить правильную полноэкранную поддержку. Теперь я могу позволить DXGI переключить мое окно в полноэкранный режим для меня, и у меня сложилось впечатление, что DXGI позаботится обо всем, что нужно, чтобы своп-цепочка переворачивала передний и задний амортизаторы, а не отбрасывала их.
Однако позволить DXGI выполнить это кажется ненадежным с настройкой нескольких мониторов - вторичные экраны остаются полностью черными после переключения в течение длительного времени, без видимой причины или шаблона.
Может потребоваться несколько раз переключаться назад и вперед, прежде чем я получу полноэкранное окно, а остальная часть рабочего стола отображается на других экранах.
Видимо, я не одинок в этом, у Battlefield 3 и WoW, похоже, есть похожие проблемы для многих людей.
Теперь актуальный вопрос: я полагаю, поскольку даже те компании-разработчики игр AAA не могут заставить это работать, моя самая большая надежда состояла бы в том, чтобы как-то сам переключиться на полноэкранный режим.
Есть ли что-нибудь, что я могу сделать, чтобы перевести мой window / swapchain в правильный полноэкранный режим с переворотом в буфере?
Ответы:
Насколько мне известно, единственное, что работает:
в начале вашего заявления и:
прежде чем выйти. Для переходов действуйте как обычно. Я пробовал
InvalidateRect(NULL, NULL, true)
сразу после перехода в полноэкранный режим безрезультатно. Надеюсь это поможет.источник
Вы действительно не единственный, кто сталкивается с этой проблемой . Первое, что нужно проверить: убедитесь, что вы используете последние / бета / первоклассные драйверы для видеокарты, которую вы используете.
Теперь я бы сказал, что есть лишь небольшая вероятность того, что вы сможете получить эту работу лучше, чем автоматическая реализация DXGI. Проблема такого рода сильно зависит от поставщика адаптера, версии драйвера и конфигурации монитора. Так что, установив его на одной машине, вы можете сломать его на другой.
Я не советую возвращаться в темные времена DirectX 9, где вам приходилось все делать вручную. Лучше было бы попробовать исправить автоматическое переключение. Некоторые следы, чтобы следовать:
Внимательно прочитайте (разреженную) документацию .
Если вы этого еще не сделали, попробуйте ответить на
WM_SIZE
событие, которое вы получите при переключении с / на полноэкранный режим, как описано здесь . Если вы это сделаете, убедитесь, что вы правильно освободили все ссылки на обратный буфер перед вызовомResizeBuffers
, как описано там . Невыполнение этого требования может вызвать такие странные проблемы.Попробуйте начать прямо в полноэкранном режиме и создать цепочку обмена с одним из перечисленных режимов отображения . Если это работает постоянно, это может означать, что вы не используете один из перечисленных режимов отображения при обработке
WM_SIZE
(или не совсем, такие вещи, как частота обновления могут быть важны).Попробуйте поиграться с эффектом подкачки и количеством буферов в описании цепочки подкачки . Возможно, вам следует использовать
DXGI_SWAP_EFFECT_SEQUENTIAL
и aBufferCount
> = 2. Возможно, ваш драйвер плохо поддерживает более «экзотические» опции.источник