c#(UWP)でグラフを遅延なくリアルタイムプロットしたい
C#の初心者です。
windows10でUWPを使ってリアルタイムでグラフをプロットするようなスクリプトを書いています。
グラフのライブラリはOxyPlotを使用しています。
具体的にはデータが逐次入っていって、データが500個溜まると、右から左へグラフがスライドするというものです。
ここまでは実現できたのですが、そのままプログラムを動かし続けると、だんだんとグラフがカクカクとスライドするようになり、0.8秒から1秒ほど止まってはスライドしてまた止まるという挙動を繰り返しています。
グラフをスライドしている間はGC Collectionは頻繁に作動している状態です。
グラフを描画するコードの最初と最後に時間を測って実行時間(コードの中のDifference_time)を算出しづづけているのですが、
プログラムの実行時間が長くなるにつれてこの実行時間も長くなってしまいます。
その結果、グラフがスライドするときに止まったり動いたりという挙動を繰り返しています。
グラフが一時的に止まらずにスムーズにスライドする状態を維持したいのですが、
なぜこのような現象が起きているのでしょうか?
GCCollectionが動いていてもメモリーがなくなっているからでしょうか?
それともそれぞれのコードの小さな実行時間が積み重なった結果グラフが止まってしまうのでしょうか?
改善策を教えていただきたいです。
グラフの描写は、Task.Run(() => Graph());で別スレッドを立てて非同期で実行して、
グラフの値はずっと1000で固定しています。
該当のソースコード
private int cnt = 0; private async Task Graph() { while (true) { //計測開始時間を算出 var start_time = long.Parse(DateTime.Now.ToString("yyyyMMddHHmmssffff")); //グラフの値は一定で試してみる int number = 1000; //グラフの初期設定(軸のメモリやタイトルなど) var newMyModel = new PlotModel { Title = "Example 1" }; MyModel = newMyModel; MyModel.Axes.Add(new LinearAxis { Position = AxisPosition.Bottom, Minimum = 0.0, Maximum = 300.0, Title = "X軸" }); MyModel.Axes.Add(new LinearAxis { Position = AxisPosition.Left, Minimum = 0.0, Maximum = 5000.0, Title = "Y軸" }); line = new LineSeries(); line.Color = OxyColors.Blue; MyModel.Series.Add(line); //グラフの値(number)を投入 line.Points.Add(new DataPoint(cnt, number)); await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, async () => { //ここでUIのviewにグラフを表示させる GraphPloting.Model = MyModel; }); if (line.Points.Count > 500) { //500個データが溜まったら、軸移動 MyModel.Axes.Clear(); MyModel.Axes.Add(new LinearAxis { Position = AxisPosition.Bottom, Minimum = cnt - 500, Maximum = (cnt - 500) + 500 }); //x軸の設定 } else { //500個溜まるまでは軸はスライドさせない MyModel.Axes.Clear(); MyModel.Axes.Add(new LinearAxis { Position = AxisPosition.Bottom, Minimum = 0.0, Maximum = cnt }); //x軸の設定 } if (line.Points.Count > 500) { //軸移動によってはみ出した値を消す line.Points.RemoveAt(0); } //横軸の値を増やす cnt += 1; //終了時間を計測 var end_time = long.Parse(DateTime.Now.ToString("yyyyMMddHHmmssffff")); //ここでどんどん計算時間が増えていく Debug.WriteLine("Difference_time: " + (end_time - start_time)); //ここで移動した軸やグラフの値を更新。 //しかし上記のDifference_timeが増えるにつれてグラフのスライドがカクカクして度々0.8秒ほど止まってしまう MyModel.InvalidatePlot(true); } }
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/08/30 00:40
2019/08/30 03:07
2019/08/31 02:41
2019/08/31 05:46
2019/08/31 06:41
2019/09/02 02:00