在WPF中快速渲染drawingvisuals

时间:2012-04-28 11:04:15

标签: c# wpf drawing drawingcontext

目前我在画布上有一个图像,我可以在我的应用程序中自由移动,我有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;

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分: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 class。