【问题标题】:how to draw high-speed diagonal lines in windows?如何在windows中绘制高速对角线?
【发布时间】:2016-07-07 10:29:34
【问题描述】:

我需要在 Windows 应用程序中可视化设计,因此需要非常快速地绘制对角线。我尝试使用 GDI+(因为我需要透明度),对角线的速度比绘制垂直/水平线慢 10 倍左右。有时我需要大约 400 毫秒来绘制 2000 条穿过屏幕的对角线。

在此之后我测试了 Direct2D,它比 GDI+ 快了大约 2 倍,但速度还不够快。现在我开始看 OpenGL 来绘制 2D 图形。在那里我会从上面看场景并使用正交投影。

谁能告诉我,绘制高速对角线的正确方法是什么?

问候,皮特

【问题讨论】:

  • 如果您愿意为性能牺牲质量,您可以尝试自己栅格化它们吗?我的意思是,性能真的那么差吗?你的设置是什么?什么语言?您是否正在创建/销毁太多对象?向我们展示您的代码。

标签: performance graphics 2d


【解决方案1】:

您可以手动将线条光栅化为像素缓冲区(只是一个 2D 整数数组),最好使用更快的语言(例如 C 中的 externall DLL),然后将缓冲区作为位图 blit窗口(GDI 或 DirectDraw 就足够了)。

Brensenham's line algorithm 是一个很好的方法:https://en.wikipedia.org/wiki/Bresenham%27s_line_algorithm

如果您需要抗锯齿:https://en.wikipedia.org/wiki/Xiaolin_Wu%27s_line_algorithm


我将这种方法用于软件渲染器项目,当我从 VB.NET 迁移到 C 时,性能提高了 2 倍(就像您使用 Direct2D 所做的那样,但我仍在使用 GDI+)。我能够获得 40 + 在旧的 1.7 GHz Pentium 机器上 800x600 的 FPS,即使使用 GDI+ 也约为 25,所以我不确定为什么在你的情况下性能不足。

【讨论】:

  • 我是从 Delphi 访问 GDI+,所以速度和 C/C++ 差不多。我忘了提到我正在使用自定义虚线,这会大大降低性能。我可以在大约 100 毫秒内绘制大约 10k 条实线,但这还不够。有了更大的设计,我有大约 100 万条对角线,应该可以用 20fps 进行缩放。所以我需要在大约 50 毫秒内绘制大约 100 万条线。
  • @PeterS 好吧,与自己绘制线条相比,GDI+ 的效率非常低(只需看看调用堆栈)。如果需要,您甚至可以将内部循环迁移到程序集(关于 Delphi 的 IDK,但在 C/C++ 中可以)
【解决方案2】:

为了获得最高性能,请使用 OpenGL 或 Direct3D。您将能够以更多代码为代价来利用硬件加速绘图来进行设置。您应该能够在

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-30
    • 2012-06-30
    • 1970-01-01
    • 2016-10-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多