我们需要针对在不规则网格中显示大量小字符串的C#Windows Forms应用程序优化文本呈现。任何时候都可以看到超过5000个单元格,每秒更新4次。字体系列和大小在单元格中是一致的,尽管颜色可能因单元格而异,粗体/斜体/单元格也不同。
我在网上看到有关TextRenderer.DrawText
与Graphics.DrawString
最快/最好的相互矛盾的信息,从而减少到GDI与GDI+比较Win32级别。
我在Windows XP和Windows Vista上也看到了截然不同的结果,但我的主要目标是Windows XP。文章有很大的进步 在WinFX和DirectX 10下,此处无效: - )
这里最好的方法是什么?我不害怕引入一个小的C ++ / CLI层并优化设备上下文处理来挤出更多的性能,但我想要一些关于采取哪个方向的明确建议。
编辑: 感谢您的初步回复。我将尝试组合背景位图渲染并坚持使用GDI等效调用。
答案 0 :(得分:5)
微软开发人员在他的博客上发布了一篇GDI vs. GDI+ Text Rendering Performance文章,回答原始速度问题:在他的系统上,GDI DrawText比GDI + DrawString快6倍。
如果你需要成为一个真正的速度恶魔,TextOut比DrawText更快,但你必须自己处理剪辑和自动换行。 ExtTextOut支持剪辑。
GDI渲染(TextRenderer)将与使用GDI的Windows的其他部分更加一致; GDI +试图与设备无关,因此some spacing and emboldening are inconsistent。有关不一致呈现的示例,请参阅SQL Server 2005表面区域配置工具。
答案 1 :(得分:3)
即使使用GDI,5000+文本渲染也很慢,特别是如果你需要滚动。创建一个单独的渲染线程,每隔200 ms通知UI线程,并对当前结果进行bitblt。它提供了流畅的用户体验。
答案 2 :(得分:2)
GDI在绘制GDI +时更快。我参与了一个必须绘制数千行和文本字符串的项目,并从GDI +切换到GDI,这显着提高了性能。那是在使用Windows XP所以我不能评论Vista。我还建议您为绘图使用双缓冲来提高性能。创建兼容的屏幕外位图,并在每次需要绘制时重复使用。
答案 3 :(得分:2)
创建C ++ / CLI互操作类以在本机代码中进行绘制将导致疯狂快速绘制。我们见证了这一点并对其进行了测量。
如果你不这样做,我们发现graphics.DrawString比TextRenderer.DrawText略快。
答案 4 :(得分:2)
在我的Windows 7 64位系统上,TextOut甚至比DrawString慢一点! TextRenderer.DrawText比DrawString慢得多。
答案 5 :(得分:0)
根据最近的经验,可以通过带有ExtTextOut
标志的ETO_GLYPH_INDEX
实现最快的文本输出。这是有代价的,并且您不再打印字符,而是直接打印字形。这意味着您需要在调用ExtTextOut
之前将常规字符串转换为字形索引字符串,方法是每次都调用GetCharacterPlacement
,或者只调用一次此函数来构建自己的转换表,这将是有效的直到在DC中选择了新字体为止。请记住,字形索引是16位的,因此无论原始字符串的字符大小如何,您都可以将它们存储在Unicode字符串中并调用ExtTextOutW
版本。