2

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

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

  2. 有一种方法可以画一个固定间距的字符串来达到同样的效果。这似乎不太可能。

有谁知道完成1或2的任何方法?

附加信息:

  • 我需要能够每秒绘制大约20000 个字符 30 次

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

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

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

4

2 回答 2

5

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

GDI 与 GDI+ 文本渲染性能

另一篇有用的文章 -使用 GDI+ 快速渲染 - 做什么和不做什么!

于 2013-05-23T07:00:31.053 回答
2

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

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

假设您只针对支持它们的现代版本的 Windows,您还可以研究一些新的图形技术,如 Direct2D 和 DirectWrite。对于 C# 包装器,您可以查看Windows API 代码包(另请参阅此博客文章)。OpenGL 也可能是一种选择。我没有用过它,但速度是它的名声之一。

不幸的是,我仍然不确定这是否足够快。一百万个字符每秒 30 次,实在是一个不合理的数字。据我所知,没有任何视频输出设备能够显示这个。当然,您可以使用某种类型的缓存来代替。或者可能为您的应用程序设计一个完全不同的设计?

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

有一种方法可以画一个固定间距的字符串来达到同样的效果。这似乎不太可能。

使用固定间距绘图不会比使用比例间距提高速度。

当您编写特别关键的绘图代码时,需要牢记一些“交易技巧”,但考虑到您的期望有多高,我严重怀疑这些对您有多大用处。它们更多地用于调整算法,而不是将其性能提高多个数量级。

于 2013-05-23T06:59:51.417 回答