Per-monitor DPI-Aware:NVIDIA Optimus 出现黑窗故障

Posted

技术标签:

【中文标题】Per-monitor DPI-Aware:NVIDIA Optimus 出现黑窗故障【英文标题】:Per-monitor DPI-Aware: black window glitch with NVIDIA Optimus 【发布时间】:2016-11-05 10:23:49 【问题描述】:

我想制作一个 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 驱动程序 354.42 和最新的 368.39。但是(期待您未来可能提出的问题)我尝试了我存储的最旧版本 332.21,并且令人惊讶 - 没有故障。 (那个旧驱动程序早于 Windows 10,所以坦率地说,我很惊讶它完全可以工作)。所以它一个驱动程序问题,但可能需要更多调查.. 也就是说,NVIDIA 在"Why do I see artifacts or black screens when I drag an application..." 上确实有一个知识库答案。这表示“应用程序需要正确处理显示适配器的变化,以便在不中断的情况下进行转换。”我现在只是更加困惑——如果应用程序总是必须显式处理适配器,这将是直截了当的,但故障仅发生在某些驱动程序版本上,并且仅在尝试调整 DPI 更改大小时发生。 【参考方案1】:

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

【讨论】:

将该标志添加到CreateHwndRenderTarget 调用并没有立即解决问题,但是当我深入挖掘时,我会记住这一点。谢谢。

以上是关于Per-monitor DPI-Aware:NVIDIA Optimus 出现黑窗故障的主要内容,如果未能解决你的问题,请参考以下文章

private virtual函数

virtualenvwrapper

linux命令

Nixos 默认音频设备

glUseProgram() 和 glUseShaderProgram() 有啥区别?

考虑virtual函数以外的选择