【发布时间】:2011-06-06 14:04:45
【问题描述】:
我们的记事本软件有旧版 (Win32) 和新版 (WPF),交易者目前正在同时运行它们。但是,运行 WPF 应用程序通常会严重减慢 Win32 应用程序的重绘速度。
在 WPF 应用程序不运行(或最小化)的情况下,Win32 应用程序中的绘制速率是流畅且快速的。随着 WPF 应用程序在其旁边打开,Win32 应用程序的 UI 绘制速度明显减慢。运行 WPF 应用程序似乎会触发使用一些从 Win32 应用程序中带走的资源(两者都需要大量图形)——这似乎会导致速度变慢。
CPU 和内存还没有接近饱和,所以它似乎与这些无关。降低分辨率和/或减少要显示的显示器数量(从而减少视频卡内存使用和带宽负载)没有明显差异,因此这似乎也不是图形硬件性能问题。
一个可以解释原因的假设如下:
在底层,我们知道 WPF 和 Win32 应用程序都将图形信息输出到 Windows“消息泵”,该“消息泵”基本上是一个关于在屏幕上绘制什么的指令队列。似乎当 WPF 应用程序没有运行时,Win32 可以完全不受限制地访问它并且屏幕更新是流畅的。与它一起运行 WPF 应用程序会在此队列上放置额外的消息,因此 Win32 应用程序必须更努力地争夺对它的访问权(以便进行每个屏幕元素更新),因此“堵塞泵”会产生我们看到的效果。
如果是上述情况,谁能推荐管理/控制窗口消息泵的方法以防止这种情况发生?
闪烁是资源不足时通常会出现的类型,您可以看到单个元素(表单、标签)闪烁并逐渐在屏幕上绘制。
如果有人有任何建议/想法,请告诉我们。
【问题讨论】:
标签: wpf windows performance winapi