2012-04-28 6 views
6

Actualmente tengo una imagen en un lienzo que puedo mover libremente en mi aplicación en la que tengo dibujadas 6 capas de DrawingVisuals, pero parece ser bastante lenta. Estoy usando un RenderTargetBitmap para renderizar las imágenes. ¿Hay alguna manera más rápida de mostrar las imágenes en la imagen o en cualquier otro elemento del marco que pueda mover libremente en el lienzo?Renderizado de visualvisos rápido en WPF

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> 

código:

_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

¿podría describir en detalle qué tiene en _layers? –

+0

la matriz _layers contiene los drawingvisuals, que en realidad son los diferentes tipos de carreteras del mapa que estoy dibujando, representadas en una sola imagen. –

Respuesta

2

que tenía que hacer una cosa similar hace algún tiempo en que tuve que escribir mi propia aplicación SIG. Tuve que dibujar miles y miles de imágenes de dibujo, mis hallazgos fueron que RenderTargetBitmap no es una buena opción para las operaciones de mapa de bits, ya que no utiliza la aceleración gráfica de hardware. Silverlight tiene una clase más adecuada; WriteableBitmap que permite que su aplicación escriba directamente en el búfer de la GPU. El único problema con esto es que solo está disponible para Silverlight. Si desea utilizar un mapa de bits para sus operaciones, puede usar el equivalente de WriteableBitmap para WPF que es WriteableBitmapEx disponible here.

Como solo tiene 6 gráficos de dibujo en total, le sugiero que pase a utilizar un elemento de interfaz de usuario de nivel superior como Formas y demás.

+1

No puedo utilizar WriteableBitmapEx como DrawingBrush que no puedo dibujar un control. – lindexi

2

Mostrar Objetos visuales usando Render no es una buena solución. Si tiene un lienzo y desea renderizar su imagen visual, no necesita convertir imágenes en un mapa de bits, y si realiza la conversión, su imagen no se puede escalar por ninguna cantidad sin degradar la calidad (característica de los gráficos vectoriales) . Hay otra posibilidad: crea tu propio lienzo. Actualmente uso este método y no tengo problemas para dibujar miles de formas. Este es un ejemplo muy sencillo:

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); 
} 

} 

Use DrawingCanvas en lugar de Canvas clase.

Cuestiones relacionadas