內容均爲我的總結。算法
若是錯誤請告知,並多多見諒。性能
總的來講繪圖是分爲兩個範圍,一是形狀,二是像素填充。blog
形狀也就是繪製矩形,圓形,複雜組合形狀。繼承
像素填充例如圖像填充,但更可能是位圖操做,一樣也是能夠繪製形狀,不過對於形狀的填充算法相對很難,是須要獨立進行計算。ip
在WPF中,對應着分爲控件繪圖,位圖操做。get
對於簡單的繪圖我也很少加複述,一般通常的難點,也就是複雜性繪圖,大規模繪圖等。it
通常呢,對於有形狀繪圖有一下方案效率
1 直接重載OnRender方法並在內使用DrawingContext進行繪圖stream
2 劫持承載控件,並建立繼承DrawingVisual控件,並使用RenderOpen方法進行繪製file
3 使用GDI+繪圖並配合Bitmap後使用DrawingContext後經行繪圖
一般,方法1,可能使用範圍太小,方法3呢效果不錯,可是放大後效果很差。
因此咱們重點說一下方法2
使用方法很簡單,主要是裏面繪製的方法。
最好的辦法就是使用DrawGeometry。
可是問題是是提交多個控件繪圖對應內容呢? 仍是提交一次後內部屢次繪製呢?
舉例來講,我以前發的矩形格子,使用的是屢次提交,每次提交少許繪製,當繪製大量內容後意味大量提交,大量繪製,雖然單次繪圖很快基本0.2毫秒,但架不住多啊,也就形成卡頓。
因此正確的方法應該是少許提交,內部屢次繪製,減小沒必要要卡頓。
其次,繪圖的方式最好使用streamgeometry,這是真的快。並使用線性背景色,不過使用ImageBrush會是更好的選擇。
例圖 2*2像素的格子,大小是1920*1010,使用的是ImageBrush。同時畫筆凍結等方式,性能也會提交。
通常狀況下,大部分是繪製圖表等方式,性能不行實際上是能夠經過一些方式避免,例如對數據進行處理,歸一化,抽樣等方式,將繪製的東西減小。
還有說的,就是位圖。
通常狀況下,WPF2D繪圖最快的就是可寫位圖,真的是快,不論大小,內容仍是對顏色上的控制,相對快不少,可是缺點是什麼? 是放大後,是須要從新對局部處理。這又是一些其餘的開銷。
2D繪圖的使用效果通常很夠用了。
使用順序能夠用是 控件繪製-可寫位圖,若是這些效果還很差,那就上大招D3Image,由於前面的繪製的東西,使用顯卡效率不高。D3Image是直接Dx因此會高不少。因此效果很好。
相關代碼下載【沒有位圖操做,D3Image等內容,具體使用相對不難,而找到具體使用差距纔是本意,後續會補充】