c++ - 每个显示器 DPI 感知 : black window glitch with NVIDIA Optimus

标签 c++ winapi direct2d multiple-monitors optimus

我想制作一个 Per-Monitor DPI-Aware Direct2D 应用程序。我已经扩展了 Microsoft 的 "First Direct2D Program"处理 WM_DPICHANGED 的示例,如 Kenny Kerr's MSDN article 中所述.这在两个显示器都使用一个视频卡时有效,但在使用我的笔记本电脑的 NVIDIA Optimus 设置时出现故障。

我可以通过运行 Per-Monitor Aware WPF Sample 重现相同的故障通过以下步骤:

  • 每台显示器上的不同 DPI 比例因子。
  • 启用 Optimus(集成显卡上的笔记本电脑显示屏,Quadro 卡上的外接显示器)
  • 应用程序在主显示器上启动 - 右侧的外部显示器。
  • 将它拖到左侧,它会正确处理 DPI 变化。
  • 将它拖回到右边。当它处理 DPI 更改时,右侧显示器上的窗口部分变为黑色。左边的部分仍然正确绘制。

(参见 video of this bug)

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

那么 - 有人熟悉这个故障吗?这是我的显示驱动程序中的一些错误吗?还是其他应用程序做了一些事情来纠正它,而示例代码没有?

最佳答案

你说 NVIDIA Optimus?那些司机是罪恶的 buggy 。尝试使用 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)

关于c++ - 每个显示器 DPI 感知 : black window glitch with NVIDIA Optimus,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38171965/

相关文章:

c++ - 如何将类实例传递给 LowLevelMouseProc?

winapi - Windows API 提取zip 文件?

c# - EndDraw() 在 Direct2D 中占用 80% 的工作时间

c++ - 使用 Direct2d 绘制和创建非矩形位图

c++ - 在不单独绘制每个 channel 的情况下移动颜色 channel ?

c++ - Boost Program_options 配置文件注释

c++ - Visual C++ 函数问题(及其他)

c++ - 将字符串从 getline 转换为数字

c++ - WM_KEYDOWN 消息未发送

c++ - [basic.execution] p5 句子 2 的意图