WPF 關於繪圖個人總結


內容均為個人總結。

如果錯誤請告知,並多多見諒。

總的來說繪圖是分為兩個范圍,一是形狀,二是像素填充。

形狀也就是繪制矩形,圓形,復雜組合形狀。

像素填充例如圖像填充,但更多是位圖操作,同樣也是可以繪制形狀,不過對於形狀的填充算法相對很難,是需要獨立進行計算。

在WPF中,對應着分為控件繪圖,位圖操作。

對於簡單的繪圖我也不多加復述,通常一般的難點,也就是復雜性繪圖,大規模繪圖等。

一般呢,對於有形狀繪圖有一下方案

1 直接重載OnRender方法並在內使用DrawingContext進行繪圖

2 劫持承載控件,並創建繼承DrawingVisual控件,並使用RenderOpen方法進行繪制

3 使用GDI+繪圖並配合Bitmap后使用DrawingContext后經行繪圖

通常,方法1,可能使用范圍過小,方法3呢效果不錯,但是放大后效果不好。

所以我們重點說一下方法2

使用方法很簡單,主要是里面繪制的方法。

最好的辦法就是使用DrawGeometry。

但是問題是是提交多個控件繪圖對應內容呢? 還是提交一次后內部多次繪制呢?

舉例來說,我之前發的矩形格子,使用的是多次提交,每次提交少量繪制,當繪制大量內容后意味大量提交,大量繪制,雖然單次繪圖很快基本0.2毫秒,但架不住多啊,也就造成卡頓。

所以正確的方法應該是少量提交,內部多次繪制,減少不必要卡頓。

其次,繪圖的方式最好使用streamgeometry,這是真的快。並使用線性背景色,不過使用ImageBrush會是更好的選擇。

例圖 2*2像素的格子,大小是1920*1010,使用的是ImageBrush。同時畫筆凍結等方式,性能也會提交。

一般情況下,大部分是繪制圖表等方式,性能不行其實是可以通過一些方式避免,例如對數據進行處理,歸一化,抽樣等方式,將繪制的東西減少。

還有說的,就是位圖。

一般情況下,WPF2D繪圖最快的就是可寫位圖,真的是快,不論大小,內容還是對顏色上的控制,相對快很多,但是缺點是什么? 是放大后,是需要重新對局部處理。這又是一些其他的開銷。

2D繪圖的使用效果一般很夠用了。

使用順序可以用是 控件繪制-可寫位圖,如果這些效果還不好,那就上大招D3Image,因為前面的繪制的東西,使用顯卡效率不高。D3Image是直接Dx所以會高很多。所以效果很好。

 

相關代碼下載【沒有位圖操作,D3Image等內容,具體使用相對不難,而找到具體使用差距才是本意,后續會補充】

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM