2016-07-03 75 views
6

Bir Per-Monitor DPI-Aware Direct2D uygulaması yapmak istiyorum. Kenny Kerr's MSDN article'da açıklandığı gibi Microsoft'un "First Direct2D Program" örneğini WM_DPICHANGED işlemek için genişlettik. Bu, monitörlerin her ikisi de bir ekran kartı kullandığında, ancak dizüstü bilgisayarımın NVIDIA Optimus kurulumunu kullanırken bir aksaklık yaşadığında çalışır.Per-monitor DPI-Aware: NVIDIA Optimus ile siyah pencere aksaklığı

Bunları adımlarla Per-Monitor Aware WPF Sample çalıştırarak aynı aksaklık üretebilir:

  • Farklı DPI ölçeklendirme faktörü her monitörde.
  • Optimus etkinleştirildi (tümleşik grafikte dizüstü bilgisayar ekranı, Quadro kartında harici monitör)
  • Uygulama, ana ekranda başlar - sağdaki harici monitör.
  • Sola doğru sürükleyin ve DPI değişimini düzgün şekilde gerçekleştirin.
  • Geri sağa doğru sürükleyin. DPI değişimini ele aldığında, pencerenin sağ monitördeki kısmı siyah olur. Soldaki kısım hala düzgün çizilmiştir. Sadece yukarıdaki örnek uygulaması ile bu hatayı gördük (video of this bug Bkz)

ve ben daha basit bir örneğe Kerr WM_DPICHANGED işleyicisi eklemeye çalıştığınızda. Şüphesiz, ben diğer uygulamaları (Chrome, Visual Studio'nun kendisi), monitörler arasında sürükleyip çok hızlı bir şekilde maksimize edersem, sadece geçici olarak benzer bir siyah pencere gösterir.

Yani - bu aksama aşina olan var mı? Ekran sürücülerimde bir hata mı var? Veya başka bir uygulama, düzeltmek için örnek kodun yapamadığı bir şey var mı?

+1

Yalnızca bir sürücü hatası olması durumunda ekran sürücülerinizi güncellemeyi denediniz mi? –

+0

Evet, Nvidia sürücüleri 354.42'yi ve en son 368.39'u denedim. Ama (gelecekteki potansiyel sorularınızı tahmin ediyorum) En eski versiyonu denedim, 332.21 ve sürpriz - hiç aksama. (Bu eski sürücü Windows 10'u öneriyor, bu yüzden açıkça işe yaradığına şaşırdım). Bu yüzden * bir sürücü sorunudur, ancak biraz daha fazla araştırmaya ihtiyaç duyabilir .. – Lack

+0

Bu, NVIDIA'nın "Bir uygulamayı sürüklediğimde neden yapaylık veya siyah ekranları görüyorum?" Başlıklı bir bilgi tabanı yanıtı olduğunu söyledi. : //nvidia.custhelp.com/app/answers/detail/a_id/2757). Bu, "uygulamanın ekran bağdaştırıcısındaki değişikliği, kesintisiz olarak geçişe doğru şekilde ele alması gerekiyor" diyor. Artık sadece şaşkınım - eğer uygulama * her zaman * adaptörleri açıkça ele alsaydı, ancak hata sadece belirli sürücü sürümlerinde ve sadece DPI değişikliği için yeniden boyutlandırmaya çalışırken gerçekleşirdi. – Lack

cevap

3

NVIDIA Optimus diyorsunuz? Bu sürücüler günah olarak arabadır. Oluşturma hedefini D2D1_PRESENT_OPTIONS_RETAIN_CONTENTS bayrağıyla başlatmayı deneyin.

Bu benim Paint.NET 4.0 tamamlıyordu ne zaman geri 2014 yılında anlamaya sonsuza götürdü şeydi ve hala kapatmak asla beni ikaz kodda bir açıklama var:

private PresentOptions hwndPresentOptions = 
    PresentOptions.Immediately | 
    PresentOptions.RetainContents; // If we don't use RetainContents, then we get awful 
            // black flickering and mouse trails on some hardware 
            // (e.g. NVIDIA Optimus) 
+0

"CreateHwndRenderTarget" çağrısına bu bayrağı eklemek sorunu hemen çözmedi, ancak daha derine indiğimde bunu aklımda tutacağım. Teşekkür ederim. – Lack