DPI-Aware для каждого монитора: сбой в черном окне с NVIDIA Optimus

Я хотел бы создать приложение Direct-Aware Direct2D для каждого монитора. Я продлил Microsoft «Первая программа Direct2D» пример для обработки WM_DPICHANGED как объяснено в Статья Кенни Керра по MSDN. Это работает, когда оба монитора используют одну видеокарту, но страдает от сбоя при использовании установки NVIDIA Optimus на моем ноутбуке.

Я могу воспроизвести тот же глюк, запустив Пример WPF для каждого монитора с этими шагами:

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

(Увидеть видео этой ошибки)

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

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

6

Решение

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)
3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]