我有一个具有自定义窗口样式的WPF应用程序(AllowsTransparency="True“WindowStyle="None")。此窗口有一个自定义峰值仪表控件,它使用WriteableBitmap从DirectSound音频输入中提取数据。
我正在使用一个位图,所有的层次都被绘制成彩色矩形(红色/黄色/绿色/红色),当音频到达时,我只是在我的水位计上方画一个黑色矩形。它在我的机器上工作得很好(Windows 7,奔腾4单核)。但在Windows、SP3和集成视频的笔记本电脑上,它的工作效果很差。
我知道透明度效应在DirectX 9中存在一些问题,但我已经阅读了SP3中应该解决的问题。但是,对_writeableBitmap.AddDirtyRect的调用在XP上占用了30-40%的CPU,有时还会导致音频中断(如果使用USB音频,那么这些中断不是发生在我的应用程序中,而是出现在DirectSound<->驱动程序子系统中)。
在Windows7上,相同的应用程序占用的CPU不超过3%,没有注意到音频丢失(但Win7 PC上的CPU实际上比XP笔记本上的CPU要弱)。
我试着不使用AddDirtyRect,只是在图像上用leds绘制一个WPF矩形元素,并在新的音频级别到达时设置矩形的高度。真是个惊喜!以某种方式改变矩形元素的高度比调用_writeableBitmap.AddDirtyRect为100x20像素矩形占用的资源要少得多!现在在XP上,AddDirtyRect只花了10-20%,而不是30-40%。
但是当我从窗口中删除透明效果时,XP (甚至是VirtualBox)最终也下降到了2-6%的CPU。显然,透明性使得重绘20x100矩形非常困难,每秒钟重绘10次。
我可以生活在没有透明度的申请,但问题是-设计使用圆角窗口,我需要切断周围的区域。但是一旦我设置AllowsTransparency="False",窗口就会显示后面的背景色。
因此,主要的问题是-如何使窗口的内容剪裁掉窗口的背景,使角保持圆圆而不使用XP??
我记得,即使在Windows应用程序上,只要设置一个自定义窗口区域,而不使用任何透明度(在Windows98机器上),我也可以这样做。在WPF上能做同样的事情吗?
或者可能有一些技巧可以让WriteableBitmap在XP上使用更少的资源?
发布于 2011-03-06 09:57:07
由于找不到更好的东西,所以我使用了旧的方法: SetWindowRgn API。
这有点复杂,因为我的应用程序使用了一些从主窗口突出的动画幻灯片部分,因此我不得不将WPF动画与SetWindowRgn调用同步,以使幻灯片效果看起来尽可能干净。结果并不理想,但可以接受。最重要的是-没有更高的CPU和没有音频辍学。
https://stackoverflow.com/questions/5192300
复制相似问题