Gif*_*guy 12 wpf performance rendering graph vector
一个简单的XY线图:X轴代表可能的评级百分比的完整范围,从一端的0%到另一端的100%.具体而言,X值将代表我们的评级截止值,或者交易在不再可接受之前可以具有的最低评级.Y轴将显示从0到已通过的事务总数的值.Y值将表示评级大于当前X值(或大于或等于当前X值的交易总数,我尚未确定).首次绘制此图形时,不会发生任何事务,因此图形将从"y = 0x"开始.
假设第一笔交易通过,评级为40%.交易评级表明,如果我们的评级截止值小于40%,则此交易是可以接受的.(...或者小于或等于40%.再次,我还没有决定).
首先,Y轴将重新缩放以显示0-1的范围(因为1是事务总数).然后该行将被修改以指示0 = 40或更多的交易是可接受的,并且该交易在x = 40或更少时是可接受的.这很容易在WPF中完成,只需在线路上添加两个点 - 一个在(40,0),另一个在(40,1) - 然后将线的左端点移动到(0,1).该行的右端点将保持为(100,0).然后可以对第二个事务重复此过程,依此类推.
问题是我们将处理六位数的交易.我想确保我在最大程度上使用WPF的硬件加速矢量绘图功能,以确保图形不会滞后或冻结程序的其余部分,因为它试图将300,000个点渲染到单个线路径上.或者WPF应该能够在心跳中处理这样的数字?我需要找到一种方法来实现这个图,而不会使应用程序停止运行.我相信WPF的矢量绘图平台将提供一个解决方案,但我不知道如何利用WPF来确定我正在充分利用WPF的高性能渲染功能.
cpl*_*tts 12
我只是偶然发现了这篇文章并且正在构建一个线图控件,我需要非常高效,因为我们会以实时方式更新线路上的点.
如果性能和数量的视觉(S)是你所追求的... 我怀疑你会找到一个更好的性能比的方法直接针对WPF的可视化编程层(链接:1,2).我使用这种方法的初步结果非常积极.
这将比覆盖OnRender更加高效,因为它会鼓励您利用WPF的保留模式绘制子系统(其中所有绘图指令都被缓存).
也就是说,如果您需要更新的是线上的一个点,那么更新该点将强制Visual行更新,但不会强制图的其余部分(轴,网格线......)更新.因为它们的绘图说明被保留并将被重复使用(因为它们没有更新).
Matthew MacDonald 在C#2008中的Pro WPF中的第14章有一个很棒的部分(标题为'Visuals'),针对WPF的Visual层进行编程.WPF控件开发的第2章Unleashed也有第13页的部分,他讨论了DrawingVisual方法如何适用于图表组件.最后,Charles Petzold撰写了一篇 MSDN杂志文章,其中散点图的最佳整体解决方案是DrawingVisual方法.
(现在,我知道你的问题提到轴也将更新......所以我的答案实际上是针对一般情况......但我仍然认为这种方法将是最高效的......因为只有事情需要更新...将更新.)
Ana*_*tts 11
如果你想要它快,最好的方法是从Control派生并实现OnRender - 通常这不是必需的,但对于你的应用程序它可能是.
另外,让我们退后一步 - 你渲染的屏幕肯定不是300k像素; 在你进行渲染之前,通过将n个节点平均为一个节点来减少缓冲区,直到你有更接近实际设备的分辨率,然后在屏幕上绘制它.