【发布时间】:2010-10-31 18:00:30
【问题描述】:
我正在 GDI+ 中开发一个保留模式绘图应用程序。该应用程序可以在画布上绘制简单的形状并执行基本的编辑。执行此操作的数学优化到最后一个字节,这不是问题。我正在使用内置 Controlstyles.DoubleBuffer 的面板上绘图。
现在,如果我在大显示器(在我的情况下为高清)上最大化运行我的应用程序,我的问题就会出现。如果我尝试从(大)画布的一个角到对角线的另一个角画一条线,它将开始滞后并且 CPU 升高。
我的应用程序中的每个图形对象都有一个边界框。因此,当我使从最大化应用程序的一个角到对角对角线的一条线的边界框无效时,该边界框实际上与画布一样大。当用户绘制一条线时,边界框的这种无效因此发生在 mousemove 事件上,并且有明显的滞后可见。如果线条是画布上的唯一对象,也会存在这种滞后。
我已尝试通过多种方式对此进行优化。如果我画一条较短的线,CPU 和延迟就会下降。如果我删除 Invalidate() 并保留所有其他代码,则应用程序很快。如果我使用区域(仅跨越图形)而不是边界框来使无效,那么它同样慢。如果我将边界框拆分为一系列背靠背的小框,从而减少失效区域,则看不到明显的性能提升。
所以我在这里不知所措。如何加快失效速度?
另一方面,Paint.Net 和 Mspaint 都存在同样的缺点。然而,Word 和 PowerPoint 似乎能够像上面描述的那样绘制一条线,没有滞后,也没有 CPU 负载。这样就有可能达到预期的效果,问题是如何?
【问题讨论】:
-
Word 和 Powerpoint 不使用 GDI+...我不认为 GDI+ 因其速度而受到称赞(超过普通 GDI)。
-
您是否尝试过使用分析器查看减速实际发生的位置?我已经做了很多这种事情(很久以前,在 Delphi 中),但从未发现 Invalidate() 需要花费大量时间。另一方面,绘画是“有趣”的,因为它跑得足够快,可以用橡皮筋绑线。
-
好吧,无论如何,我相信 Delphi 对这类工作的速度要快得多。正如 Henk 所说,GDI+ 根本不以速度着称,更有可能是缺乏速度。但是,实际的绘制代码并不是瓶颈。大面积的无效化似乎是。我正在考虑使用自己的后缓冲区并手动对图像进行 blit 以查看是否可以获得性能提升。你能推荐任何专门针对 VS2005 的分析器吗?