【问题标题】:Is there a fast way of drawing characters to the screen?有没有一种快速将字符绘制到屏幕上的方法?
【发布时间】:2013-05-23 06:41:43
【问题描述】:

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

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

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

有没有人知道实现 1 或 2 的任何方法?

附加信息:

  • 我需要能够在 20000 个字符周围绘制 30 次 第二

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

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

  • 字符的位置沿着二维网格,不重叠。

【问题讨论】:

  • 你需要多快?
  • 你在 Java 中使用了什么?每秒 3000 万个字符是相当多的!
  • 每秒 3000 万个字符,这是用 Java 完成的吗?我不敢相信。你的屏幕有多大?它怎么能容纳这么多也清晰易读的字符?
  • @ZongLi,你介意在你的应用背景上扩展一点吗?
  • 你试过WPF吗?正确使用 WPF 速度很快。否则Direct2D?这里有 .NET 的包装器:direct2dsharp.codeplex.com

标签: c#


【解决方案1】:

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

GDI vs. GDI+ Text Rendering Performance

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

【讨论】:

    【解决方案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 次,实在是一个不合理的数字。据我所知,没有任何视频输出设备能够显示这个。当然,您可以使用某种类型的缓存来代替。或者您的应用程序可能采用完全不同的设计?

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-09-29
      相关资源
      最近更新 更多