3

現在、WPF で WriteableBitmap を使用してブロードバンド ソナー ディスプレイを実装しています。ブロードバンド ソナーの「ウォーターフォール」表示は一番上から始まり、時間が進むにつれて履歴データが下に移動し、最初の「行」には常に現在の状況が表示されます。

技術的には、最初に WriteableBitmap.CopyPixels() を使用してビットマップのコンテンツを下に移動し、その後、配列を更新してディスプレイの現在の行 (上部) を更新します。

私の問題は、ビットマップの更新中に画面がちらつくことです。私は、WritePixels の独自の実装を作成しようとしました。

 public static unsafe void WritePixels(WriteableBitmap writeableBitmap, BitmapProperties bitmapProperties)
    {

       writeableBitmap.Lock();
       IntPtr buff = writeableBitmap.BackBuffer;

       byte* pbuff = (byte*)buff.ToPointer();

        for (int i = 0; i < bitmapProperties.BitmapArray.Length; i += bitmapProperties.BytesPerPixel)
        {
            pbuff[i] = bitmapProperties.BitmapArray[i];
            pbuff[i + 1] = bitmapProperties.BitmapArray[i + 1];
            pbuff[i + 2] = bitmapProperties.BitmapArray[i + 2];
            pbuff[i + 3] = bitmapProperties.BitmapArray[i + 3];

        }

        writeableBitmap.AddDirtyRect(new Int32Rect(0, 0, (int)writeableBitmap.Width, (int)writeableBitmap.Height));
        writeableBitmap.Unlock();

    }

残念ながら、オクトームは同じです。

ここでいくつかの同様の質問(医療用超音波ディスプレイの実装)を見てきましたが、サードパーティのC++インターフェイスから画像を取得するのではなく、自分でビットマップを「描画」してコピーするため、ここでのユースケースはわずかに異なります(変更/ビットマップ配列のコピー)。レンダリング (ビットマップの更新) は ~ 250 ミリ秒ごとに行われます。

ここで私の最良の選択は何ですか...キャッシュされたビットマップで作業しますか? WPF での低レベルのビットマップ操作に関しては、あまり経験がありません (WPF 4.5 を使用しています)。

ありがとう。

編集: C++/DirectX で記述された参照アプリケーションと比較しました: 驚いたことに、「ちらつき」が発生しているのがわかります。それは、いくつかの光学的効果、目の邪魔などである可能性があります。それにもかかわらず、私の現在の実装よりも優れたアプローチがあるかどうかという質問はまだ有効です。

4

2 に答える 2

0

画像全体を更新するのに時間がかかりすぎるかどうかを測定しようとしましたか? たぶん、ダブルバッファリングがあなたを助けることができます:

  • ビットマップ全体をコピー
  • 変更を追加するか、バックグラウンド スレッドで画像のコピーを代替します
  • 作業が完了したら、準備した画像をバックグラウンド スレッドから現在表示されている画像に切り替えます
  • 再び、現在表示されていない画像に変更を加えます...
于 2013-03-17T16:23:11.697 に答える