画很多线很慢
Drawing a lot of lines is very slow
我想在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));
}
}
}
}
不清楚您使用的是什么前端(WPF、WinForms),但您当前的代码可能会使用大量资源。 getEdges()
and/or 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));
}
}
}
编辑:如@Hans Kesting所述,内循环中的这一行是多余的:
if (objects[i].getEdges().Count > 0)
自从您进入内部循环后,它将始终计算为 true
。
PS: 请注意,这可能无法解决您所有的性能问题,但我相信这会有所帮助。
我用PICTURE BOX解决了这个问题,我画了一张位图,把位图设置为Picture box的图像。
我想在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));
}
}
}
}
不清楚您使用的是什么前端(WPF、WinForms),但您当前的代码可能会使用大量资源。 getEdges()
and/or 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));
}
}
}
编辑:如@Hans Kesting所述,内循环中的这一行是多余的:
if (objects[i].getEdges().Count > 0)
自从您进入内部循环后,它将始终计算为 true
。
PS: 请注意,这可能无法解决您所有的性能问题,但我相信这会有所帮助。
我用PICTURE BOX解决了这个问题,我画了一张位图,把位图设置为Picture box的图像。