2012-08-25 44 views
2

我需要绘制大约1000行。这些线每秒变化约25次(所以每秒变换25000线)。我可以使用什么来获得可接受的表现?我更喜欢不使用directX调用,因为此软件也需要在默认情况下不具有directX的服务器上运行。.NET GDI +绘图性能

两种不同的方法,我试图做到这一点,但是给了我一个熔化CPU:

设置1 - 标准.NET电话:

  • 双缓冲面板
  • 内存位图绘制(清算和使用Graphics.DrawLine重画线条
  • 将位图复制到具有Graphics.DrawImageUnscaled的面板
  • profiler说这两个图形调用是瓶颈

设置2 - GDI的dllimport的呼叫:

  • 双缓冲面板
  • 与MoveToEx和LineTo等存储器位图从GDI
  • 绘制位图复制到面板的BitBlt
  • 探查说这些非管理呼叫是瓶颈

会性能增加,如果我使用WPF而不是Winforms?或者通过使用directX或第三方库来做到这一点的唯一方法?

干杯

+0

几何尺寸是多少? –

+0

它们具有可变长度,范围介于1和500像素之间。 – BasiK

+0

行数是否固定? –

回答

0

调用开销可能是限制因素。在香草GDI中,有一个PolyPolyline函数可让您在单个调用中绘制多条线。如果你所有的线都连接好了,那么还有一个更简单的功能Polyline。我假设有这些GDI +等价物。我会介绍这些。即使将这些函数所需的数组绑定到您的坐标需要做一些工作,它可能比对单个绘图函数的约1000个调用要快。

+0

我认为[Graphics.DrawLines](http://msdn.microsoft.com/en-us/library/7ewkcdb3.aspx)是等效的。还有其他批处理样式绘图调用:[Graphics.DrawBieziers](http://msdn.microsoft.com/en-us/library/ds101091.aspx),[Graphics.DrawRectanges](http://msdn.microsoft.com/zh-cn/library/default.aspx)。 com/en-us/library/sfth7x55.aspx),[Graphics.FillRectanges](http://msdn.microsoft.com/en-us/library/5c3h7524.aspx)。 –

+0

线路未连接。 – BasiK

+0

@BasiK:使用PolyPolyline,您可以绘制许多断开的线。 –

0

在固定数目的线的情况下:

使用WPF并且一旦添加线的画布。

每次打勾,根据需要更新行的末尾。您也可以更改其他属性。

我想试试这个,因为它是直接使用DirectX的最简单方法。

在任何情况下:在没有像样的硬件的情况下在服务器上进行这么多的图形操作总是会很痛苦。

+0

稍后会试一试,看看会发生什么...... – BasiK

0

我可以给你的唯一建议是,你似乎有直接访问硬件,所以使用标准的双缓冲方法。如果你的硬件支持它,或者只是一个内存队列就像准备好绘制的一系列位图一样,也许可以与多线程结合使用,记住处理器在完成一个IO操作所需的时间内可以执行数千次内存操作(屏幕绘制)。你可以从字面上有一个处理过程,在获得某个“缓冲区大小”(集合大小)之后,获取数据并执行到内存表面的转换(如果需要,则转换为位图),并按顺序继续添加它们以进行泛型集合可以说接下来的5分钟图像可以被编码,以等待更多的收集被该面板的过程消耗掉。然后在面板的OnPaint等价物中,它从堆栈的底部获取一个内存表面,并从集合的底部将当前一个换掉。你可以给线程绘制任务更多的处理优先级,因为另一个线程自然会更快。请记住用不同的线程锁定内存表面集合,以保证线程安全。祝你好运。