WPF
performance
myVisualStudioStudy
LiveCharts

Visual Studio | WPF > グラフ > LiveCharts > 折れ線グラフ描画のパフォーマンス > 1000点: zoomingとpanningが重い | 1万点: 表示されない

動作環境
Windows 8.1 Pro (64bit)
Microsoft Visual Studio 2017 Community
Sublime Text 2

関連

c++ builder > TeeChart > 1つのグラフ:データ数20万件で固まる / 複数のグラフ: トータルデータ数20万件で固まる

C++ Builderでは20万件でのデータポイントでグラフが固まった。
WPF+LiveChartsではどうか。

動作環境
Windows 8.1 pro (64bit)
Core i7-6700 3.40GHz
4.0GB RAM

code

MainWindow.xaml
<Window x:Class="_171127_t1200_tooManyPoints.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:_171127_t1200_tooManyPoints"
        xmlns:lvc="clr-namespace:LiveCharts.Wpf;assembly=LiveCharts.Wpf"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <StackPanel>
            <lvc:CartesianChart Series="{Binding seriesCollection}" Height="250"
                                LegendLocation="Right"
                                Zoom="Xy"/>
        </StackPanel>
    </Grid>
</Window>
MainWindow.xaml.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
// 以下を追加した
using LiveCharts;
using LiveCharts.Wpf;

namespace _171127_t1200_tooManyPoints
{
    /// <summary>
    /// MainWindow.xaml の相互作用ロジック
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            graph_init();
        }

        private void graph_init()
        {
            gd = new GraphData();

            var sc = new SeriesCollection {
                new LineSeries
                {
                    Title = "napier",
                    Values = new ChartValues<double> { 2, 7, 1, 8, 2, 8, 1, 8 }                    
                }
            };

            graph_add_series(sc);
            gd.seriesCollection = sc;
            this.DataContext = gd;
        }

        static readonly int kNumPoint = 1000; /****************************/

        private void graph_add_series(SeriesCollection sc)
        {
            var lnsr1 = new LineSeries();
            lnsr1.Title = "pi";
            lnsr1.Values = new ChartValues<double> { };
            lnsr1.Fill = Brushes.Transparent;
            lnsr1.PointGeometry = null;
            //
            var gen = new System.Random();
            for (int idx = 0; idx < kNumPoint; idx++)
            {
                var tmp = gen.NextDouble() * 10.0;
                lnsr1.Values.Add(tmp);
            }
            sc.Add(lnsr1);
        }

        GraphData gd;
        public class GraphData
        {
            public SeriesCollection seriesCollection { get; set; }
        }
    }
}

結果

1000点

描画はされる。
zoomingやpanningの動作が重く感じる。

qiita.png

1万点

30秒程度待ったが描画される気配はない。

最適な描画方法は別途あるのだろうか。

30 Series 10k points each
を見ると、もっと軽快な感じではないかと思うが何が違うのだろうか。
Geared(68.9 USD)を使わないと無理なのだろうか。

https://lvcharts.net/licensing/pricing

and plot millions of points in practically no time,

30 Series 10k points eachでは下記の処理で描画点数を減らしているように思う。

Values = values.AsGearedValues().WithQuality(Quality.Low)

パフォーマンスチューニング

Improve Performance