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

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

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

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

有帮助吗?

解决方案

托管DirectX已弃用了一段时间。你真的不希望使用。相反,你应该使用 SlimDX 这是写在C ++ / CLI中的DirectX SDK API的一个开放源代码的互操作层。它比托管DirectX更好,是由开发商的专家社区的支持。 (我将要努力提高很快与他们的DirectWrite支持。)

其他提示

这是我的经验,你不会得到足够好的性能了使用GDI +的。即使是简单的绘图,你很快就会意识到,有一个很大的开销。

替代办法(如你所提到的)是Direct3D的,或者你可以考虑定期 GDI与系统调用。这显然使代码平台相关的,但它可以是相当快的。我已经使用了良好的效果。

这一切都取决于你是多么的复杂性很愿意处理。 GDI可以相对容易,一旦你计算出的基本知识,Direct3D是更复杂一点。虽然Direct3D是更未来的证明。

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

为了达到这个目的,需要进行大量的调整:

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

我看不出你的场景需要大量优化,128 点数据根本不算什么。将这些点合二为一 图形路径 但可能会有所不同,因为这意味着更少的编组开销。

顺便问一下,我们在这里讨论的分辨率和帧速率是多少?

微软现在也有 直接二维, ,这是硬件加速的 2D 绘图:

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top