繁体   English   中英

.NET GDI +绘图性能

[英].NET GDI+ drawing performance

我需要画大约1000条线。 这些线每秒变化约25次(因此,每秒25000条线)。 在执行此操作时我可以使用什么来获得可接受的性能? 我不想使用DirectX调用,因为该软件还需要在默认情况下没有DirectX的服务器上运行。

我尝试使用两种不同的方法来执行此操作,但给了我一个融化的CPU:

Setup1-标准.NET调用:

  • 双缓冲板
  • 在内存位图上绘图(使用Graphics.DrawLine清除和重绘线)
  • 使用Graphics.DrawImageUnscaled将位图复制到面板
  • 探查器说这两个图形调用是瓶颈

Setup2-gdi的dllimport调用:

  • 双缓冲板
  • 使用来自gdi的MoveToEx和LineTo在内存位图上绘图
  • 使用BitBlt将位图复制到面板
  • 分析器说那些不受管理的呼叫是瓶颈

如果我使用WPF代替Winforms,性能会提高吗? 还是使用DirectX或第三方库做到这一点的唯一方法?

干杯

呼叫开销可能是限制因素。 在普通GDI中,有一个PolyPolyline函数,可让您在单个调用中绘制多条线。 如果您的所有线路都已连接,那么还有一个更简单的折线函数。 我认为这些都有GDI +等效项。 我要与那些。 即使需要花费一些精力将坐标捆绑到这些函数所需的数组中,也可能比调用单个线条绘制函数的〜1000次要快。

如果行数固定:

使用WPF并将线条添加到画布一次。

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

我会尝试这样做,因为这是直接使用DirectX的最简单方法。

无论如何:在没有适当硬件的情况下在服务器上进行如此多的图形操作总是很痛苦的。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM