D3D / DXGI tam ekran geçişi yapabilir


9

Bir D3D11 uygulamam var ve uygun tam ekran desteği eklemek istiyorum. Şimdi DXGI'nin penceremi benim için tam ekrana geçirmesine izin verebilirim ve DXGI'nin takas zincirini onları karıştırmak yerine öne ve arkaya çevirmek için gereken her şeyi halledeceği izlenimi altındayım.

Bununla birlikte, DXGI'nin swich'i gerçekleştirmesine izin vermek, çoklu monitör kurulumuyla güvenilir görünmüyor - ikincil ekranlar, anahtardan sonra büyük bir süre boyunca, belirgin bir neden veya desen olmadan tamamen siyah kalıyor.

Tam ekran penceresini ve masaüstünün geri kalanını diğer ekranlarda göstermeden önce birkaç kez geçiş yapmak gerekebilir.

Görünüşe göre bununla yalnız değilim, Battlefield 3 ve WoW'un birçok insan için benzer sorunları var gibi görünüyor.

Şimdi asıl soru: Sanırım bu AAA oyun geliştiricileri bile bunu çalıştıramazlar, en büyük umudum bir şekilde kendime tam ekran geçişi yapmak olacaktır.

Penceremi / swapchainimi uygun, arabellek çevirme tam ekran moduna yükseltmek için yapabileceğim bir şey var mı?


Bu yazı yazıldığı sırada, World of Warcraft'ın mevcut sürümünde, bahsettiğiniz ekran modu yapılandırma sorunları / bellek sızıntıları artık yok. Kesinlikle sorunluydular, ancak 7.3.2 itibariyle düzeltildi
Gazer

Yanıtlar:


3

Bildiğim kadarıyla işe yarayan tek şey:

 DwmEnableComposition(DWM_EC_DISABLECOMPOSITION);

başvurunuzun başında ve:

DwmEnableComposition(DWM_EC_ENABLECOMPOSITION);

bırakmadan önce. Geçişler için her zamanki gibi devam edin. Ben InvalidateRect(NULL, NULL, true)boşuna tam ekrana geçtikten sonra denedim . Bu yardımcı olur umarım.


Her şeyi denedikten sonra haklısın. Sadece kompozisyonu devre dışı bırakmak, bunun olmasını güvenilir bir şekilde önler. Umduğum cevap değil, sanırım hiçbir şeyden daha iyi.

Windows 8.1 ve sonraki sürümlerin bu ayarı yok saydığını unutmayın. DWM'yi devre dışı bırakamazsınız.
Chuck Walbourn

1

Gerçekten de bu sorunla karşılaşan tek kişi sen değilsin . Kontrol edilecek ilk şey: kullandığınız ekran kartı için en son / beta / birinci sınıf sürücüleri kullandığınızdan emin olun.

Şimdi, bunun otomatik DXGI uygulamasından daha iyi çalışabilmesi için sadece küçük bir şans olduğunu söyleyebilirim. Bu tür sorunlar büyük ölçüde adaptör satıcısına, sürücü sürümüne ve monitör yapılandırmasına bağlıdır. Yani bir makineye sabitleyerek daha fazla kırmaya son verebilirsiniz.

Her şeyi elle yapmak zorunda kaldığınız DirectX 9'un karanlık çağlarına dönmemenizi tavsiye ederim. Otomatik geçişi düzeltmeyi denemek daha iyi bir fikirdir. Takip edilecek bazı yollar:

  • (Seyrek) belgeleri dikkatlice okuyun .

  • Henüz yapmıyorsanız WM_SIZE, burada açıklandığı gibi , tam ekrandan / tam ekrana geçtikten sonra aldığınız olaya yanıt vermeye çalışın . Bunu yaparsanız ResizeBuffers, burada açıklandığı gibi, aramadan önce arka arabelleğe ilişkin tüm referansları doğru bir şekilde serbest bıraktığınızdan emin olun . Bunu yapmamak bu tür garip yarı sorunlara neden olabilir.

  • Doğrudan tam ekrandan başlamayı ve numaralandırma zincirinizi numaralandırılmış ekran modlarından biriyle oluşturmayı deneyin . Bu her zaman çalışırsa, bu işlem yaparken numaralandırılmış ekran modundan birini kullanmamanız anlamına gelebilir WM_SIZE(veya tamamen yenileme hızı gibi şeyler önemli olabilir).

  • Takas efekti ve takas zinciri açıklamanızın tampon sayısı ile uğraşmayı deneyin . Muhtemelen kullanıyorsunuz DXGI_SWAP_EFFECT_SEQUENTIALve BufferCount> = 2. Belki de sürücünüz daha "egzotik" seçenekler için zayıf desteğe sahiptir.


Arabellekleri yeniden boyutlandırmak işe yarar. Ayrıca tüm takas efektlerini denedim, fark etmiyorlar ve her zaman 2 tampon kullandım. Tam ekran şey denemek istiyorum, ("numaralandırılmış ekran modlarından birini kullanarak" ne demek istediğini bilmememe rağmen - WM_SIZE yanıt verirken tek yaptığım ResizeBuffers, bir argüman olarak bir ekran modu geçmek için hiçbir yer yoktur ) ama kendiliğinden windows 8 yükledim ve ne oldu, ben şu anda sorunu çoğaltamam ..

Windows7'ye geri döndü ve başlangıçtan itibaren tam ekranda swapchain oluşturmayı denedi, ancak sorun devam ediyor.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.