C# 在WPF中快速渲染绘图视觉效果

C# 在WPF中快速渲染绘图视觉效果,c#,wpf,drawing,drawingcontext,C#,Wpf,Drawing,Drawingcontext,目前,我有一个画布上的图像,我可以在我的应用程序中自由移动,我有6层DrawingVisuals渲染,但它似乎相当慢。我正在使用RenderTargetBitmap在上渲染视觉效果。有没有一种更快的方法可以在图像上或画布上自由移动的任何其他框架元素上显示视觉效果 xaml: 代码: \u renderRoutesBitmap=新的RenderTargetBitmap((int)(_-MapImage.Width),(int)(_-MapImage.Height),96,96,PixelFor

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

xaml:


代码:

\u renderRoutesBitmap=新的RenderTargetBitmap((int)(_-MapImage.Width),(int)(_-MapImage.Height),96,96,PixelFormats.Default);
对于(int i=6;i<8;++i)
{
如果((层代码/(int)数学功率(10,i)%2)==1)
_renderRoutesBitmap.Render(_layers[i]);//花费太多时间
}
_Source=\u renderRoutesBitmap;

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


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

使用显示视觉对象不是一个好的解决方案。如果您有画布,并且希望渲染视觉效果,则不需要将视觉效果转换为位图,同样,如果进行转换,则在不降低质量(矢量图形的功能)的情况下,图像无法按任何数量缩放。还有另一种可能性:创建自己的画布。我目前使用这种方法,并且可以画上千个形状。这是一个非常简单的例子:

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:面板
{
公共列表视觉效果=新列表();
公共void AddVisual(可视)
{
如果(可视==null)
返回;
this.visuals.Add(可视);
base.AddVisualChild(可视);
base.AddLogicalChild(可视);
}
public void RemoveVisual(可视)
{
如果(可视==null)
返回;
此.visuals.Remove(可视);
base.RemoveVisualChild(可视);
基础。RemovelogicChild(可视);
}
}

使用DrawingCanvas而不是类。

你能详细描述一下你的图层吗?图层数组包含drawingvisuals,它们实际上是我正在绘制的地图的不同类型的道路,在单个图像上渲染。我不能使用WriteableBitmapEx作为DrawingBrush,因为我不能绘制控件。您有使用硬件加速的WriteableBitmap示例吗?
_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;
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);
}

}