我可以期待SharpDX在C#/ WinForms中对经过大量优化的GDI代码有多大改进?

时间:2015-06-02 21:11:18

标签: c# windows winforms gdi sharpdx

我已经在C#/ GDI图形应用程序上工作了几年。我花了很多时间优化绘图代码。我通过使PictureBox控件每秒大约10次无效并通过利用Windows触发它时发生的后续OnPaint事件来绘制到屏幕上。 OnPaint事件使我可以通过PaintEventArgs参数访问Graphics对象。

每帧:我绘制了数百行,数百个矩形,并且我也调用了Graphics.DrawString()方法数百次。

我开始整理一个SharpDX项目,希望我可以绘制更多的2D元素,并更快地绘制到屏幕上。我设置了2个测试项目,使用GDI和SharpDX在屏幕上绘制相同的2D元素。我使用C#StopWatch对象来检测绘制所有2D元素所花费的时间。到目前为止,在使用SharpDX绘图时,我没有注意到任何速度提升。 GDI和SharpDX平均每次平均约为20万。

使用SharpDX我应该期望多少速度提升?光栅化的哪一部分应该比GDI更快?

2 个答案:

答案 0 :(得分:1)

我在Windows Forms应用程序上工作,其中“渲染系统”是可插拔的,我最初编写了两个渲染系统:一个在GDI +中,另一个在Managed DirectX中(一个围绕DirectX的.NET包装器,类似于SharpDX)。因为我在任意比例下进行了大量的图像绘制,所以Managed DirectX将GDI +从水中吹出来用于我们的用例。在Managed DirectX中,使用1像素宽线的绘图代码也非常快。粗线比单像素线慢得多,因为它们实际上被渲染为三角形条(可以由GPU快速绘制),其坐标必须由CPU计算,并且几何形状因段关节而复杂化(四舍五入,如果我没记错的话)。幸运的是,在我们的应用程序中,我们不需要绘制曲线,但是必须用小线段(对于单像素宽度)和三角形(对于任何更粗的)来近似。

基于CPU的近似和三角测量等降低了Direct3D应用程序的速度。 3D游戏使用预先计算的网格并利用GPU上的顶点缓冲区来避免数据从CPU到GPU的来回移动。我没有比较GDI +和DirectX之间的速度的数据,但这些是需要考虑的事情。

答案 1 :(得分:1)

Direct2D需要一点时间的习惯,但是一旦你正常运行并且正常运行,我可以保证你永远不会回头。我使用它来迁移一个基于DirectDraw和GDI + Interop的大型项目,并且看到了巨大的性能提升以及更好的稳定性和更令人满意的开发体验。

它已经收到很多关于性能的负面新闻,特别是当它首次推出时,如果你把它连接到DXGI交换链(这很容易做到)并保持你的代码合理,其好处将是最大的明确。

SharpDX是正确的选择,它将在不久的将来变得更快,SSE / SIMD驱动的原语即将到来。