寻找比GDI更快的解决方案来渲染动态数据图

时间:2009-07-02 14:43:46

标签: .net gdi+ c++-cli direct3d plot

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

有没有办法为UserControl启用硬件加速,还是有针对direct3D的.net接口? ......还是有其他一些我可以考虑的选择。

我们正在使用托管代码,因此如果可能的话,解决方案确实需要与CLI兼容。

[编辑] 如果它有帮助,我正在使用Graphics::FillRectangle渲染每个2x2像素的矩形条(128个数据点) - 也许有更好的方法可以做到这一点?

5 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:2)

根据我的经验,使用GDI +将无法获得足够好的性能。即使是简单的绘图,你也会很快发现它有很多开销。

备选方案(如您所述)是Direct3D,或者您可以考虑使用系统调用定期GDI。这显然使代码平台依赖,但它可以非常快。我用它做了很好的结果。

这一切都取决于你愿意处理的复杂程度。一旦你弄清楚基础知识,GDI就相对容易了,Direct3D有点复杂。虽然Direct3D更具未来性。

答案 2 :(得分:2)

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

为实现这一目标需要进行大量调整:

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

我无法看到你的场景如何需要大量的优化,128点的数据什么都不是。将这些点放入一个GraphicsPath可能会有所不同,因为这意味着更少的编组开销。

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

答案 3 :(得分:1)

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

  

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

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

答案 4 :(得分:1)

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

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