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