2012-04-28 2 views
6

현재 캔버스에 DrawingVisuals 렌더링이 6 계층 인 응용 프로그램에서 자유롭게 이동할 수있는 이미지가 있지만 상당히 느립니다. RenderTargetBitmap을 사용하여 비주얼을 렌더링하고 있습니다. 이미지 나 캔버스에서 자유롭게 움직일 수있는 다른 프레임 워크 요소에 비주얼을 표시하는 더 빠른 방법이 있습니까?WPF에서 빨리 drawboilinguals 렌더링

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> 

코드 : 나는 내 자신의 GIS 응용 프로그램을 작성했다 어디에 얼마 전에 비슷한 일을했다

_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

_layers에 무엇이 있는지 자세히 설명해 주시겠습니까? –

+0

_layers 배열에는 드로잉하는 맵의 도로 유형이 실제로 다른 하나의 이미지에 렌더링되는 드로잉 비주얼이 포함됩니다. –

답변

2

. 드로잉 비주얼을 수천 개에서 수천 개를 그려야 만했습니다. 결과적으로 그래픽 하드웨어 가속을 사용하지 않아서 비트 맵 작업에 적합하지 않은 것으로 나타났습니다 (RenderTargetBitmap). Silverlight에는 더 적합한 클래스가 있습니다. WriteableBitmap을 사용하면 응용 프로그램이 GPU 버퍼에 직접 쓸 수 있습니다. 유일한 문제는 Silverlight에서만 사용할 수 있다는 것입니다. 비트 맵을 사용하여 작업을 수행하려면 WPF 용 WriteableBitmap (WriteableBitmapEx 사용 가능)을 사용할 수 있습니다. here.

총 6 개의 그림 비주얼이 있기 때문에 셰이프와 같은 상위 수준 UI 요소를 사용하는 것이 좋습니다.

+1

DrawableBrush로 WriteableBitmapEx를 사용하여 컨트롤을 그릴 수 없습니다. – lindexi

2

Render을 사용하여 시각적 개체를 표시하는 것은 좋은 해결책이 아닙니다. 캔버스가 있고 비주얼을 렌더링하고 싶다면 비주얼을 비트 맵으로 변환 할 필요가 없습니다. 변환을하면 품질을 떨어 뜨리지 않고 이미지의 크기를 조절할 수 없습니다 (벡터 그래픽의 기능) . 또 다른 가능성이 있습니다 : 자신 만의 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 클래스 : 이것은 매우 간단한 예입니다.