在Windows窗体中呈现文本最快的API?
我们需要优化在不规则网格中显示大量小字符串的CWindows Forms应用程序的文本呈现。在任何时候,都可以看到超过5000个单元格,每秒更新4次。字体家族和大小在单元格中是一致的,尽管每个单元格的颜色可能有所不同,粗体/斜体/普通字体也会如此。
我已经在网上看到有关" TextRenderer.DrawText"与" Graphics.DrawString"是最快/最好的信息,这在Win32级别上相对于GDI与GDI +的比较是矛盾的。
在Windows XP和Windows Vista上,我也看到了完全不同的结果,但是我的主要目标是Windows XP。有望取得长足进步的文章
在WinFX和DirectX 10下对这里没有帮助:-)
最好的方法是什么?我不怕引入一个小的C ++ / CLI层并优化设备上下文处理以挤出更多性能,但是我想要一些明确的建议,以选择哪个方向。
编辑:
感谢初步答复。我将尝试结合背景位图渲染和坚持使用GDI等效调用。
解决方案
回答
一般而言,GDI比GDI +绘制速度更快。我参与了一个项目,该项目必须绘制数千行和文本字符串,并且从GDI +切换到GDI可以显着改善性能。那是使用Windows XP,所以我无法在Vista上发表评论。我也建议我们为工程图使用双缓冲,以提高性能。创建兼容的屏幕外位图,并在每次需要绘制时重复使用。
回答
即使使用GDI,5000多个文本的渲染也很慢,尤其是在需要滚动的情况下。创建一个单独的渲染线程,并每200毫秒通知一次UI线程,并bitblt当前结果。它提供了流畅的用户体验。
回答
一位Microsoft开发人员在他的博客上发布了GDI与GDI +文本渲染性能的文章,该文章回答了原始的速度问题:在他的系统上,GDI DrawText比GDI + DrawString快6倍。
如果我们需要成为真正的速度恶魔,TextOut会比DrawText快,但是我们必须自己进行剪切和自动换行。 ExtTextOut支持剪切。
GDI呈现(TextRenderer)与使用GDI的Windows其他部分更加一致; GDI +试图独立于设备,因此在间距和加粗方面不一致。有关呈现不一致的示例,请参见SQL Server 2005外围应用配置器。
回答
创建一个C ++ / CLI互操作类以本机代码进行绘制会导致疯狂的快速绘制。我们目睹了这一点并对其进行了测量。
如果我们不愿意这样做,我们会发现graphics.DrawString比TextRenderer.DrawText快一点。
回答
在我的Windows 7 64位系统上,TextOut比DrawString还要慢! TextRenderer.DrawText比DrawString慢得多。