2

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

有什么方法可以为 UserControl 启用硬件加速,或者是否有用于 direct3D 的 .net 接口?...或者我可以考虑其他一些选择。

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

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

4

5 回答 5

5

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

于 2009-07-17T02:01:08.820 回答
2

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

替代方案(如您所提到的)是 Direct3D,或者您可以考虑使用带有系统调用的常规GDI 。这显然使代码平台依赖,但它可以非常快。我使用它取得了很好的效果。

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

于 2009-07-02T14:50:20.587 回答
2

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

为了实现这一点,需要进行大量调整:

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

不过,我看不出您的场景需要大量优化,128 个数据点不算什么。不过,将这些点放入一个GraphicsPath可能会有所作为,因为这意味着更少的编组开销。

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

于 2009-08-07T07:56:25.723 回答
1

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

Direct2D 是一种硬件加速的即时模式二维图形 API,可为二维几何图形、位图和文本提供高性能和高质量的渲染。Direct2D API 旨在与 GDI、GDI+ 和 Direct3D 进行良好的互操作。

它需要 Windows 7/Server 2008 R2,但已通过平台更新将支持添加到 Vista/Server 2008 :

于 2010-01-20T18:04:59.280 回答
1

当我使用无线热 EPD 为我的 PC 渲染图形文本完成重定向数据流入时,我正在寻找类似的解决方案。我可能会找到一种方法来从上面的评论中找出可能的方法。

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

于 2020-03-15T09:07:57.320 回答