每监视器dpi感知:黑色窗口故障与NVIDIA Optimus



我想制作一个逐监视器dpi感知的Direct2D应用程序。我已经扩展了微软的"第一个Direct2D程序"的例子来处理WM_DPICHANGED,正如Kenny Kerr在MSDN的文章中所解释的那样。当两个显示器都使用一个显卡时,它可以工作,但在使用我笔记本电脑的NVIDIA Optimus设置时,它会出现故障。

我可以通过以下步骤运行逐监视器感知WPF示例来重现相同的故障:

  • 每个显示器的DPI缩放因子不同。
  • Optimus启用(笔记本电脑显示集成图形,外部显示器Quadro卡)
  • 应用程序在主显示器上启动-右边的外部监视器。
  • 把它拖到左边,它可以正确处理DPI变化。
  • 将其拖回右侧。当它处理DPI变化时,右侧显示器上的窗口部分变为黑色。左边的部分仍然画得很好。

(查看此bug的视频)

我只在上面的示例应用程序中看到过这个错误,当我试图将Kerr的WM_DPICHANGED处理器添加到一个更简单的示例中时。令人怀疑的是,我已经看到其他应用程序(Chrome, Visual Studio本身)显示类似的黑色窗口,但只是暂时的,如果我在显示器之间拖动并快速最大化它们。

有谁熟悉这个小故障吗?是我的显示驱动程序有问题吗?或者有其他应用程序做纠正它,这是示例代码没有?

你说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)

相关内容

  • 没有找到相关文章

最新更新