D3D / DXGI керує переходом на весь екран


9

У мене є програма D3D11, і я хочу додати належну програму повноекранного доступу. Тепер я можу дозволити DXGI переключити моє вікно на повноекранний екран, і я маю враження, що DXGI подбає про все необхідне для того, щоб ланцюг заміни перевернути передню частину та задню частину, а не їх розтушувати.

Однак, дозволяючи DXGI виконувати swich, здається ненадійним при налаштуванні декількох моніторів - вторинні екрани залишаються повністю чорними після вимикача велику кількість часу, без видимих ​​причин чи зразка.

Це може зайняти кілька разів перемикаючись назад і вперед , перш ніж я отримую вікно на весь екран , а інша частина робочого столу, яка відображається на інших екранах.

Мабуть, я не один з цим, у Battlefield 3 та WoW, схоже, виникають подібні проблеми для багатьох людей.

Тепер, власне питання: я думаю, оскільки навіть ті розробники ігор AAA не можуть змусити це працювати, я найбільше сподіваюся на те, щоб якось виконати перехід на повноекранний режим самостійно.

Чи можу я щось зробити, щоб підняти вікно / 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(або не повністю, такі речі, як частота оновлення, можуть мати важливе значення).

  • Спробуйте зв'язатись із ефектом swap та кількістю буфера опису ланцюга своп . Ймовірно, ви повинні використовувати DXGI_SWAP_EFFECT_SEQUENTIALі a BufferCount= = 2. Можливо, у вашого драйвера погана підтримка більш "екзотичних" варіантів.


Зміна розміру буферів працює добре. Я також спробував усі ефекти свопу, вони, схоже, не мають значення, і я завжди використовував 2 буфери. Я б спробував полноэкранную річ (хоча я не знаю, що ви маєте на увазі під "використанням одного з перерахованих режимів відображення" - коли у відповідь на WM_SIZE все, що я роблю, це ResizeBuffers, ніде не можна передавати режим відображення як аргумент ), але я спонтанно встановив Windows 8 і здогадуюсь, що я не можу повторити проблему зараз ..

Повернулися до windows7 і спробували створити свопчайн на повноекранному екрані з самого початку, але проблема зберігається.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.