最近のアプリケーションでも同様の問題が発生しました。ズームアウトすると、視覚化(単純な線グラフ)が乱雑になりすぎて、データの全範囲を表示できなくなったため(約7日間のサンプルで、サンプルは6秒ごとに取得されました)、実際にはダウンサンプリングが最適でした。 。そうしなかった場合、ズームアウトしてもあまり意味がありません。画面上に塗りつぶされた大きな線の塊だけが表示されるからです。
それはすべて、ダウンサンプリングをどのように実装するかによって異なります。2つの(単純な)アプローチがあります。サンプルを取得した瞬間にダウンサンプルするか、表示時にダウンサンプルします。これらの両方の場合に実際にパフォーマンスを大幅に向上させるのは、データソースを適切に選択することです。
700万のサンプルがあり、表示ウィンドウが最後の100万ポイントに関心があるとします。実装がIEnumerableに依存している場合、これは、IEnumerableが実際に開始する前に600万回MoveNextを実行する必要があることを意味します。ただし、ランダム読み取り用に最適化されたものを使用している場合(リストが思い浮かびます)、多かれ少なかれ次のように、そのための独自の列挙子を実装できます。
public IEnumerator<T> GetEnumerator(int start, int count, int skip)
{
// assume we have a field in the class which contains the data as a List<T>, named _data
for(int i = start;i<count && i < _data.Count;i+=skip)
{
yield return _data[i];
}
}
明らかにこれは非常に単純な実装ですが、forループ内で好きなことを行うことができます(平均化するために周囲のサンプルに基づくアルゴリズムを使用しますか?)。ただし、このアプローチでは通常、信号の極端なスパイクが滑らかになるため、注意が必要です。
別のアプローチは、さまざまな範囲のデータセットの一般化されたバージョンを作成することです。これは、新しい信号を受信するたびに自動的に更新されます。通常、完全なデータセットを更新する必要はありません。セットの最後を更新するだけでおそらく十分です。これにより、データの処理をもう少し高度に行うことができますが、より多くのメモリが必要になります。アプリケーションの詳細の個別の「レイヤー」をキャッシュする必要があります。
ただし、(短い)説明を読むと、表示時間の最適化で十分だと思います。一般化すると、常に信号に歪みが生じます。あなたは常にデータを失います。この歪みがどのように発生し、どの程度目立つかは、選択するアルゴリズム次第です。