【问题标题】:Drawing a lot of rectangles in GDI+在 GDI+ 中绘制很多矩形
【发布时间】:2012-04-20 12:24:17
【问题描述】:

我有一个应用程序在 C# 中使用 GDI+ 绘制了很多小矩形(大约 100 万个),但性能...不太好。我知道构建大量 Rectangle 对象以将它们传递给 Graphis.FillRectangle 需要一些时间。我也明白,如果Rectangles 逐帧变化,我无法避免这种情况,因为Rectangle 被设计为不可变的。因此,我的问题是:是否有可能提高此绘图调用的性能,除非必须假定所有 Rectangles 都是可见的?

提前致谢, 克里斯托夫

【问题讨论】:

  • 与实际的 API 调用相比,实例化 Rectangle 几乎不需要任何时间。实际上,Rectangle 是一个结构体。
  • 你的意思是一千还是一百万?
  • 几乎肯定有更好的方法。长方形代表什么?你想画什么?

标签: c# performance gdi+


【解决方案1】:

我建议您改用调用的数组变体:

FillRectangles(Brush brush, Rectangle[] rects);

如果这对您不起作用,因为您需要不同的画笔或类似的东西,您应该按状态(画笔)对图元进行分组,并一次绘制每个数组。快速测试显示性能至少提高了三倍,即单独绘制 300K 矩形感觉与一次性绘制 1M 矩形一样波涛汹涌。

【讨论】:

  • FillRectangles 太慢了。有什么更快的吗?难怪 android 将 2d 加速推入操作系统,因为加速填充矩形不是开发人员的工作。在 windows 上没有加速,你只剩下一个性能很差的应用程序。别担心,到 2050 年,我认为 PC 硬件的速度应该足以满足 FillRectangles 功能。我会耐心等待的。
  • 使用 dotTrace 我可以看到所有性能不佳的功能,即使使用 2017 年的硬件,它仍然性能很差。它们包括:FillRectangles、DrawImageUnscaled (GDIPdrawImageI)、DrawImage (GdipDrawImageRect)
  • @hamish 使用 WPF 而不是旧的 GDI+
  • @juFo 我尝试使用 WPF,但是对于我目前使用的所有 60 个功能,几乎没有工作的 WPF 示例。我计算过从 GDI+ 转换到 WPF 需要 19 个月。
猜你喜欢
  • 1970-01-01
  • 2014-06-26
  • 1970-01-01
  • 2014-12-12
  • 2012-06-13
  • 2018-01-01
  • 2021-01-08
  • 2014-01-13
  • 2015-11-15
相关资源
最近更新 更多