Как нарисовать линию из десяти тысяч точек с помощью WPF за 0,5 секунды? - PullRequest
21 голосов
/ 19 июля 2009

Я пишу WPF код для отображения графика в реальном времени, который представляет собой связанную линию, содержащую около 10000 баллов. Чтобы показать картинку на моем компьютере, требуется около 5 секунд. У кого-нибудь есть идея сделать это быстрее и за 0,5 секунды?

class eee : FrameworkElement
{

    public eee()
    {
        _children = new VisualCollection(this);
        Random rand = new Random();
        DrawingVisual dv = new DrawingVisual();
        using (DrawingContext dx = dv.RenderOpen())
        {
            Pen drawingPen = new Pen(Brushes.Black, 1);
            double x=rand.Next(300);
            double y = rand.Next(300);
            for (double i = 0; i < 1000; i = i + 0.1)
            {
                y = 100 + rand.Next(100);
                dx.DrawLine(drawingPen, new Point(i, x), new Point(i + 1, y));
                x = y;
            }
        }
         _children.Add(dv);
    }

Ответы [ 5 ]

39 голосов
/ 19 июля 2009

Чарльз Петцольд делает именно это. Это даже быстрее на моем хосте (<0,3 с), и точка даже DataBound! ;) </p>

Тамир Хасон также делает это со строками и углубляется в представление о растровом стиле WPF здесь .

Rico Mariani содержит рекомендации по высокопроизводительной 3D-графике, по существу, использование типов значений может улучшить вашу пропускную способность, если хорошо продумано.

Цзяньчжун Чжан дает мои новые любимые учебники по этой теме, трехмерный график рассеяния, несколько десятков тысяч точек данных, анимированных и интерактивных.

2 голосов
/ 19 июля 2009

Полагаю, пример кода: 1) тест, чтобы попробовать что-то, что на самом деле не является образцом, или 2) домашнее задание.

Попробуйте переопределить OnRender и сделайте что-то вроде:

Pen drawingPen = new Pen(Brushes.Black, 1);

protected override void OnRender(DrawingContext dc)
{
    dc.DrawRectangle(Background, null, new Rect(RenderSize));


            double x=rand.Next(300);
            double y = rand.Next(300);
            for (double i = 0; i < 1000; i = i + 0.1)
            {
                y = 100 + rand.Next(100);
                dc.DrawLine(drawingPen, new Point(i, x), new Point(i + 1, y));
                x = y;
            }


}

или для чего-то с реальными данными, подумайте, действительно ли вам нужно показывать каждую точку в зависимости от разрешения визуального контекста. (Если ваша шкала равна 0-10, а вы получаете очки 0,0001,0,00015, действительно ли они исчезли по вашей шкале)

1 голос
/ 19 июля 2009

Должны ли строки быть выбираемыми? Вы можете нарисовать линии на изображении, а затем предоставить его в качестве источника для управления изображением. Он будет рисоваться быстрее, но вы потеряете способность взаимодействовать с линиями.

0 голосов
/ 22 мая 2016

Моногамма , основанная на XNA, жива. Вы можете использовать его возможности для решения некоторых специальных задач, требующих огромной графической производительности, и даже внедрять его окна в графический интерфейс WPF.

0 голосов
/ 19 июля 2009

Рассматривали ли вы XNA ? Использование видеокарты ускорит процесс.

...