2

約1000本の線を描く必要があります。これらの行は 1 秒あたり約 25 回変更されます (つまり、1 秒あたり 25000 行)。そうしている間、許容できるパフォーマンスを得るために何を使用できますか? このソフトウェアは、デフォルトで directX を持たないサーバー上でも実行する必要があるため、私は directX 呼び出しを使用しないことを好みます。

2 つの異なる方法でこれを実行しようとしましたが、CPU が溶けてしまいました。

Setup1 - 標準の .NET 呼び出し:

  • ダブルバッファパネル
  • メモリ ビットマップへの描画 (Graphics.DrawLine による線の消去と再描画)
  • Graphics.DrawImageUnscaled でビットマップをパネルにコピーする
  • プロファイラーは、これらの 2 つのグラフィックス呼び出しがボトルネックであると言います

Setup2 - gdi の dllimport 呼び出し:

  • ダブルバッファパネル
  • gdi の MoveToEx と LineTo を使用してメモリ ビットマップに描画する
  • BitBlt を使用してビットマップをパネルにコピーする
  • プロファイラーは、これらの管理されていない呼び出しがボトルネックであると言います

Winforms の代わりに WPF を使用すると、パフォーマンスは向上しますか? または、directX またはサードパーティのライブラリを使用して、これを行う唯一の方法はありますか?

乾杯

4

3 に答える 3

0

私ができる唯一のアドバイスは、ハードウェアに直接アクセスしているように見えるので、標準のダブルバッファリング方法を使用することです. ハードウェアがサポートしている場合はマルチスレッドと組み合わせるか、描画する準備ができているビットマップのコレクションのような単なるメモリ キューと組み合わせると、プロセッサは 1 回の IO 操作 (画面描画) にかかる時間で数千のメモリ操作を実行できることを覚えておいてください。 )。文字通り、データを取得してインメモリ サーフェス (必要に応じてビットマップ) に変換し、特定の「バッファ サイズ」(コレクション サイズ) に達した後、それらをジェネリック コレクションに順番に追加し続けるプロセスを持つことができます。次の 5 分間の画像については、パネルのプロセスによってさらに多くのコレクションが消費されるまで待機するようにコーディングできます。次に、OnPaint の同等のパネルで、スタックの一番下からメモリ サーフェスを取得し、現在のものをコレクションの一番下のものと交換します。他のスレッドが自然に高速になるため、描画タスクのスレッドにより多くの処理優先度を与えることができます。スレッド セーフになるように、異なるスレッドでメモリ サーフェスのコレクションをロックすることを忘れないでください。幸運を。

于 2012-09-27T23:45:15.893 に答える
0

呼び出しのオーバーヘッドが制限要因になる場合があります。通常の GDI には、1 回の呼び出しで多数の線を描画できるPolyPolyline関数があります。すべての線が接続されている場合は、より単純なPolyline関数もあります。それらに相当するGDI +があると思います。私はそれらでプロファイルします。これらの関数に必要な配列に座標をまとめるのにいくらかの作業が必要な場合でも、個々の線描画関数を 1000 回まで呼び出すよりも高速になる可能性があります。

于 2012-08-25T15:39:05.967 に答える