Подтвердить что ты не робот

Как нарисовать линию из десяти тысяч точек с WPF в течение 0,5 секунды?

Я пишу код WPF, чтобы показать график в реальном времени, который является подключенной линией, содержащей 10 000 пунктов. Для отображения изображения на моем компьютере требуется около 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);
    }
4b9b3361

Ответ 1

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

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

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

Jianzhong Zhang дает мои новые любимые уроки по этому вопросу, 3D-рассеивание рисует несколько десятков тысяч точек данных, анимированных и интерактивных.

Ответ 2

Я думаю, что пример кода: 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, они действительно отличаются от вашего масштаба)

Ответ 3

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

Ответ 4

Вы считали XNA? Использование графической карты ускорит работу.

Ответ 5

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