Рисовать много линий очень медленно - PullRequest
0 голосов
/ 14 мая 2018

Я хочу нарисовать много линий на 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));

            }
        }          
    }
}

Ответы [ 2 ]

0 голосов
/ 17 мая 2018

Я решаю это с помощью PICTURE BOX, я рисую растровое изображение и устанавливаю растровое изображение в качестве изображения поля Picture.

0 голосов
/ 14 мая 2018

Не ясно, какой интерфейс вы используете (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));
        }          
    }
}

Редактировать: , как упоминалось @ Hans Kesting , эта строка во внутреннем цикле лишняя:

if (objects[i].getEdges().Count > 0) 

Это всегда будет равно true, поскольку вы попали во внутренний цикл.

PS: Обратите внимание, что это может решить не все ваши проблемы с производительностью, но яуверен, что это поможет.

...