我一直在研究C#/ GDIgraphics应用程序几年。 我花了很多时间来优化绘图代码。 我正在通过使PictureBox控件每秒失效10次,并利用Windows触发它的后续OnPaint事件来绘制屏幕。 OnPaint事件让我可以通过PaintEventArgs参数访问Graphics对象。
每帧:我绘制数百行,数百个矩形,并且我也调用Graphics.DrawString()方法数百次。
我开始组build一个SharpDX项目,希望能够绘制更多的2D元素,并更快地绘制到屏幕上。 我设置了两个testing项目,使用GDI和SharpDX在屏幕上绘制相同的2D元素。 我使用了C#StopWatch对象来检测绘制所有2D元素的时间。 到目前为止,我还没有注意到使用SharpDX进行绘图时速度的提高。 GDI和SharpDX平均每场平均20millis。
使用SharpDX应该能提高多less速度? 光栅化的哪一部分应该比GDI更快?
我曾在一个Windows Forms应用程序中使用“渲染系统”,我最初编写了两个渲染系统:一个在GDI +中,一个在Managed DirectX(一个围绕DirectX的.NET包装,类似于SharpDX)。 因为我正在以任意比例绘制大量图像,所以Managed DirectX将GDI +从我们的用例中排除出水面。 在Managed DirectX中,使用1像素宽的线条的绘制代码也非常快。 粗线比单像素线慢得多,因为它们实际上被渲染为三角形条带(可以由GPU快速绘制),其坐标必须由CPU计算,并且几何形状由于节段关节而变得复杂如果我没记错的话)。 幸运的是,在我们的应用程序中,我们不需要绘制曲线,但是这些必须通过小线段(对于单像素宽度)和三角形(对于任何更厚的)来近似。
这是基于CPU的近似和三角测量,可以减慢Direct3D应用的速度。 3D游戏使用预先计算的网格,并利用GPU上的顶点缓冲区来避免将数据从CPU移动到GPU。 我没有任何数据比较GDI +和DirectX之间的速度,但这些是需要考虑的一些事情。
Direct2D需要一些习惯,但一旦你启动并正常运行,我可以保证你永远不会回头。 我用它来迁移一个基于DirectDraw的非常大的项目,并且使用GDI + Interop,并且看到了巨大的性能提升,以及更好的稳定性和更令人满意的开发体验。
它受到了很多关于性能的负面报道,特别是当它被首次引入时,如果你把它连接到一个DXGI交换链(这很容易做到)并且保持你的代码明智,那么好处将是最清楚的。
SharpDX是正确的选择,在不久的将来它只会变得更快,SSE / SIMD驱动原语即将到来。