D3D / DXGI menangani transisi layar penuh

9

Saya memiliki aplikasi D3D11, dan saya ingin menambahkan suport layar penuh yang tepat. Sekarang saya dapat membiarkan DXGI mengalihkan jendela saya ke layar penuh untuk saya, dan saya mendapat kesan bahwa DXGI akan mengurus semua yang diperlukan untuk membuat rantai swap flip depan dan backbuffer alih-alih membukanya.

Namun, membiarkan DXGI melakukan swich tampaknya tidak dapat diandalkan dengan pengaturan multi-monitor - layar sekunder tetap sama sekali hitam setelah pergantian waktu, tanpa alasan atau pola yang jelas untuk itu.

Butuh beberapa kali beralih bolak-balik sebelum saya mendapatkan jendela layar penuh dan sisa desktop yang ditampilkan di layar lain.

Rupanya saya tidak sendirian dengan ini, Battlefield 3 dan WoW tampaknya memiliki masalah serupa bagi banyak orang.

Sekarang, pertanyaan sebenarnya: Saya kira karena perusahaan-perusahaan pengembang game AAA itu tidak dapat menjalankannya, harapan terbesar saya adalah entah bagaimana melakukan peralihan sendiri ke layar penuh.

Apakah ada yang bisa saya lakukan untuk meningkatkan jendela / swapchain ke mode layar penuh buffer-flipping yang tepat?


sumber
Pada saat penulisan ini, versi World of Warcraft saat ini tidak lagi memiliki masalah konfigurasi mode tampilan / kebocoran memori yang Anda sebutkan. Mereka tentu bermasalah tetapi telah diperbaiki pada 7.3.2
Gazer

Jawaban:

3

Sepengetahuan saya, satu-satunya yang berhasil adalah:

 DwmEnableComposition(DWM_EC_DISABLECOMPOSITION);

di awal aplikasi Anda dan:

DwmEnableComposition(DWM_EC_ENABLECOMPOSITION);

sebelum berhenti. Untuk transisi, lanjutkan seperti biasa. Saya telah mencoba InvalidateRect(NULL, NULL, true)setelah beralih ke layar penuh tanpa hasil. Semoga ini membantu.

Jay
sumber
Setelah mencoba semuanya, sepertinya Anda benar. Hanya penonaktifan komposisi yang dapat mencegah hal ini terjadi. Bukan jawaban yang saya harapkan, tetapi lebih baik daripada tidak saya kira.
Perhatikan bahwa Windows 8.1 dan yang lebih baru mengabaikan pengaturan ini. Anda tidak dapat menonaktifkan DWM.
Chuck Walbourn
1

Anda memang bukan satu-satunya yang menghadapi masalah ini . Hal pertama yang perlu diperiksa: pastikan Anda menggunakan driver / beta / top-notch terbaru untuk kartu video yang Anda gunakan.

Sekarang, saya akan mengatakan bahwa hanya ada kemungkinan kecil bahwa Anda bisa mendapatkan ini berfungsi lebih baik daripada implementasi DXGI otomatis. Masalah seperti ini sangat tergantung pada vendor adaptor, versi driver, dan konfigurasi monitor. Jadi dengan memperbaikinya pada satu mesin, Anda mungkin akhirnya merusaknya lagi.

Saya menyarankan untuk tidak kembali ke zaman gelap DirectX 9 di mana Anda harus melakukan semuanya dengan tangan. Gagasan yang lebih baik adalah mencoba memperbaiki peralihan otomatis. Beberapa jalur untuk diikuti:

  • Baca dokumentasi (jarang) dengan cermat.

  • Jika Anda belum melakukannya, cobalah untuk merespons WM_SIZEacara yang Anda terima saat beralih dari / ke layar penuh, seperti dijelaskan di sini . Jika Anda melakukannya, pastikan Anda melepaskan semua referensi ke buffer belakang dengan benar sebelum menelepon ResizeBuffers, seperti dijelaskan di sana . Gagal melakukannya dapat menyebabkan masalah setengah aneh seperti ini.

  • Cobalah untuk memulai langsung di layar penuh, dan untuk membuat rantai swap Anda dengan salah satu mode tampilan yang disebutkan . Jika ini berfungsi sepanjang waktu, ini mungkin berarti Anda tidak menggunakan salah satu mode tampilan yang disebutkan saat menangani WM_SIZE(atau tidak sepenuhnya, hal-hal seperti kecepatan refresh bisa menjadi penting).

  • Cobalah mondar-mandir dengan efek swap dan jumlah buffer dari deskripsi rantai swap Anda . Anda mungkin harus menggunakan DXGI_SWAP_EFFECT_SEQUENTIALdan BufferCount> = 2. Mungkin driver Anda memiliki dukungan yang buruk untuk opsi yang lebih "eksotis".

Laurent Couvidou
sumber
Mengubah ukuran buffer berfungsi dengan baik. Saya juga sudah mencoba semua efek swap, sepertinya tidak ada bedanya, dan saya selalu menggunakan 2 buffer. Saya akan mencoba hal layar penuh, (walaupun saya tidak tahu apa yang Anda maksud dengan "menggunakan salah satu mode tampilan yang disebutkan" - ketika menanggapi WM_SIZE yang saya lakukan hanyalah ResizeBuffers, tidak ada tempat untuk melewatkan mode tampilan sebagai argumen ) tapi saya secara spontan menginstal windows 8 dan
Kembali ke windows7, dan mencoba membuat swapchain di layar penuh sejak awal, tetapi masalah tetap ada.