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