2016-07-03 14 views
6

Я хотел бы сделать приложение Perl Monitor DPI-Aware Direct2D. Я распространил пример Microsoft "First Direct2D Program" для обработки WM_DPICHANGED, как описано в Kenny Kerr's MSDN article. Это работает, когда оба монитора используют одну видеокарту, но страдают от сбоев при использовании настройки NVIDIA Optimus моего ноутбука.Per-monitor DPI-Aware: черный оконный сбой с NVIDIA Optimus

я могу воспроизвести тот же глюк, запустив Per-Monitor Aware WPF Sample с этими шагами:

  • Различные DPI коэффициент масштабирования на каждом мониторе.
  • Включен Optimus (дисплей для ноутбука на встроенной графике, внешний монитор на карте Quadro)
  • Приложение запускается на основном дисплее - внешний монитор справа.
  • Перетащите его влево, и он правильно обрабатывает изменение DPI.
  • Перетащите его обратно вправо. Когда он обрабатывает изменение DPI, часть окна на правом мониторе становится черной. Часть слева по-прежнему рисуется правильно.

(см video of this bug)

Я только видел эту ошибку с выше пример приложения, и, когда я пытаюсь добавить обработчик WM_DPICHANGED Керра к более простому примеру. Подозрительно, у есть другие приложения (Chrome, Visual Studio) показывают аналогичное черное окно, но только временно, если я перетаскиваю между мониторами и максимизую их очень быстро.

Итак - кто-нибудь знаком с этим сбоем? Это какая-то ошибка в драйверах дисплея? Или есть ли что-то другое приложение для его исправления, чего нет в примере кода?

+1

Вы пробовали обновлять драйверы дисплея, если это просто ошибка драйвера? –

+0

Да, я попробовал драйверы Nvidia 354.42 и последний, 368.39. Но (предвосхищая ваши потенциальные будущие вопросы) я попробовал самую старую версию, которую я сохранил, 332.21, и неожиданность - никаких сбоев. (Этот старый драйвер предшествует Windows 10, так что, честно говоря, я удивлен, что он вообще работал). Таким образом, это * проблема с драйвером, но может потребоваться еще некоторое расследование .. – Lack

+0

Тем не менее, у NVIDIA есть ответ на базу знаний [«Почему я вижу артефакты или черные экраны при перетаскивании приложения ...»] (https : //nvidia.custhelp.com/app/answers/detail/a_id/2757). Это говорит о том, что «приложение должно правильно обрабатывать изменения в адаптере дисплея для перехода без перерыва». Я сейчас только запутался - было бы просто, если бы приложение * всегда * должно было явно обрабатывать адаптеры, но сбой происходит только в определенных версиях драйверов и только при изменении размера для изменения DPI. – Lack

ответ

3

NVIDIA Optimus вы говорите? Эти драйверы являются ошибками как грех. Попробуйте инициализировать цель рендеринга флагом D2D1_PRESENT_OPTIONS_RETAIN_CONTENTS.

Это было что-то, что взял меня навсегда, чтобы выяснить, еще в 2014 году, когда я заканчивал Paint.NET 4.0, и я до сих пор получил комментарий в коде предупредив меня никогда не выключить его:

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' не сразу решило проблему, но я буду помнить об этом, когда я копаю глубже. Спасибо. – Lack

 Смежные вопросы

  • Нет связанных вопросов^_^