WPF 关于绘图我的总结

内容均为我的总结。算法

若是错误请告知,并多多见谅。性能

总的来讲绘图是分为两个范围,一是形状,二是像素填充。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等内容,具体使用相对不难,而找到具体使用差距才是本意,后续会补充】