在GDI+中绘制许多矩形

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

实例化矩形与实际的 API 调用相比几乎不需要时间。事实上,矩形是一个结构体。 - usr
你是指一千还是一百万? - Andrew Barber
几乎肯定有更好的方法。矩形代表什么?你想画什么? - Kendall Frey
1个回答

9

我建议你使用函数的数组形式:

FillRectangles(Brush brush, Rectangle[] rects);

如果这种方法对你不适用,因为你需要不同的画笔等等,那么你应该按状态(画笔)对基本形状进行分组,并在单个操作中绘制每个数组。快速测试显示性能至少提高了三倍,即单独绘制30万个矩形与一次性绘制100万个矩形的卡顿程度相当。

FillRectangles太慢了,有更快的方法吗?难怪Android将2D加速推入操作系统,因为加速填充矩形不是开发人员的工作。在Windows上没有加速,你只能得到一个性能差的应用程序。别担心,到2050年,我认为PC硬件应该足够快来处理FillRectangles函数。我会耐心等待的。 - hamish
使用dotTrace,我可以看到所有表现不佳的功能,即使使用2017年的硬件它仍然表现差。它们包括:FillRectangles,DrawImageUnscaled(GDIPdrawImageI),DrawImage(GdipDrawImageRect)。 - hamish
@hamish 使用WPF代替旧的GDI+。 - juFo
@juFo 我尝试使用WPF,但是目前我正在使用的60个功能几乎没有可用的WPF示例。我计算了一下,从GDI+转换到WPF需要19个月的时间。 - hamish

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接