C#Slow Paint事件:绘制大量对象

时间:2010-11-02 09:09:36

标签: c# events list gdi paint

我有一个PictureBox,它用作画布。 List<RectangleObj> aprox 8000的数组大小。

“RectangleObj”是一个简单的矩形类,一旦你调用它的Draw(Graphic g)方法就会绘制

  1. 使用边框 g.DrawRectangle(...)
  2. 用alpha填充矩形 使用透明度 g.FillRectangle(...)
  3. 在应用程序Form.cs中,我使用pictureBox1_Paint(...)循环RectangleObj数组并调用该类的Draw方法。

    喜欢这个。

    private void pictureBox1_Paint(object sender, PaintEventArgs e)
    {
        for (int i = 0; i < RectList.Count(); i++) //List<RectangleObj> count = 8000 
              RectList[i].Draw(e.Graphics);
    }
    

    每次鼠标点击RectangleObj并拖动更改其位置(鼠标移动事件)时,都会调用paint事件。由于数组的数量很大,因此paint事件没有足够的时间来完成循环并且充满鼠标移动。所以,这会使Paint事件变慢。

    有人可以建议我如何优化此程序。

3 个答案:

答案 0 :(得分:3)

您是否考虑过绘制到内存位图,然后将其blit到屏幕?

答案 1 :(得分:1)

这里有几件事情:

  1. 移动时不要画画。计算所选元素的轮廓,并仅在鼠标移动时对轮廓进行XOR。在MouseUp上重绘。
  2. 不要画出你不需要的东西。您可以运行算法来检测哪些矩形完全被遮挡并忽略它们。
  3. 确保您的Picturebox具有DoubleBuffered = true

答案 2 :(得分:0)

根据移动矩形的位置及其先前位置确定需要重绘哪些矩形,并仅重绘这些矩形。将绘画剪辑为仅包含已失效的部分。