寻找一种比GDI更快的方法来绘制动态数据图

问题描述 投票:2回答:5

我已经使用C ++ / CLI编写了一个简单的基于GDI的数据绘图仪,但它的速度不是特别快(一些基本分析表明问题在于屏幕上的渲染)。

是否有任何方法可以为UserControl启用硬件加速,或者是否有用于Direct3D的.net接口? ...或者还有其他我可以考虑的选择。

我们正在使用托管代码,因此该解决方案实际上需要尽可能与CLI兼容。

[[Edit]如果有帮助,我正在使用Graphics::FillRectangle租用每个2x2像素的矩形带(128个数据点)-也许有更好的方法呢?

.net gdi+ c++-cli direct3d plot
5个回答
5
投票

Managed DirectX已弃用一段时间。您真的不想使用它。相反,您应该使用SlimDX,它是用C ++ / CLI编写的DirectX SDK API的开源互操作层。它比Managed DirectX更好,并且得到了开发人员的专业社区的支持。 (我将很快与他们一起改善DirectWrite支持。)


2
投票

根据我的经验,使用GDI +不会获得足够好的性能。即使是简单的绘图,您也会很快意识到还有很多开销。

替代方案(如您所述)将是Direct3D,或者您可以考虑将常规GDI与系统调用一起使用。显然,这使代码平台具有依赖性,但是速度可能很快。使用它,我取得了很好的效果。

这完全取决于您愿意处理多少复杂性。一旦掌握了基础知识,GDI可能会相对容易一些,Direct3D要复杂一些。尽管Direct3D更具前瞻性。


2
投票

确实,GDI +在性能方面不是很好,但是我自己在与工作有关的项目中编写了GDI +绘图仪,它能够以每秒30个帧的速度在每秒1680x1050的分辨率下吐出带有数千个点的图形(滚动图)。

完成此操作花了很多时间:

  • 在绘制之前将所有内容转换为一个路径。
  • 如果使用后缓冲区,请使用像素格式为Format32bppPArgb的缓冲区,这样可以加快2-4倍的速度。
  • 如果使用垂直线(高频信号)lot绘制路径,则将其作为水平线绘制在后缓冲区上,然后绘制在屏幕上旋转的图像。请注意,绘制旋转图像也需要一定的成本。

我看不到您的方案需要如何进行大量优化,但是128点的数据完全没有。但是,将这些点放在一个GraphicsPath中可能会有所作为,因为这将意味着更少的编组开销。

顺便说一下,我们在这里谈论什么分辨率和帧率?


1
投票

Microsoft现在也有Direct2D,它是硬件加速的2D绘图:

Direct2D是硬件加速的,立即模式2D图形API提供高性能和2D的高质量渲染几何图形,位图和文本。的Direct2D API旨在与GDI,GDI +和Direct3D。

它需要Windows 7 / Server 2008 R2,但是支持已通过Platform Update添加到Vista / Server 2008:


0
投票

我使用 wireless thermo完成重定向数据流入后,正在寻找类似的解决方案EPD用于为我的PC呈现图形文本。我可能会从上面的评论中找到一种可能的方式。

应注意,并非所有2D绘图操作都支持硬件加速,将其打开可能会影响您的某些自定义视图或绘图调用。

© www.soinside.com 2019 - 2024. All rights reserved.