我正在 GDI+ 中开发一个保留模式绘图应用程序。该应用程序可以在画布上绘制简单的形状并执行基本的编辑。执行此操作的数学优化到最后一个字节,这不是问题。我正在使用内置 Controlstyles.DoubleBuffer 的面板上绘图。
现在,如果我在大显示器(在我的情况下为高清)上最大化运行我的应用程序,我的问题就会出现。如果我尝试从(大)画布的一个角到对角线的另一个角画一条线,它将开始滞后并且 CPU 升高。
我的应用程序中的每个图形对象都有一个边界框。因此,当我使从最大化应用程序的一个角到对角对角线的一条线的边界框无效时,该边界框实际上与画布一样大。当用户绘制一条线时,边界框的这种无效因此发生在 mousemove 事件上,并且有明显的滞后可见。如果线条是画布上的唯一对象,则此滞后也存在。
我已经尝试以多种方式对此进行优化。如果我画一条较短的线,CPU 和延迟就会下降。如果我删除 Invalidate() 并保留所有其他代码,则应用程序很快。如果我使用区域(仅跨越图形)而不是边界框来使无效,那么它同样慢。如果我将边界框拆分为一系列背靠背的较小框,从而减少失效区域,则看不到明显的性能提升。
因此,我在这里不知所措。如何加快失效速度?
另一方面,Paint.Net 和 Mspaint 都存在同样的缺点。然而,Word 和 PowerPoint 似乎能够像上面描述的那样绘制一条线,没有滞后,也没有 CPU 负载。因此有可能达到预期的结果,问题是如何?