1

C# 形式のデータを視覚化しようとしています。私はこれを行うことができるいくつかの方法を考えてきましたが、C# で何が最善の方法であるかを理解できません。

まず、ペイントで作成した例を示します。

例
(出典: interstyles.nl )

私ができると思ったいくつかの方法:

  1. すべてのデータを含む 1 つの巨大な絵を描き、フォーム内で絵をスクロールするだけです。データが非常に広くなる可能性があるため、これはあまり良いことではありません。通常、幅が約 36000 ピクセルのデータがあると予想されるため、非常に大きな画像になります。プログラミングは簡単ですが、多くのメモリが必要です。

  2. 1 つと同じですが、高さ 1 ピクセルのみのデータ行ごとに個別の画像があり、画面に表示するときに拡大します。プログラミングは難しくなりますが、多くのメモリを節約できます。また、データの並べ替えや行のオン/オフの切り替えも簡単になります。手短に言えば、画面は複数の画像が重なり合って構築されます。

  3. スクロールバーの位置に応じて、フォームのサイズの画像に表示されているデータのみを描画します。プログラミングがより難しく、これで十分速いかどうか疑問に思います。

  4. C# にもグラフ機能がありますが、このようなものを作成する方法が見つかりません。

  5. 私がまだ知らなかった他のライブラリ。

また、マウスポインターをその上に置いたときに特定のイベントに関する情報を取得できればと思いますが、オプション 1、2、および 3 では難しいでしょう..または、少なくともかなりのプログラミング作業が必要です..

提案してください

4

2 に答える 2

0

すべての可視ポイントを描画します (スクロールバーの値と幅に基づいてビューポートを取得することは問題ではないと述べました)。多くを最適化する必要はありません。ただ見つけてminTimemaxTimeすべてのポイントを進めてください。非表示のピクセルを描画しようとしても何も描画されず、配列を通過するのはとにかく非常に高速であるため、本当に必要かどうかは疑問です。いくつかのピクセルを描画すると、それ以上の時間がかかります。

ダブルバッファリングが有効になっていることを確認します。

[System.ComponentModel.DesignerCategory("Code")]
public class MyGraph : PictureBox
{
    public MyGraph()
    {
        SetStyle(ControlStyles.ResizeRedraw | ControlStyles.OptimizedDoubleBuffer | ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint, true);
    }
    ...
}

本当に何かを最適化する必要がある場合 (たとえば、ユーザーがマウスを動かしたときに情報データを描画する場合)、キャッシュを使用しビットマップに描画し、次に bitblt ( DrawImage) ビットマップだけを描画できます。この回答を参照するか、 bitmap からグラフィックを検索してください。キャッシュされたデータが無効になった場合 (スクロール時、サイズ変更時など) に対処する必要があります。

もう 1 つの可能性は、更新を最適化することです (たとえば、描画されたデータが定期的に更新される場合)。このためにはMyGraph、基になるデータで何が変更されたかを通知したり、キャッシュが無効になるたびに決定したり、変更を描画してキャッシュされたビットマップを更新したりするためのメソッドを提供する必要があります。

もう1つ、本当にオーバーヘッドですが、最適化です。可能な限りビットマップに近いものにデータを保持できます。そうすれば、描画関数MyGraphは単純にビットマップを描画します (これは高速で、クライアント ビューポートをサポートします)。この方法の更新は、そのピクセルを変更してを呼び出すのと同じくらい簡単Invalidate()です。

于 2014-05-19T13:06:29.297 に答える