我有一个自定义窗口样式的WPF应用程序(allowsTransparency =“True”WindowStyle =“None”)。该窗口有一个自定义的Peak Meter控件,它使用WriteableBitmap从DirectSound音频输入中提取数据。
我正在使用一个位图,所有级别都绘制为彩色矩形(红色/黄色/绿色/红色),当音频到达时,我只在顶部的水平仪上绘制一个黑色矩形。它在我的机器上运行良好(Windows 7,Pentium 4单核)。但它在配备Windows XP SP3和集成视频的笔记本电脑上运行不佳。
我知道透明效果在DirectX 9上有一些问题,但我已经读过这个问题应该在SP3中修复。仍然调用_writeableBitmap.AddDirtyRect在XP上占用30-40%的CPU,有时它会导致音频丢失(如果使用USB音频,那些丢失不在我的应用程序中,而是在DirectSound&lt; - &gt;驱动子系统中的某处)。< / p>
在Windows 7上,相同的应用程序占用的CPU不超过3%且没有注意到音频丢失(但是Win7 PC上的CPU实际上比使用XP的笔记本电脑更弱)。
我尝试不使用AddDirtyRect,只是在带有leds的Image上绘制一个WPF Rectangle元素,并在新音频级别到达时设置矩形的高度。多么惊喜!以某种方式更改Rectangle元素的高度所需的资源明显少于为100x20像素矩形调用_writeableBitmap.AddDirtyRect!现在在XP上使用AddDirtyRect只花了10-20%而不是30-40%。
但是当我从窗口中删除透明效果时,最终还是XP(甚至在VirtualBox上)下降到了2-6%的CPU。显然透明度使得每秒重绘20x100矩形非常困难。
我的应用程序没有透明度,但问题是 - 设计使用圆角窗口,我需要切断它们周围的区域。但是只要我设置AllowTransparency =“False”,窗口就会显示背后的背景颜色。
所以主要的问题是 - 如何让窗口的内容剪掉窗口的背景,以便角落保持圆形,而不使用XP重的透明度?
我记得我甚至可以通过设置自定义窗口区域而不是使用任何透明度(在Windows 98计算机上)来完成C ++ Windows应用程序。可以在WPF上完成同样的事情吗?
或许有一些技巧可以让WriteableBitmap在XP上使用更少的资源?
答案 0 :(得分:1)
由于我没有找到更好的东西,我使用了旧方法:SetWindowRgn API。
这有点复杂,因为我的应用程序使用了一些从主窗口突出的动画滑出部分,因此我不得不将WPF动画与SetWindowRgn调用同步,以使滑出效果看起来尽可能干净。结果不理想但可以接受。主要的是 - 没有更高的CPU和没有音频丢失。