与c# /WinForms中大量优化的GDI代码相比,SharpDX有多大的改进?

本文关键字:SharpDX GDI WinForms 优化 代码 | 更新日期: 2023-09-27 17:53:08

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

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

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

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

与c# /WinForms中大量优化的GDI代码相比,SharpDX有多大的改进?

我在一个Windows窗体应用程序中工作,其中的"渲染系统"是可插拔的,我最初写了两个渲染系统:一个用GDI+,一个用Managed DirectX (DirectX的。net包装,类似于SharpDX)。因为我绘制了很多任意比例的图像,所以在我们的用例中,Managed DirectX将GDI+彻底淘汰了。使用1像素宽线的绘图代码在Managed DirectX中也非常快。粗线比单像素线慢得多,因为它们实际上被渲染为三角形条(可以通过GPU快速绘制),其坐标必须由CPU计算,并且几何形状因分段连接而变得复杂(如果我没记错的话,它们是圆形的)。幸运的是,在我们的应用程序中,我们不需要绘制曲线,但这些曲线必须通过小线段(对于单像素宽度)和三角形(对于更粗的任何东西)来近似。

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

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

它收到了很多关于性能的负面报道,特别是当它第一次被引入时,但是如果你把它连接到DXGI交换链(这很容易做到)并保持你的代码明智,好处将是最明显的。

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