2012-04-28 17 views
6

Obecnie mam obraz na płótnie, który mogę swobodnie poruszać się w mojej aplikacji, na której mam 6 warstw renderowanych DrawingVisuals, ale wygląda na to, że jest dość wolny. Używam RenderTargetBitmap do renderowania wizualizacji. Czy istnieje szybszy sposób wyświetlania wizualizacji na obrazie lub na dowolnym innym elemencie szkieletowym, który mogę swobodnie poruszać się po płótnie?Szybkie renderowanie rysunków graficznych w 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> 

Kod:

_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

Czy mógłbyś opisać szczegółowo, co masz w _layers? –

+0

Tablica _layers zawiera rysunki, które są właściwie różnymi rodzajami dróg rysowanej mapy, renderowanymi na jednym obrazie. –

Odpowiedz

2

musiałem zrobić coś podobnego, gdzie jakiś czas temu miałem napisać własną aplikację GIS. Musiałem narysować tysiące rysunków graficznych, moje odkrycia były takie, że RenderTargetBitmap nie jest dobrym wyborem do operacji bitmapowych, ponieważ cierpi z powodu braku graficznego przyspieszania sprzętowego. Silverlight ma bardziej odpowiednią klasę; WriteableBitmap, dzięki czemu aplikacja może bezpośrednio pisać do bufora GPU. Jedynym problemem jest to, że jest dostępny tylko dla Silverlight. Jeśli chcesz używać mapy bitowej do operacji, możesz użyć odpowiednika WriteableBitmap dla WPF, który jest WriteableBitmapEx dostępny here.

Ponieważ masz tylko 6 rysunków graficznych w sumie, sugeruję przejście do używania elementu UI wyższego poziomu, takiego jak Kształty i inne.

+1

Nie mogę użyć WriteableBitmapEx jako DrawingBrush, że nie mogę narysować formantu. – lindexi

2

Wyświetlanie obiektów wizualnych za pomocą Render nie jest dobrym rozwiązaniem. Jeśli masz płótno i chcesz renderować obraz, nie musisz konwertować wizualizacji na bitmapę, także jeśli zrobisz konwersję, obraz nie może być skalowany dowolną ilością bez pogorszenia jakości (cecha grafiki wektorowej) . Jest jeszcze jedna możliwość: utwórz własne płótno. Obecnie używam tej metody i nie mam problemu z narysowaniem tysięcy kształtów. Jest to bardzo prosty przykład:

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

} 

Stosować DrawingCanvas zamiast Canvas klasa.