我正在开发一个使用 WPF 4.6.2 和 Direct3D 11 的 CAD 应用程序,它们通过 D3DImage 进行互操作。当窗口在 4K 3840x2160 显示屏上最大化时,应用程序渲染 3D 内容的速度非常慢,大约为 1 FPS。我想“好吧,屏幕上的像素太多了,这可能是正常的”。
但是,如果我调整窗口大小,使其不再最大化,而只是比最大化时小几个像素,则 3D 渲染工作正常,我得到的帧速率约为 20 FPS。相同的场景,相同的渲染设置,一切都相同,唯一的区别是全屏与窗口。
我的窗口使用自定义镶边,即
<WindowChrome CornerRadius="0" GlassFrameThickness="0" UseAeroCaptionButtons="False" />
和自定义标题栏和系统按钮。我已将问题范围缩小到 WindowChrome XAML 问题。
我认为问题是本机Win32窗口在这种状态下太大,甚至大于4K,需要裁剪到屏幕上。 Spy++ 向我展示了最大化窗口的以下矩形:
(-11,-11)-(3851,2111), 3862x2122 (Maximized)
为什么
SystemCommands.MaximizeWindow()
API 对我的窗口执行此操作?有没有办法让它尊重我的屏幕尺寸并停止将我的窗口调整得更大?
更新:好的,正如评论中提到的,最大化窗口尺寸大于屏幕是正常的,我确认在没有自定义镶边的情况下仍然是这种情况。
然而,不正常的是窗口客户端矩形大于屏幕。
在导致 Direct3D 性能下降的错误状态下,该窗口的客户端矩形为
(-5,-6)-(3857,2166), 3862x2122
。
在良好的状态下(但使用系统提供的chrome),客户端矩形是
(11,45)-(3851,2111), 3840x2066
。
我还没有找到解决WPF性能问题的合适方法。
相反,我实施了一种解决方法。具体来说,我添加了一个默认为 false 的布尔首选项。启用后,此首选项将禁用自定义镶边并恢复为操作系统提供的窗口标题和系统菜单,从而解决 D3D11 渲染性能问题。
4K 显示器和较旧 GPU 的组合并不常见,因此该问题只影响了一小部分用户。事实证明,这个解决方法足以满足我们的应用程序。