カメラからライブビデオ画像を読み込み、その画像の上にオーバーレイを表示するアプリケーションに取り組んでいます。オーバーレイは頻繁に変化しないため、静止していると見なすことができます。ただし、通常は約 1,000 ~ 10,000 行が含まれます。ビデオ画像が更新されると、オーバーレイが表示されるかどうかに応じて、CPU 負荷に顕著な影響があります。オーバーレイは無効化も変更もされず、背後の画像だけが変更されます。
私のセットアップはこれです:
<Canvas>
<Image/>
<Canvas>
<OverlayElement 1/>
<OverlayElement 2/>
<OverlayElement 3/>
<.../>
</Canvas>
</Canvas>
イメージのソースは WriteableBitmap です。新しいカメラ画像 (byte[] 型) が利用可能になるたびに、メイン Canvas の Dispatcher が呼び出され、WriteableBitmap.WritePixels() を使用して画像データが書き込まれます。
内側の Canvas には、すべてのオーバーレイ要素が含まれています。輪郭 (PolyLine)、円 (EllipseGeometry を含むパス)、および光線のセット (LineSgements を含む 1 つの Figure を含むパス) です。輪郭の点の数 n は、最後に述べたパスの線セグメントの数と同じです。n は通常、約 1,000 ~ 3,000 です。
オーバーレイに表示される線の数と長さによって、オーバーレイが変化しない場合でも、ライブ画像を表示するための CPU 負荷が異なります (長さまたは数が増えると増加します)。ある時点で、これはフレーム レートに影響し、プログラムが使用できなくなります。線の長さは主に線の交点と相関しているため、パスがペイントされていないにもかかわらず、パスが塗りつぶし領域を計算するのに苦労している可能性がありますか?
では、ここでパフォーマンスを向上させるにはどうすればよいでしょうか。私を最も悩ませているのは、オーバーレイが変更されていなくても、プリミティブの数に応じてレンダリング時間が長くなることです。オーバーレイが最後に設定された状態で描画されると、レンダリング時間が一定になると予想されます。オーバーレイ全体をビットマップにレンダリングする以外に、それを達成するために何ができますか?
また、バイト[]をより効率的に画面に表示する方法についての提案にも心を開いています。この問題はより大きなアプリケーションの一部であり、画像を描画する方法に集中するすべてのパラダイムを変更することはできません.
私がこれまでに試したこと:
内側の Canvas の OnRender() メソッドをオーバーライドして、自分でオーバーレイを描画します。これは正常に動作しますが、ここに私をもたらすパフォーマンスの問題があります;)
Shapes (PolyLine、Ellipse、Path) を内側の Canvas の子として使用して、オーバーレイ要素を保持します。これも機能します。オーバーレイが変更されたときに再描画する方が高速ですが、一方で背景画像を更新するときのパフォーマンスの問題が悪化します。
2. と同様ですが、可能な限りジオメトリに対して Freeze() を使用してください。パフォーマンスへの影響はまったくないか、ほとんどありません。
事前にご協力いただきありがとうございます。