Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
WPF自定义绘图和透明度-如何优化?_Wpf_Performance_Drawing_Transparency - Fatal编程技术网

WPF自定义绘图和透明度-如何优化?

WPF自定义绘图和透明度-如何优化?,wpf,performance,drawing,transparency,Wpf,Performance,Drawing,Transparency,我有一个具有自定义windows样式的WPF应用程序(allowTransparency=“True”WindowStyle=“None”)。此窗口有一个自定义峰值计控件,该控件使用WriteableBitmap从DirectSound音频输入绘制数据 我正在使用一个位图,所有级别都绘制为彩色矩形(红色/黄色/绿色/红色),当音频到达时,我只在我的级别表顶部绘制一个黑色矩形。它在我的机器(Windows7、奔腾4单核)上运行良好。但它在装有WindowsXPSP3和集成视频的笔记本电脑上效果不佳

我有一个具有自定义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上可以做同样的事情吗


或者可能有一些技巧如何使WriteableBitmap在XP上使用更少的资源?

因为我没有找到更好的方法,所以我使用了旧方法:SetWindowRgn API

这有点复杂,因为我的应用程序使用了一些突出主窗口的动画滑出部分,所以我必须将WPF动画与SetWindowRgn调用同步,以使滑出效果看起来尽可能干净。结果并不理想,但可以接受。最重要的是,没有更多的高CPU和音频丢失