C# 画很多线很慢

C# 画很多线很慢,c#,forms,draw,C#,Forms,Draw,我想在3个表单上画很多线,但是当我调用这个方法时,它需要很多时间。对于200多条线路,大约需要1秒。我做错了什么 public void drawObjects() { pAux = selectedPen; for (int i = 0; i < objects.Count; i++) { for(int ed = 0; ed < objects[i].getEdges().Count; ed++) {

我想在3个表单上画很多线,但是当我调用这个方法时,它需要很多时间。对于200多条线路,大约需要1秒。我做错了什么

public void drawObjects()
{
    pAux = selectedPen;
    for (int i = 0; i < objects.Count; i++)
    {
        for(int ed = 0; ed < objects[i].getEdges().Count; ed++)
        {
            frontGraphics.DrawRectangle(recPen, (objects[i].getEdges()[ed].getPoint1().X + 332), -(objects[i].getEdges()[ed].getPoint1().Y - 170), 2, 2);
            rightGraphics.DrawRectangle(recPen, objects[i].getEdges()[ed].getPoint1().Z + 332, -(objects[i].getEdges()[ed].getPoint1().Y - 170), 2, 2);
            topGraphics.DrawRectangle(recPen, objects[i].getEdges()[ed].getPoint1().X + 332, -(objects[i].getEdges()[ed].getPoint1().Z - 170), 2, 2);

            if (objects[i].getEdges().Count > 0)
            {
                if (objects[i].selected == true)
                    pAux = selectedPen;
                else
                    pAux = linePen;
                frontGraphics.DrawLine(pAux, objects[i].getEdges()[ed].getPoint1().X + 332, -(objects[i].getEdges()[ed].getPoint1().Y -170), 
                                           objects[i].getEdges()[ed].getPoint2().X + 332, -(objects[i].getEdges()[ed].getPoint2().Y -170));
                rightGraphics.DrawLine(pAux, objects[i].getEdges()[ed].getPoint1().Z + 332, -(objects[i].getEdges()[ed].getPoint1().Y - 170),
                                            objects[i].getEdges()[ed].getPoint2().Z + 332, -(objects[i].getEdges()[ed].getPoint2().Y - 170));
                topGraphics.DrawLine(pAux, objects[i].getEdges()[ed].getPoint1().X + 332, -(objects[i].getEdges()[ed].getPoint1().Z - 170),
                                           objects[i].getEdges()[ed].getPoint2().X + 332, -(objects[i].getEdges()[ed].getPoint2().Z - 170));

            }
        }          
    }
}
public void drawObjects()
{
pAux=选择的笔;
for(int i=0;i0)
{
if(对象[i]。所选==true)
pAux=选择的笔;
其他的
pAux=linePen;
frontGraphics.drawine(pAux,objects[i].getEdges()[ed].getPoint1().X+332,-(objects[i].getEdges()[ed].getPoint1().Y-170),
对象[i].GetEdge()[ed].getPoint2().X+332,-(对象[i].GetEdge()[ed].getPoint2().Y-170));
rightGraphics.DrawLine(pAux,对象[i].GetEdge()[ed].getPoint1().Z+332,-(对象[i].GetEdge()[ed].getPoint1().Y-170),
对象[i].getEdge()[ed].getPoint2().Z+332,-(对象[i].getEdge()[ed].getPoint2().Y-170));
topGraphics.drawine(pAux,objects[i].getEdges()[ed].getPoint1().X+332,-(objects[i].getEdges()[ed].getPoint1().Z-170),
对象[i].GetEdge()[ed].getPoint2().X+332,-(对象[i].GetEdge()[ed].getPoint2().Z-170));
}
}          
}
}

不清楚您使用的是什么前端(WPF、WinForms),但您可能在当前代码中使用了大量资源。
getEdges()
和/或
getPoint()
方法可能是代价高昂的方法,您经常调用这些方法

如果您要重用方法的结果:将其存储在变量中。下面是您的代码的外观:

public void drawObjects()
{
    pAux = selectedPen;
    for (int i = 0; i < objects.Count; i++)
    {
        var currentObject = objects[i];
        var edges = currentObject.getEdges();

        for(int ed = 0; ed < edges.Count; ed++)
        {
            var currentEd = edges[ed];
            var edPoint1 = currentEd.getPoint1();
            var edPoint2 = currentEd.getPoint2();

            frontGraphics.DrawRectangle(recPen, (edPoint1.X + 332), -(edPoint1.Y - 170), 2, 2);
            rightGraphics.DrawRectangle(recPen, edPoint1.Z + 332, -(edPoint1.Y - 170), 2, 2);
            topGraphics.DrawRectangle(recPen, edPoint1.X + 332, -(edPoint1.Z - 170), 2, 2);

            pAux = currentObject.selected ? selectedPen : linePen;

            frontGraphics.DrawLine(pAux, edPoint1().X + 332, -(edPoint1().Y -170), edPoint2.X + 332, -(edPoint2.Y -170));
            rightGraphics.DrawLine(pAux, edPoint1.Z + 332, -(edPoint1.Y - 170), edPoint2.Z + 332, -(edPoint2.Y - 170));
            topGraphics.DrawLine(pAux, edPoint1.X + 332, -(edPoint1.Z - 170), edPoint2.X + 332, -(edPoint2.Z - 170));
        }          
    }
}
它将始终计算为
true
,因为您进入了内部循环


PS:请注意,这可能无法解决所有性能问题,但我相信这会有所帮助。

我使用图片框解决此问题,我绘制位图并将位图设置为图片框的图像。

看看这一点,您使用的是什么前端技术-WinForms,WPF?正确地标记你的问题。什么是“慢”,你会期待什么?你说的“线”的数量是多少?请提供一个更好的示例-请参见:查看:在以
对象[i].getEdge()结尾的for循环内。计数
您正在测试这是否为
>0
-执行该行时总是这样。将
对象[i].getEdge()[ed]
的值分配给循环开始处的变量。没有理由每次使用时都要检索所有这些内容。调用
.getEdge()
的成本有多高?在循环中,每次迭代都要多次调用它。该值可能永远不会更改,因此在“ed”循环之外获取边。
if (objects[i].getEdges().Count > 0)