C# WinForms - 有没有C# GDI库不会像SLOW GDI+那样慢?

17

GDI+非常缓慢,几乎完全是软件渲染,而GDI高度硬件加速。

GDI+是Graphics类在WinForms上使用的内容,它太慢了。

有人制作了一个.NET GDI库,这样我们就可以获得更快的速度吗?

[编辑] 许多人推荐OpenGL / DirectX。我要求客户端兼容性,特别是远程桌面。据我所知,远程桌面不能直接支持OGL / DirectX。 [/编辑]


2
GDI+利用GDI。如果您需要直接使用GDI,请使用C或C++。 - Michael Todd
6
你是想做什么让GDI+占用这么多时间?我一直觉得它很快,除了在绘制位图时可能会慢一些,此时你可以使用PInvoke BitBlt。 - Paul Sasik
3
你能否更具体地说明GDI的哪些部分正在拖慢你的速度? - Brandon Moretz
@Paul Sasik:是的,如果你需要直接访问内存中的图像,只需调用LockBits并获取指针即可。 - Ed S.
具体来说,我正在绘制网格和可能的图表(用于金融系统)。典型的客户端有4个监视器,我的许多窗口都在他们的2-4个监视器上全屏显示。 - Joe
5个回答

27

GDI+中的文本渲染速度比GDI慢。微软在.NET 1.1之后意识到了这一点。

这就是为什么.NET 2.0包含了一个新的TextRenderer类,它封装了GDI DrawText。它有两个静态方法:

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

  • Graphics.MeasureString
  • Graphics.DrawString

(前提是你关闭了UseCompatibleTextRendering)


在GDI+中绘制位图也很慢,这就是为什么要使用CachedBitmap。它绘制非常快。

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

graphics.DrawCachedBitmap(bitmap, 0, 0);

参见


一些人在这里:https://dev59.com/gXVD5IYBdhLWcg3wJIEK 说TextRenderer在Vista+上速度较慢。你的经验怎么说?我只关心Vista/7/+。 - Joe
微软的Chris Jackson写了一篇优秀的文章,对两者进行了基准测试:http://blogs.msdn.com/b/cjacks/archive/2006/05/19/gdi-vs-gdi-text-rendering-performance.aspx - Ian Boyd
3
我无法在任何C#库中找到DrawCachedBitmap。如果有人感兴趣,我制作了一个小的托管C++包装器,以便从C#中使用CachedBitmap(https://github.com/svejdo1/CachedBitmap)。 - Ondrej Svejdar

7

你有没有看过SlimDX?它有一个托管包装器,围绕Direct2D,这是一个完全硬件加速的2D API,也可以很好地与传统的GDI混合使用。

编辑:

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

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

这也支持Direct2D。


我从未听说过SlimDX或SharpDX。但是我想提一下Direct2D。缺点是你必须从头开始创建整个控件库。WPF本应该是硬件加速的选择,但启动速度慢,动画迟缓且难以学习。 - Ian Boyd
Wow SharpDX看起来真不错。看起来好像不能在RDP上运行 :( - Joe

2

您可以尝试转向WPF技术。
我这样做是因为WinForms绘制速度慢。
这个转换非常困难,尤其对于像我这样老派的程序员。

但是在启动速度和RAM方面,WinForms无可匹敌。
WPF启动缓慢且占用大量RAM。


1
我有WPF的经验,并且建立了一些WPF窗口。我注意到WPF在低端/集成显卡的机器上性能也很差(例如我的工作机器)。当窗口尺寸很大或最大化时,问题变得更加严重(无论是对于GDI+还是WPF)。 - Joe
1
同样,我认为转换并不容易,而且很痛苦。我仍然发现自己像使用WinForms一样使用WPF,也就是说-不使用花哨的绑定,而是使用大量的代码来完成许多可以自动完成的工作-不确定这是否会对性能产生影响。 - Joe
1
有很多人对WPF的性能进行了大量的抱怨(一台四核nVidia桌面电脑无法像嵌入式iPhone设备那样平滑地进行动画操作?)http://fixwpf.org/ - Ian Boyd

2

Direct2D是一个高性能的DirectX应用程序包装器 - 建议使用它。 - Ian Boyd
Microsoft Code Pack也有使用Direct2D的示例。 - Dour High Arch

0
如果您的应用程序是跨平台的,我建议使用OpenTK,它是OpenGL的托管封装器,通常比DirectX(无论是托管还是本机)更容易学习。 OpenTK / OpenGL往往比DirectX提供更好的性能。使用OpenTK,您可以完全在GPU上绘制图像,然后将其光栅化为位图,该位图可以与System.Drawing中的Bitmap类进行交互。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接