6

目前我在画布上有一个图像,我可以在我的应用程序中自由移动,我在上面渲染了 6 层 DrawingVisuals,但它似乎很慢。我正在使用 RenderTargetBitmap 来渲染视觉效果。有没有更快的方法在图像或任何其他我可以在画布上自由移动的框架元素上显示视觉效果?

xml:

<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

前段时间我不得不做类似的事情,我必须编写自己的 GIS 应用程序。我必须绘制成千上万的绘图视觉效果,我的发现是RenderTargetBitmap位图操作不是一个好的选择,因为它没有使用图形硬件加速。Silverlight 有更合适的类;WriteableBitmap这允许您的应用程序直接写入 GPU 缓冲区。唯一的问题是它仅适用于 Silverlight。如果您想坚持为您的操作使用位图,那么您可以使用等效的WriteableBitmapfor WPF,它WriteableBitmapEx可以在此处获得。

由于您总共只有 6 个绘图视觉效果,我建议您转而使用更高级别的 UI 元素,例如 Shapes 等。

于 2012-04-28T11:11:53.073 回答
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);
}

}

使用 DrawingCanvas 而不是Canvas类。

于 2012-04-28T11:47:37.450 回答