在Windows窗体中呈现文本最快的API?

我们需要优化一个C# Windows窗体应用程序的文本渲染,在不规则的网格中显示大量的小string。 在任何时候,可以有超过5000个可见的细胞,每秒更新4次。 字体系列和大小在整个单元格中是一致的,不过每个单元格的颜色可能会有所不同,粗体/斜体/平面也是如此。

我已经看到网上关于TextRenderer.DrawTextGraphics.DrawString是最快/最好的,这在Win32级别减less到GDI与GDI +比较冲突的信息。

在Windows XP和Windows Vista上我也看到了截然不同的结果,但我的主要目标是Windows XP。 在WinFX和DirectX 10下很有前途的文章在这里没有帮助:-)

这里最好的办法是什么? 我并不害怕引入一个小的C ++ / CLI层,并优化了设备上下文处理以挤出更多的性能,但是我希望得到一些明确的build议。

编辑:感谢您的初始答复。 我将尝试背景位图渲染和坚持与GDI等效调用的组合。

微软的开发者在他的博客上发布了一个GDI + GDI +文本呈现性能文章,回答了原始速度问题:在他的系统上,GDI DrawText比GDI + DrawString快6倍。

如果你需要成为一个真正的速度恶魔,TextOut比DrawText快,但你必须照顾裁剪和自我包装。 ExtTextOut支持剪辑。

GDI的渲染(TextRenderer)将会与使用GDI的Windows的其他部分更加一致; GDI +试图成为设备无关的,所以一些间距和嵌入是不一致的 。 有关不一致呈现的示例,请参阅SQL server 2005表面区域配置工具。

即使使用GDI,5000+的文本渲染速度也很慢,尤其是如果您需要滚动的话。 创建一个单独的渲染线程,并每隔200毫秒通知UI线程,并查看当前结果。 它提供了一个流畅的用户体验。

一般来说GDI比GDI +更快。 我曾经参与过一个项目,该项目需要绘制成千上万行和文本字符串,从GDI +切换到GDI才能显着提高性能。 这是使用Windows XP,所以我不能评论Vista。 我也建议使用双缓冲您的绘图也提高性能。 创建一个兼容的屏幕位图,并在每次需要绘制时重复使用。

创建一个C ++ / CLI互操作类来在本地代码中执行绘图将导致疯狂的绘制。 我们目睹了这一点,并进行了测量。

如果你不这样做,我们发现graphics.DrawString比TextRenderer.DrawText稍微快一些。

在我的Windows 7 64位系统上,TextOut甚至比DrawString慢一点! TextRenderer.DrawText比DrawString慢得多。