C#WinForms – 任何人都知道C#GDI库而不是SLOW GDI +

GDI +非常慢,几乎完全是软件,而GDI是高度硬件加速的。 GDI +是Graphics类在WinForms上使用的,它太慢了。

有没有人创建.NET GDI库,所以我们可以有速度?

[编辑]很多人都在推荐OpenGL / DirectX。 我的要求是客户端兼容性,尤其是远程桌面。 AFAIK远程桌面不支持开箱即用的OGL / DirectX。[/ EDIT]

GDI +中的文本呈现比GDI慢。 Microsoft在.NET 1.1之后实现了这一点。

这就是.NET 2.0包含一个包装GDI DrawText的新TextRenderer类的原因。 它有两种静态方法:

  • TextRenderer.MeasureText
  • TextRenderer.DrawText

在.NET 2.0中,所有WinForm控件都转换为使用TextRenderer ,而不是:

  • Graphics.MeasureString
  • Graphics.DrawString

(如果您关闭 UseCompatibleTextRendering


在GDI +中绘制Bitmap也很慢,这就是使用CachedBitmap 。 它非常迅速。

CachedBitmap对象以优化的格式存储位图,以便在特定设备上显示。 要显示缓存的位图,请调用Graphics :: DrawCachedBitmap方法。

 graphics.DrawCachedBitmap(bitmap, 0, 0); 

也可以看看

  • MSDN:使用缓存位图来提高性能
  • MSDN:CachedBitmap类

你看过SlimDX了吗? 它有一个围绕Direct2D的托管包装器,它是一个完全硬件加速的2d API,并且与传统的GDI混合得很好。

编辑:

我还发现这个库你可能会感兴趣: SharpDX

“SharpDX旨在用作替代托管DirectX框架.API是从DirectX SDK头自动生成的,具有AnyCpu目标,这意味着您可以在x86和x64平台上运行应用程序,而无需重新编译项目或将程序集安装到GAC.SharpDX也是最快的Managed-DirectX实现。“

这也支持Direct2D。

Microsoft API代码包 (2010年2月存档)提供了从托管语言调用DirectX API的示例。

你可以在Nuget上获得WindowsAPICodePack-DirectX。

您可以尝试转移到WPF。
我是这样做的,因为WinForms画得很慢。
过渡非常困难 ,特别是像我这样的老式代码。

但WinForms不能在启动速度和RAM下击败。
WPF启动缓慢并占用大量RAM。

如果您的应用程序是跨平台的,我建议使用OpenTK ,它是OpenGL的托管包装器,并且通常比DirectX(托管或本机)更容易学习。 OpenTK / OpenGL也倾向于提供比DirectX更好的性能。 使用OpenTK,您可以完全在GPU上绘制图像,然后将其栅格化为位图,该位图可以与System.Drawing中的Bitmap类互操作。