2012-01-03 2 views
19

잠재적으로 한 번에 수백 개의 파일을로드하고 가져올 수있는 WPF 매핑 프로그램을 만들고 있는데, 사용자가이 디스플레이를 확대/축소 및 이동하려는 경우가 있습니다. 이러한 파일 형식 중 일부는 수천 개의 점을 포함 할 수 있으며 어떤 종류의 경로로 연결될 가능성이 큽니다. 지원되는 다른 형식에는 TIFF 파일이 포함됩니다.WPF 시각적 레이어를 사용하는 고성능 그래픽

성능면에서 모든 데이터가 그려지는 단일 DrawingVisual을 사용하는 것이 더 좋습니까? 아니면로드 된 각 파일에 대해 새로운 DrawingVisual을 만들어야합니까?

누구든지 이에 대한 조언을 제공 할 수 있다면 많은 도움이 될 것입니다.

+2

[Microsoft Deep Zoom] (http://msdn.microsoft.com/en-us/library/cc645050 (v = v1) .aspx) – Ray

답변

32

스택 오버플로와 관련하여 많은 질문이 있지만, 대용량의 데이터를 화면에 그리는 가장 효과적인 방법 중 하나는 WriteableBitmap API를 사용하는 것입니다. codeplex의 WriteableBitmapEx 오픈 소스 프로젝트를 살펴 보는 것이 좋습니다. 공개, 이건 한 번 기여했지만 내 라이브러리가 아니야.

DrawingVisual, StreamGeometry, OnRender, Canvas로 실험 해 본 결과, 1,000 개 이상의 "객체"를 화면에 그려야 만 이러한 모든 작업이 넘어집니다. 캔버스의 가상화를 다루는 기법 (가상화된 캔버스의 경우 million items demo이 있음)에도 불구하고 천천히 내려 가기 전에 한 번에 볼 수있는 ~ 1000으로 제한됩니다. WriteableBitmap을 사용하면 비트 맵에 직접 액세스하여 그 (oldskool 스타일)을 그리면 수만 개의 객체를 신속하게 그릴 수 있습니다. 자신 만의 최적화 (멀티 스레딩, 세부 수준)를 자유롭게 구현할 수 있지만 해당 API에 대한 많은 만족을 얻지는 못합니다. 말 그대로 당신 스스로 일을하고 있습니다.

하나의주의 사항이 있습니다. WPF는 렌더링을 위해 GPU/테셀레이션에 CPU를 사용하지만 WriteableBitmap은 모든 것을 위해 CPU를 사용합니다. 따라서 채우기 속도 (프레임 당 렌더링되는 픽셀 수)가 CPU 성능에 따라 병목 현상이됩니다.

성능 렌더링이 정말로 필요한 경우, SharpDX (Managed DirectX)과 WPF를 사용한 interop을 살펴 보는 것이 좋습니다. 이렇게하면 GPU를 직접 사용하므로 최고의 성능을 얻을 수 있습니다. 시각적 당 렌더링 몇 가지 세부 사항과 많은 작은 DrawingVisuals를 사용

안부,

+0

감사합니다. , 이건 재미 있네. 이전에 GDI +를 사용하여 GIS 프로그램을 만들었으므로 WPF 그래픽을 사용하는 것을 선호합니다. GPU를 사용하는 무언가를 시도하는 것을 선호합니다. "객체"라고 할 때, 비주얼 객체를 의미합니까, 아니면 하나의 비주얼 계산에서 여러 줄을 여러 객체로 말합니까? – Greg

+0

안녕하세요 그렉, 내가 객체를 말했을 때, 렌더링 된 항목을 의미했는지, GDI 또는 WPF 비주얼 등으로 그려지는지 여부 ... wpf의 GPU 가속화와 관련하여 모든 성능 향상은 CPU 측 레이아웃 및 테셀레이션에 의해 손실됩니다. http://goo.gl/1nCpw에서 비트 맵 방식으로 수행 할 수있는 작업에 대한 데모를 보거나 http://goo.gl/ohLFj에서 wpf 렌더링 프리미티브를 사용하여 다른 유사한 구성 요소와 비교해보십시오. –

+0

WriteableBitmapEx가 많은 것을 만들었던 [질문] (http://stackoverflow.com/questions/22599806/speeding-up-an-l-system-renderer-in-c-wpf/22727519?noredirect=1#comment34646163_22727519) 빠릅니다. – dharmatech

10

시각적 당 렌더링 자세한 적은 DrawingVisuals에 비해 내 경험에 더 나은 성능을했다. 또한 다시 그리기가 필요할 때 모든 비주얼을 삭제하고 새 비주얼을 렌더링하는 것이 기존 비주얼을 재사용하는 것보다 빠르다는 사실을 발견했습니다. 각지도를 다수의 비주얼로 분해하면 성능을 향상시킬 수 있습니다.

성과와 관련하여 타이밍 테스트를 자체 시나리오와 함께 수행하는 것이 가장 좋은 방법입니다.

+1

이것은 원래 질문의 맥락에서 더 나은 대답입니다. –

+0

감사합니다. Repo Man. –

관련 문제