猿问

实现具有大量点的图形的最有效方式

我的情况: 我目前正在从事一个项目,该项目绘制来自几台工业机器的大量数据。该项目是一个 Winforms/C# 项目。目前,我正在使用“System.Drawing”命名空间提供的 Graphics 对象中的 DrawLine 方法。当引导超过 500 多个点的图形时,滞后非常明显,甚至导致绘制方法超时。明确地说,我对开发自己的绘图程序感兴趣,不想使用另一个预先存在的程序。

我的观察: 在浏览互联网时,我可以看到如下图所示。我的假设是,即使在下图中绘制了五六个点,在实际数据点之间也必须绘制数百个“中间”点(以获得每个数据点之间的平滑曲线)。像这样的图形在调整大小时非常平滑。

我的问题:

我怎样才能获得这些现代(超级用户友好)图形程序所享受的性能?


holdtom
浏览 210回答 3
3回答

一只甜甜圈

你的问题的答案看似简单。用 GPU 编程实现图形!有几个 GPU 编程库,例如用于 .Net 的Alea GPU。GPU 旨在解决异步问题,例如图形显示。这样做的原因是 GPU 可以使用其数千个线程同时执行独立的任务。由于同时执行的线程数量众多,因此对 GPU 进行编程并非易事,因此您可能需要重新考虑从头开始实现自己的图形应用程序。有趣的事实:您可以使用 GPU 编程来提高许多异步问题的性能,而不仅仅是图形问题。

倚天杖

“酷”图很可能是使用贝塞尔曲线绘制(填充)的,这些曲线由少量所谓的控制点定义。System.Drawing 之类的 API 已针对此类图形基元进行了优化和高效处理,它们只需要很少的函数调用。如果您的曲线不平滑,也许您可以在不丢失细节的情况下丢弃点,但这取决于您的数据。最后的方法可能是编写您自己的渲染算法,该算法利用您的特定数据并通过直接像素访问而不是执行图形调用来生成图像。然后将图像 blit 到显示器上。此选项需要良好的图形渲染知识。
随时随地看视频慕课网APP
我要回答