与 C#/WinForms 中高度优化的 GDI 代码相比,SharpDX 能带来多少改进?
How much improvement can I expect with SharpDX over heavily optimized GDI code in C#/WinForms?
几年来我一直在开发 C#/GDI 图形应用程序。我花了很多时间优化绘图代码。我通过每秒大约 10 次使 PictureBox 控件无效并利用 Windows 触发它时发生的后续 OnPaint 事件来绘制到屏幕。 OnPaint 事件使我可以通过 PaintEventArgs 参数访问 Graphics 对象。
每帧:我画了数百条线,数百个矩形,我也调用了数百次 Graphics.DrawString() 方法。
我开始整理一个 SharpDX 项目,希望我可以绘制更多 2D 元素,并更快地绘制到屏幕上。我设置了 2 个测试项目,使用 GDI 和 SharpDX 在屏幕上绘制相同的 2D 元素。我使用 C# StopWatch 对象来检测绘制所有 2D 元素所花费的时间。到目前为止,我没有注意到使用 SharpDX 绘图时速度有任何提高。 GDI 和 SharpDX 平均每次绘制大约 20 毫秒。
我希望使用 SharpDX 可以提高多少速度?光栅化的哪一部分应该比 GDI 更快?
我开发了一个 Windows 表单应用程序,其中 "rendering system" 是可插入的,我最初编写了两个渲染系统:一个在 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 驱动原语指日可待。
几年来我一直在开发 C#/GDI 图形应用程序。我花了很多时间优化绘图代码。我通过每秒大约 10 次使 PictureBox 控件无效并利用 Windows 触发它时发生的后续 OnPaint 事件来绘制到屏幕。 OnPaint 事件使我可以通过 PaintEventArgs 参数访问 Graphics 对象。
每帧:我画了数百条线,数百个矩形,我也调用了数百次 Graphics.DrawString() 方法。
我开始整理一个 SharpDX 项目,希望我可以绘制更多 2D 元素,并更快地绘制到屏幕上。我设置了 2 个测试项目,使用 GDI 和 SharpDX 在屏幕上绘制相同的 2D 元素。我使用 C# StopWatch 对象来检测绘制所有 2D 元素所花费的时间。到目前为止,我没有注意到使用 SharpDX 绘图时速度有任何提高。 GDI 和 SharpDX 平均每次绘制大约 20 毫秒。
我希望使用 SharpDX 可以提高多少速度?光栅化的哪一部分应该比 GDI 更快?
我开发了一个 Windows 表单应用程序,其中 "rendering system" 是可插入的,我最初编写了两个渲染系统:一个在 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 驱动原语指日可待。