wpf绘图效率问题

灰背鲸 2018-02-01 04:10:27
在写一个绘图板应用,使用一个Canvas当作容器,里面是绘图的内容,绝大部分是线,手写线
我现在的结构式这样的:Canvas1作为最终的容器
Canvas2作为临时容器,我现在这里画出一个线,然后加入到Canvas1中
现在的问题是,当线很多的时候,在Canvas2中绘画就会很卡,如图所示,但是在绿色区域绘画的话就很流畅,经过有很多线的复杂区域就会很卡,我试过drawingvisual绘画,自定义shape,结果都是一样的,shape反而效果好一点,给我的感觉是,当我在Canvas2上面绘制的时候,整个界面都在刷新所以卡顿;
求解,如何做才能不管canvas1中有多少内容,Canvas2中绘图都非常流畅?
...全文
746 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
灰背鲸 2018-05-29
  • 打赏
  • 举报
回复
引用 13 楼 ylly11111 的回复:
可以做成对象的形式,像曲线可以做成很多点的坐标,圆形和椭圆形啥的在wpf中都是对象
都是对象,继承了element
灰背鲸 2018-05-29
  • 打赏
  • 举报
回复
引用 10 楼 duanzi_peng 的回复:
一个Canvas,相当流畅。 别用Line ,用Polyline。
解决了,把canvas换成了inkcanvas,实在是不理解个中缘由,也找不到相关资料怎么让同一个窗口的中的空间能在互不干扰的不同线程下更新。因为还存在毛笔等特殊类型画笔,像毛笔的笔迹是绘制起来非常耗资源,所以没有办法每次重新绘制。
灰背鲸 2018-05-29
  • 打赏
  • 举报
回复
引用 12 楼 bluk44444 的回复:
能不能使用InkCanvas
后来我突发奇想,把最上层的canvas换成了inkcanvas,确实不怎么卡顿了
ylly11111 2018-05-23
  • 打赏
  • 举报
回复
可以做成对象的形式,像曲线可以做成很多点的坐标,圆形和椭圆形啥的在wpf中都是对象
bluk44444 2018-05-21
  • 打赏
  • 举报
回复
能不能使用InkCanvas
阿迷三点半 2018-05-18
  • 打赏
  • 举报
回复
能不能使用InkCanvas
exception92 2018-02-23
  • 打赏
  • 举报
回复
一个Canvas,相当流畅。 别用Line ,用Polyline。
exception92 2018-02-02
  • 打赏
  • 举报
回复
Canvas2作为临时容器,我现在这里画出一个线,然后加入到Canvas1中 -》drawingvisual 是最轻量级的绘图方式。反而为什么要搞一个Canvas2作为临时容器?放一个Canvas就行了,即使是线条覆盖了也不会有卡顿。
灰背鲸 2018-02-02
  • 打赏
  • 举报
回复
就是这样,可以看到在绿色区域是很流畅的,但是经过中间区域就会发现没那么细腻了
灰背鲸 2018-02-02
  • 打赏
  • 举报
回复
引用 7 楼 duanzi_peng 的回复:
不需要刷新整个canvas,你画完之后添加到它的children,至于位置是需要获取的。 下边的效果是用Line对象做的,不过线的粗细,颜色是可以控制的,不存在卡的情况。
感谢你的回复。 倒不是我主动去刷新整个canvas,我现在是自定义shape,然后添加到canvas.children中,这里有个现象就是,当线贼多和相互重叠的时候,你在重叠的地方继续添加Line的时候会觉得明显不如在空白地方快速流畅。 建议你可以把线的宽度设置为30,多画几十个叠加的,然后效果就明显能感觉到了,不叠加的话,确实是很流畅的
exception92 2018-02-02
  • 打赏
  • 举报
回复
不需要刷新整个canvas,你画完之后添加到它的children,至于位置是需要获取的。
下边的效果是用Line对象做的,不过线的粗细,颜色是可以控制的,不存在卡的情况。

灰背鲸 2018-02-02
  • 打赏
  • 举报
回复
引用 4 楼 duanzi_peng 的回复:
Canvas2作为临时容器,我现在这里画出一个线,然后加入到Canvas1中 -》drawingvisual 是最轻量级的绘图方式。反而为什么要搞一个Canvas2作为临时容器?放一个Canvas就行了,即使是线条覆盖了也不会有卡顿。
两个canvas的初衷是模仿inkcanvas,一个作为手写的时候呈现,一个作为最终呈现,实际上测试发现inkcanvas在这种情况下也会出现明显的卡顿,当然我说的卡顿是指获取mousemove的点时间间隔变长,不是卡住界面什么的。所以我就很好奇,是不是存在什么方式不用刷新整个canvas1里面的所有内容。
灰背鲸 2018-02-02
  • 打赏
  • 举报
回复
引用 4 楼 duanzi_peng 的回复:
Canvas2作为临时容器,我现在这里画出一个线,然后加入到Canvas1中 -》drawingvisual 是最轻量级的绘图方式。反而为什么要搞一个Canvas2作为临时容器?放一个Canvas就行了,即使是线条覆盖了也不会有卡顿。
drawingvisual虽然是最轻量级的绘图方式,但是实际应用的时候,甚至比自定义shape都卡,我一开始确实是使用的drawingvisual,但是在像上图那样添加的drawingvisual较多时,手写绘画的时候就会产生明显的卡顿,而且确实是覆盖的地方卡顿,空白的地方是不会的
灰背鲸 2018-02-01
  • 打赏
  • 举报
回复
上错图了
灰背鲸 2018-02-01
  • 打赏
  • 举报
回复

比如这样就属于比较复杂的,很多条线叠加在一起,重新在Canvas2上面画线的时候经过这个区域就会很卡
灰背鲸 2018-02-01
  • 打赏
  • 举报
回复
因为要处理一些其他场景需求所以不能使用winform技术的技术,只能使用wpf,也没使用gdi+

8,736

社区成员

发帖
与我相关
我的任务
社区描述
WPF/Silverlight相关讨论
社区管理员
  • WPF/Silverlight社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧