WPF/Win32应用程序并行运行时出现性能问题?

8
我们有一款旧版(Win32)和新版(WPF)的交易软件,交易员目前在同时运行这两个版本。然而,运行WPF应用程序经常会严重降低Win32应用程序的重绘速率。
如果不运行WPF应用程序(或将其最小化),Win32应用程序的绘制速率就是流畅和快速的。但是,如果与之同时打开WPF应用程序,则Win32应用程序的用户界面绘制速率明显变慢。运行WPF应用程序似乎会触发使用某些资源,这些资源被从Win32应用程序中取走(两者都是图形密集型),导致了这种减速现象。
CPU和内存并没有接近饱和,因此看起来与它们无关。降低分辨率和/或减少显示器数量(从而减少显卡内存使用和带宽负载)没有任何显着的差异,因此似乎也不是图形硬件性能问题。
一个可能解释原因的假设如下:
我们知道,在底层,WPF和Win32应用程序都将图形信息输出到一个Windows“消息泵”中,这基本上是一个指令队列,用于绘制到屏幕上。如果WPF应用程序没有运行,Win32应用程序可以完全自由地访问它,并且屏幕更新是流畅的。与之同时运行WPF应用程序会在此队列上放置额外的消息,因此Win32应用程序必须更努力地竞争访问它(以执行每个屏幕元素的更新),从而“堵塞泵”,导致我们看到的效果。
如果以上是原因,有人可以推荐管理/控制窗口消息泵以防止发生这种情况的方法吗?
闪烁是当资源不足时通常会出现的类型,您可以看到单个元素(表单、标签)闪烁并逐渐绘制到屏幕上。
如果有任何建议/想法,请告诉我们。
2个回答

3
每个进程都有自己的消息泵-这不是共享的。
如果您没有看到高CPU利用率,则WPF正在使用硬件渲染,因此可能会出现GPU饱和。您能获取GPU利用率的信息吗?
以下帖子详细介绍了获取GPU利用率的方法: Programmatically fetch GPU utilization

谢谢,我们正在调查这个问题。 - Gaurav Sharma
虽然这不是直接的解决方案,但它引导我们走向了正确的道路(更仔细地查看硬件/软件渲染),因此接受它作为答案。谢谢! - Gaurav Sharma
@Gaurav 我觉得应该是在那个范围内 - 很高兴能帮到你。 :) - Tim Lloyd

3
好的,我认为我们已经找到了原因并进行了修复。简而言之,硬件和软件加速的窗口不兼容。全面使用软件渲染可以修复以前在运行硬件加速窗口时存在的故障。由于我们的传统Win32应用程序很快就会被淘汰,这是一个可行的妥协方案 - 当我们放弃旧应用程序时,我们可以简单地切换回硬件加速。
以下是注意事项:
似乎这个问题是由同时运行传统的软件加速2D应用程序(X)和3D硬件加速WPF应用程序(Y)引起的,这是一个图形驱动程序问题。
强制Y也以WPF软件加速模式运行,对滚动性能几乎没有影响(因为瓶颈仍然是网格的内部布局代码)。
然而,它确实消除了X中的慢绘制问题,因为Y现在正在以软件加速的2D应用程序方式运行,就像交易员机器上的所有其他Windows应用程序一样。这解释了为什么除Y之外的任何应用程序都不会导致减速 - 似乎当同时运行软件和硬件加速的图形应用程序时,它们不兼容。
这是有道理的 - 例如,当我玩硬件加速的游戏时,我曾经看到过类似的情况(在硬件/软件加速模式之间切换时,桌面重新绘制得非常缓慢)。
谢天谢地,我们可以关闭硬件渲染而不会对性能产生太大影响。一旦X被淘汰,我们就可以为Y打开硬件加速,以获得它提供的轻微好处(支持更平滑的动画和更重度的填充渐变等),而不会降低性能。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接