例如,当我用线连接 14 个点并尝试移动它们时,它的移动非常非常慢,是什么让它移动得那么慢?

  • 本文关键字:移动 非常 是什么 连接 例如 c#
  • 更新时间 :
  • 英文 :


这是绘制事件:

private void pictureBox1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
        {
            SolidBrush brush;
            Pen p=null;
           Point connectionPointStart;
           Point connectionPointEnd;
           Graphics g = e.Graphics;
           g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
               brush = new SolidBrush(Color.Red);
               p = new Pen(brush);
               for (int idx = 0; idx < wireObject1._point_X.Count; ++idx)
               {
                   Point dPoint = new Point((int)wireObject1._point_X[idx], (int)wireObject1._point_Y[idx]);
                   dPoint.X = dPoint.X - 5; // was - 2
                   dPoint.Y = dPoint.Y - 5; // was - 2
                   Rectangle rect = new Rectangle(dPoint, new Size(10, 10));
                   g.FillEllipse(brush, rect);
                  
               }
           
               for (int i = 0; i < wireObject1._connectionstart.Count; i++)
               {
                   int startIndex = wireObject1._connectionstart[i];
                   int endIndex = wireObject1._connectionend[i];
                   
                   connectionPointStart = new Point((int)wireObject1._point_X[startIndex], (int)wireObject1._point_Y[startIndex]);
                   connectionPointEnd = new Point((int)wireObject1._point_X[endIndex], (int)wireObject1._point_Y[endIndex]);
                   p.Width = 4;
                   g.DrawLine(p, connectionPointStart, connectionPointEnd);
                   moveCounter++;
                   textBox1.Text = moveCounter.ToString();
               }
                          
        }

在底部的循环中,我正在运行 int 类型的 _connectionstart 列表。

添加了一个 int 变量,我称之为 moveCounter 以查看它调用此循环并绘制线条的次数。

如果我在 pictureBox1 上添加两个点,请用一条线连接它们,然后在其移动平滑周围拖动其中一个点。3 个连接点和 7 个连接点相同,但是当我到达与许多线连接的 9-10 个点并尝试移动它时,将其拖动或任何未连接的点,一切都移动得非常非常慢,就像我在两点之间添加新的连接线一样,它变得越来越慢。

所以问题可能是我的循环在油漆事件中的错误,或者在移动事件中它做了很多时间 pictureBox1.refresh();

因此,我在设计器中添加了一个启用 true 的计时器,并将其设置为 30 毫秒。在移动事件中,我举起一个标志,在计时器滴答事件中,我检查标志是否打开,我制作了一个 pictureBox1.refresh();并重置回标志。这个想法是,当我移动点或连接的点时,它将每 30 毫秒移动一次。

但这并没有解决问题。仍然当我有 9-10 个点与它们之间的许多线连接时,一切都变得非常慢。

这是图片框 1 鼠标移动事件:

private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
        {
            if (mouseMove == true)
            {
                mouseDrag = true;
                Point NewPoint = e.Location;
                                  wireObject1.MovePoint(selectedIndex, NewPoint, NewPoint); // when moving a point dragging the other point is vanished deleted. To check why !
                    label1.Text = "{X = " + NewPoint.X + "}" + " " + "{Y = " + NewPoint.Y + "}";
                    refreshFlag = true;
                    timer2.Start();
                
            }
            else
            {
                label19.Text = "{X = " + e.X + "}" + " " + "{Y = " + e.Y + "}";
            }
        }

timer2 是我添加的另一个计时器,只是为了查看它在 5 秒内移动了多少次。因此,如果 timer1 设置为 30 毫秒,我应该在 5 秒后看到大约 150 次移动。

所以在 timer1 tick 事件中,我做到了:

private void timer1_Tick(object sender, EventArgs e)
        {
            if (refreshFlag == true)
            {
                pictureBox1.Refresh();
                refreshFlag = false;
            }
        }

我确信 timer1 的想法应该可以解决问题,但它没有。所以我想知道问题出在哪里,也许我在绘画事件中的循环做错了什么?

列表_connectionstart包含索引,例如,如果我有两个点与一条线连接,并且我单击了一个点并拖动该点,从而使该点更长或更短,例如_connectionstart我有一个包含索引 0 的地方/单元格 [0]

例如,在列表_point_X中,我现在有两个单元格位于 [0] 120.0 和 [1] 180.0 中,它们是与_point_Y列表相同的点坐标。

现在的问题是问题出在哪里?油漆事件中的错误?移动事件有问题吗?我不明白为什么当它有 9-10 个点连接它们之间的很多线时它会变得如此缓慢。

例如,我现在测试了两个点与一条线相连,我移动了一个点,围绕该点将线拉伸得更长或更短,5 秒后结果是 160 次移动,然后又过了 5 秒,它是 323,依此类推。所以它似乎在工作计时器1和30毫秒还是我错了?

首先,对应用程序进行一些调整:您是否尝试运行与绘图分离的逻辑?=> 例如,"updateData()"方法和"draw()"方法?我也建议使用DoubleBuffer。

其次,如果性能对于较大的数据集(当您添加更多点时)不利,则比您的算法不够高效。如果绘制多边形是您想要的,请先更新顶点坐标,然后调用 Graphics.DrawPolygon

最新更新