2012-04-28 15 views
6

Attualmente ho un'immagine su una tela che posso spostarmi liberamente nella mia applicazione su cui sono rappresentati 6 livelli di DrawingVisuals, ma sembra essere piuttosto lento. Sto usando un RenderTargetBitmap per visualizzare le immagini. C'è un modo più veloce per visualizzare le immagini sull'immagine o su qualsiasi altro elemento di struttura che posso liberamente spostare sulla tela?Rendering di disegni veloci in 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> 

codice:

_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

potresti descrivere in dettaglio cosa hai in _layers? –

+0

l'array _layers contiene le miniature di disegno, che sono in realtà il diverso tipo di strade della mappa che sto disegnando, visualizzate su una singola immagine. –

risposta

2

ho dovuto fare una cosa simile qualche tempo fa in cui ho dovuto scrivere la mia applicazione GIS. Ho dovuto disegnare migliaia e migliaia di immagini grafiche, i miei risultati sono stati che RenderTargetBitmap non è una buona scelta per le operazioni bitmap in quanto soffre di non utilizzare l'accelerazione grafica dell'hardware. Silverlight ha una classe più adatta; WriteableBitmap che consente alla tua applicazione di scrivere direttamente nel buffer della GPU. L'unico problema è che è disponibile solo per Silverlight. Se si desidera attenersi a utilizzare una bitmap per le operazioni, è possibile utilizzare l'equivalente di WriteableBitmap per WPF che è WriteableBitmapEx disponibile here.

Come hai solo 6 immagini di disegno in totale, ti suggerisco di passare a utilizzare un elemento dell'interfaccia utente di livello superiore come forme e così via.

+1

Non posso usare WriteableBitmapEx come DrawingBrush che non posso disegnare un controllo. – lindexi

2

Visualizzazione Gli oggetti visivi utilizzando Render non sono una buona soluzione. Se hai un Canvas e vuoi renderizzare il tuo visuale non hai bisogno di convertire gli elementi visivi in ​​un bitmap, anche se se fai la conversione la tua immagine non può essere ridimensionata di alcun valore senza qualità degradante (caratteristica della grafica vettoriale) . C'è un'altra possibilità: crea la tua tela. Attualmente utilizzo questo metodo e non ho problemi a disegnare migliaia di forme. Questo è un esempio molto semplice:

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

} 

Uso DrawingCanvas invece di Canvas di classe.