有没有快速的方法将字符绘制到屏幕上?

时间:2013-05-23 06:41:44

标签: c#

我用Java开发了一个Matrix主题应用程序,并正在尝试移植到C#。但是,我发现后者的DrawString方法在绘制大量单个字符时性能更差。因此,我希望存在两种可能性之一:

  1. 有一种方法可以更快地绘制大量单个字符。

  2. 有一种方法可以绘制一个固定间距的字符串来实现相同的效果。这似乎不太可能。

  3. 有谁知道有任何方法可以完成1或2?

    其他信息:

    • 我需要能够每次抽取 20000个字符30次 第二即可。

    • 字符可以具有相同的字体和大小,但颜色应该可以 改变。

    • 字符集是有限的(字母,数字和标点符号)。

    • 字符的位置沿着2D网格,不重叠。

2 个答案:

答案 0 :(得分:4)

我不知道一些快速的替代方案,但使用GDI(TextRenderer)而不是GDI +(DrawString)会得到更好的结果。速度提高5-6倍。

GDI vs. GDI+ Text Rendering Performance

另一篇有用的文章 - Rendering fast with GDI+ - What to do and what not to do!

答案 1 :(得分:2)

  

是否有另一种方法可以更快地绘制大量单个字符?

Graphics.DrawString方法使用GDI +绘制,这往往比GDI慢。假设您安装了一组不错的图形驱动程序,GDI通常是硬件加速的。唯一的例外是启用了Aero主题的Windows Vista,但在Windows 7中已修复。您可以通过调用其中一个TextRenderer.DrawText方法切换到GDI。这不仅比GDI +快一些,使用GDI还有其他优势。唯一真正的缺点是WinForms不支持使用GDI进行打印。但这听起来不像是你的担忧。

假设您只定位支持它们的Windows的现代版本,您还可以研究一些新的图形技术,如Direct2D和DirectWrite。对于C#包装器,您可以查看Windows API Code Pack(另请参阅this blog article)。 OpenGL也可能是一种选择。我没有使用它,但速度是它声名鹊起的。

不幸的是,我仍然不确定这是否足够快。一百万个字符每秒30次真的是不合理的数量。我所知道的视频输出设备甚至无法显示。当然,你可以做一些类型的缓存。或者可能是一个完全不同的应用程序设计?

另外,请记住,绘制到背景缓冲区(例如,位图)通常比直接绘制到显示缓冲区(即监视器)上快得多。所以你可以把你的所有绘图都放到这个背景缓冲区上,然后在一次通过中定期将它们blit到屏幕上。这种技术通常被称为“双缓冲”(因为它使用两个缓冲区),并且是用于最小化闪烁的众所周知的策略。如果您需要尽快绘制,它还可以提高速度,因为它允许您这样做,同时考虑到显示输出的固有限制。

  

有一种方法可以绘制一个固定间距的字符串来实现相同的效果。这似乎不太可能。

使用固定间距绘制不会增加使用比例间距的速度。

当您编写特别重要的绘图代码时, 高你的期望是。它们更多地用于调整算法,而不是将其性能提高多个数量级。