6

現在、6 層の DrawingVisuals がレンダリングされているアプリケーションで自由に移動できるキャンバス上の画像がありますが、かなり遅いようです。ビジュアルをレンダリングするために RenderTargetBitmap を使用しています。画像またはキャンバス上で自由に移動できる他のフレームワーク要素にビジュアルを表示するより高速な方法はありますか?

xaml:

<Canvas>
    <Image Height="505" HorizontalAlignment="Left" Margin="0,0,0,0" Name="_MapImage" Stretch="Fill" VerticalAlignment="Top" Width="700" MouseLeftButtonDown="_MapImage_MouseDown" MouseWheel="_MapImage_MouseWheel" MouseLeftButtonUp="_MapImage_MouseUp" MouseMove="_MapImage_MouseMove" />
</Canvas>

コード:

_renderRoutesBitmap = new RenderTargetBitmap((int)(_MapImage.Width), (int)(_MapImage.Height), 96, 96, PixelFormats.Default);

for (int i = 6; i < 8; ++i)
{
     if((layerCode / (int)Math.Pow(10,i) % 2) == 1)
     _renderRoutesBitmap.Render(_layers[i]); //takes too much time
}
_RouteImage.Source = _renderRoutesBitmap;
4

2 に答える 2

2

Renderを使用してビジュアルオブジェクトを表示することは、適切なソリューションではありません。Canvasを使用していて、ビジュアルをレンダリングする場合は、ビジュアルをビットマップに変換する必要はありません。また、変換を行う場合は、品質を低下させずに画像を拡大縮小することはできません(ベクターグラフィックの機能)。 。別の可能性があります:独自のCanvasを作成します。私は現在この方法を使用しており、何千もの図形を描くのに問題はありません。これは非常に単純な例です。

public class DrawingCanvas : Panel
{


public List<Visual> visuals = new List<Visual>();


public void AddVisual(Visual visual)
{
    if (visual == null)
        return;
    this.visuals.Add(visual);

    base.AddVisualChild(visual);
    base.AddLogicalChild(visual);
}



public void RemoveVisual(Visual visual)
{
    if (visual == null)
        return;
    this.visuals.Remove(visual);

    base.RemoveVisualChild(visual);
    base.RemoveLogicalChild(visual);
}

}

Canvasクラスの代わりにDrawingCanvasを使用します。

于 2012-04-28T11:47:37.450 に答える
2

少し前に、独自の GIS アプリケーションを作成する必要があり、同様のことをしなければなりませんでした。何千もの描画ビジュアルを描画する必要RenderTargetBitmapがありましたが、グラフィック ハードウェア アクセラレーションを使用していないため、ビットマップ操作には適していないことがわかりました。Silverlight にはよ​​り適切なクラスがあります。WriteableBitmapこれにより、アプリケーションは GPU バッファーに直接書き込むことができます。これに関する唯一の問題は、Silverlight でしか利用できないことです。操作にビットマップを使用することに固執したい場合は、ここで入手できるWriteableBitmapWPF に相当するものを使用できます。WriteableBitmapEx

全部で 6 つの描画ビジュアルしかないので、Shapes などのより高いレベルの UI 要素を使用するように移行することをお勧めします。

于 2012-04-28T11:11:53.073 に答える