2011-03-04 65 views
2

我有一個自定義窗口樣式的WPF應用程序(AllowsTransparency =「True」WindowStyle =「None」)。此窗口具有自定義峯值計量器控件,該控件使用WriteableBitmap從DirectSound音頻輸入中繪製數據。WPF自定義繪圖和透明度 - 如何優化?

我正在使用繪製爲彩色矩形(紅色/黃色/綠色/紅色)的所有級別的位圖,並且當音頻到達時,我只在我的電平表頂部繪製一個黑色矩形。它在我的機器上運行正常(Windows 7,Pentium 4單核)。但是它在配備Windows XP SP3和集成視頻的筆記本電腦上效果不佳。

我知道透明度效果在DirectX 9上有一些問題,但我已經讀過這個問題應該在SP3中修復。仍然調用_writeableBitmap.AddDirtyRect在XP上需要30-40%的CPU,有時它會導致音頻丟失(如果使用USB音頻,並且這些丟失不是在我的應用程序中,而是在DirectSound < - > drivers子系統中的某處)。

在Windows 7上,同一個應用程序不會超過3%的CPU,並且沒有發現音頻丟失(但是Win7 PC上的CPU實際上比XP上的筆記本電腦更弱)。

我試過不使用AddDirtyRect,只是在圖像上用leds繪製一個WPF Rectangle元素,並在新的音頻級別到達時設置矩形的高度。真是一個驚喜!以某種方式改變Rectangle元素的高度需要的資源比爲100x20像素矩形調用_writeableBitmap.AddDirtyRect要少得多!現在在XP上只用了10-20%,而不是用AddDirtyRect的30-40%。

但是,當我從窗口中刪除透明度效果,最後還XP(甚至在VirtualBox)下降到2-6%的CPU。顯然,透明度使得每秒重繪20x100矩形十次真的很困難。

我可以在我的應用程序中沒有透明地生活,但問題是 - 設計使用圓角窗口,我需要切斷它們周圍的區域。但只要我設置AllowsTransparency =「False」,窗口就會顯示背後的背景顏色。

所以主要的問題是 - 我如何讓窗口的內容去掉窗口的背景,以便在不使用XP的透明度的情況下保持圓角?

我記得我甚至可以通過設置自定義窗口區域而不是使用任何透明(即在Windows 98機器上)的C++ Windows應用程序。在WPF上可以做同樣的事情嗎?

或者也許有一些技巧如何讓WriteableBitmap在XP上使用更少的資源?

回答

1

因爲我沒有找到更好的東西,所以我使用了舊的方式:SetWindowRgn API。

這有點複雜,因爲我的應用程序使用了一些超出主窗口的動畫滑出部分,所以我不得不將WPF動畫與SetWindowRgn調用同步,以使得滑出效果看起來儘可能乾淨。結果並不理想,但可以接受。主要的是 - 沒有更高的CPU和沒有音頻丟失。