Оптимизация приложения САПР для повышения эффективности - PullRequest
0 голосов
/ 02 марта 2012

Я разрабатываю приложение, подобное САПР, на C # (формы, без внешней среды).Я реализовал панорамирование, масштабирование, выбор;но он очень медленный, потому что при каждом перемещении мыши он перерисовывает все строки.

Как сделать приложение более быстрым и эффективным?Как перерисовать только одну линию?

код для рисования (на стандартной панели):

void pan_Paint(object sender, PaintEventArgs e)
{
    foreach (Entitie o in sketch.Entities)
    {
        if (o is Line)
        {
            Line l = (Line)o;
            Point p1 = pointScreen(l.P1.X.CurrentValue, l.P1.Y.CurrentValue);
            Point p2 = pointScreen(l.P2.X.CurrentValue, l.P2.Y.CurrentValue);
            e.Graphics.DrawLine(Pens.Black, p1, p2);
        }
    }
}

для рисования новой линии:

void pan_MouseMove(object sender, MouseEventArgs e)
{
    if (tmpEntitie != null)
    {
        Line l = (Line)tmpEntitie;
        l.P2 = e.Location;
        pan.Invalidate();
    }
}

Ответы [ 2 ]

0 голосов
/ 24 августа 2012

Я думаю, что вам нужно использовать технику разделения пространства, которая делит пространство на области или квадранты и перерисовывает объекты, только если они находятся в области, отображаемой в текущем окне просмотра.

Вот несколько ссылок для начала:

http://en.wikipedia.org/wiki/Space_partitioning

http://en.wikipedia.org/wiki/Quadtree

Библиотека:

http://www.vividsolutions.com/jts/jtshome.htm (Java Topology Suite)

http://code.google.com/p/nettopologysuite/ (JTS in C #)

0 голосов
/ 02 марта 2012

Предполагая, что вы делаете это, чтобы изучить материал: у вас уже есть ответ на первый шаг - вы определили, что занимает много времени и когда («каждая мышь перемещает ее, перерисовывает все строки»). Следующий шаг - «Нужно ли мне делать все, что я делаю», прежде чем «Могу ли я сделать это быстрее». Скорее всего, вам не нужно перерисовывать все при перемещении мыши - попробуйте измерить, посмотрите, достаточно ли это для вас. Перерисовка всего 1000 раз в секунду займет много времени, но не будет заметно отличаться от 60 раз в секунду (или даже меньше).

Если вы обнаружите, что можете «сделать это быстрее» - определите свои цели и оцените, что у вас есть в первую очередь. Ищите «двойную буферизацию», если вы хотите придерживаться базовых правил, подумайте о правильной трехмерной структуре DirectX / XNA или OpenGL, посмотрите, подходит ли вам WPF.

...