WPF自定义绘图和透明度-如何优化?
我有一个具有自定义windows样式的WPF应用程序(allowTransparency=“True”WindowStyle=“None”)。此窗口有一个自定义峰值计控件,该控件使用WriteableBitmap从DirectSound音频输入绘制数据 我正在使用一个位图,所有级别都绘制为彩色矩形(红色/黄色/绿色/红色),当音频到达时,我只在我的级别表顶部绘制一个黑色矩形。它在我的机器(Windows7、奔腾4单核)上运行良好。但它在装有WindowsXPSP3和集成视频的笔记本电脑上效果不佳 我知道DirectX 9上的透明效果有一些问题,但我已经阅读了SP3中应该解决的问题。尽管如此,对_writeableBitmap.AddDirtyRect的调用在XP上占用了30-40%的CPU,有时还会导致音频中的丢失(如果使用USB音频,这些丢失不是发生在我的应用程序中,而是发生在DirectSounddrivers子系统的某个地方) 在Windows 7上,同一个应用程序占用的CPU不超过3%,并且没有注意到音频丢失(但Win7 PC上的CPU实际上比XP笔记本电脑上的CPU弱) 我试图不使用AddDirtyRect,而只是在带有LED的图像上绘制一个WPF矩形元素,并在新音频级别到达时设置矩形的高度。真是个惊喜!以某种方式更改矩形元素的高度比为100x20像素矩形调用_writeableBitmap.AddDirtyRect占用的资源要少得多!现在在XP上,它只需要10-20%,而不是AddDirtyRect的30-40% 但当我从窗口中删除透明效果时,XP(甚至在VirtualBox上)的CPU最终也下降到了2-6%。显然,透明度使得每秒重画10次20x100矩形变得非常困难 我可以在我的应用程序没有透明度的情况下生活,但问题是-设计使用圆角窗口,我需要切断它们周围的区域。但只要我设置AllowTransparency=“False”,窗口就会显示后面的背景色 因此,主要问题是-如何使窗口内容剪掉窗口背景,使角落保持圆形而不使用XP高透明度? 我记得我可以通过设置一个自定义窗口区域而不使用任何透明性(在Windows 98机器上),甚至可以在C++窗口应用程序上做。在WPF上可以做同样的事情吗WPF自定义绘图和透明度-如何优化?,wpf,performance,drawing,transparency,Wpf,Performance,Drawing,Transparency,我有一个具有自定义windows样式的WPF应用程序(allowTransparency=“True”WindowStyle=“None”)。此窗口有一个自定义峰值计控件,该控件使用WriteableBitmap从DirectSound音频输入绘制数据 我正在使用一个位图,所有级别都绘制为彩色矩形(红色/黄色/绿色/红色),当音频到达时,我只在我的级别表顶部绘制一个黑色矩形。它在我的机器(Windows7、奔腾4单核)上运行良好。但它在装有WindowsXPSP3和集成视频的笔记本电脑上效果不佳
或者可能有一些技巧如何使WriteableBitmap在XP上使用更少的资源?因为我没有找到更好的方法,所以我使用了旧方法:SetWindowRgn API 这有点复杂,因为我的应用程序使用了一些突出主窗口的动画滑出部分,所以我必须将WPF动画与SetWindowRgn调用同步,以使滑出效果看起来尽可能干净。结果并不理想,但可以接受。最重要的是,没有更多的高CPU和音频丢失