2012-05-29 4 views
1

저는 XNA/WinForms를 기반으로하는 기존 타일 맵 편집기를 WPF로 마이그레이션하는 작업을하고 있습니다. 저는 WPF에 익숙하지 않지만 개념의 대부분은 파악하기가 어렵지 않았습니다. Viewbox에서 파생 된 DrawingContext의 DrawImage 메서드를 사용하여 ScrollViewer에 포함 된 Viewbox를 OnRender 메서드에서 파생시켜지도를 그립니다. 문제는 XNA/WinForm 버전과 비슷한 성능을 보이는 곳이라면 화면에 많은 양의 타일이있을 때 얻을 수 없다는 것입니다. 확대/축소 및 패닝을 구현했지만 너무 많이 축소하거나 화면에 많은 양의 타일이있는 경우에는 사용자 경험을 망칠 주요 지연이 있습니다. 몇 가지 분명한 최적화 조치 (소스 비트 맵 고정, 볼 수없는 타일 제거, 비트율 조정 모드를 LowQuality로 설정, 캐시 캐싱 힌트 제공)를 수행했지만 문제를 해결하지 못하는 것 같습니다. 이 문제는 WPF가 DrawingContext를 사용하여 텍스처 쿼드를 그리는 방식에서 분명히 나타납니다.WPF 슬로우 타일 맵 렌더링 성능

SampleGridDrawingExample이 마우스 가운데 버튼을 누른 상태에서 이동하려면 마우스를 이동 :

나는 문제를 재현하는 데 필요한 모든 코드와 예제 응용 프로그램을 제공하고 있습니다. 창의 크기가 커질수록 더 많은 눈에 띄게됩니다 (분명히 더 많은 타일이 렌더링되기 때문입니다).

WPF 내에 DrawingContext보다 빠른 방법으로 많은 양의 텍스처가있는 합리적인 성능의 쿼드를 그립니다. XNA/WinForms를 사용하면 합리적인 지연으로 여러 레이어에서 ~ 50000 개의 타일을 그릴 수 있습니다. WPF에서는 현재 접근 방식을 사용하여 1000 이상의 눈에 띄는 지연 (> 10000이 응용 프로그램을 크롤링 함)을 유발합니다.

답변

0

WPF만으로는 XNA의 성능에 가깝지는 않습니다. 그러나 XNA 통합에 대한 Nick Gravelyns post을 살펴본 후에는 성능이 개발중인 응용 프로그램에 적합하기 때문에 거기에 나열된 방법을 사용하여 해결했습니다.샘플을 약간 수정하고 스트레스 테스트를 한 후, 프로덕션 코드를 충분히 안정적으로 만들 수있었습니다. XNA-> WPF 통합에 관심이있는 사람이라면 누구나 해당 게시물을 살펴볼 것을 강력하게 제안합니다.

0

샘플을 다운로드했는데 성능이 저조하지 않습니다. 하지만 성능을 모니터링 할 경우 마우스를 움직일 때마다 수행하는 계산에 병목 현상이있는 것 같습니다. 마우스를 많이 움직일 때 (이미지의 왼쪽 절반) 자주 이동하지 않을 때 (오른쪽 절반) CPU 사용량을 보여주는 첨부 스크린 샷을 참조하십시오.

CPU usage

나는 렌더링이 일을 속도가 느려 것이 아니다 생각하지만 이벤트 핸들러에서 다른 코드. 확인하려면 정확히 내 컴퓨터 (Good CPU, 보통 GPU)에서 똑같은 방식으로 동작하는 RenderOptions.ProcessRenderMode = System.Windows.Interop.RenderMode.SoftwareOnly;을 설정합니다. Memleak 문제에 대해서도 체크했는데, 괜찮 았어. 내 64Bit 창에서 메모리 사용량이 64Ms를 초과하지 않으며 가비지 수집이 리소스를 효율적으로 비울 수 있습니다.

이전 솔루션에 대해 언급했습니다. 해당 솔루션의 어느 부분이 XNA를 기반으로 했습니까? XNA는 하드웨어 가속에 의존합니다 (WPF는 기본적으로 WPF를 사용합니다). 반면에 WinForms는 순전히 CPU 가속입니다. 누가 당신의 오래된 마술, CPU 또는 GPU를 실행합니까?

+0

마우스 이동 중 계산은 단순히 마우스 델타를 계산하고 마우스 델타를 기반으로지도를 스크롤하는 것입니다. 난 그게 문제가되지 않을 것이라고 생각하지만 (분명히 내가 CPU를 점프 이해하므로 마우스를 움직일 때이 계산 자주.) 이전 편집기는로드 된 비트 맵을 Texture2D로 변환하고 렌더링 (SpriteBatch 사용)하기 위해 XNA 만 사용합니다. 거기에지도를 그리는 루프는 샘플과 같습니다. 그래서 본질적으로 GPU가 처리하지만, 도용 및 확대/축소를위한 입력에 반응하기 위해 보이는 영역을 계산하는 데 관련된 일부 CPU가 있습니다. – batchprogram

+0

WPF가 샘플에서 하드웨어 가속을 사용한다고 가정 할 때 이전 편집기와의 렌더링에서 유일한 차이점은 이전 편집기에서 응용 프로그램 Idle 이벤트와 연결되는 루프가 있다는 것입니다.이 이벤트는 다음과 같은 속도로 맵을 다시 그립니다. 60Hz. – batchprogram

1

WPF는 하드웨어 가속을 사용하지만 매우 비효율적입니다. 모든 것을 너무 많이 그리는 호출을 만듭니다. 이 3D 렌더링 기능은 수만 개의 개별 요소 그리기와 같은 강력한 렌더링이 아닌 사용자 인터페이스를 향상시키기위한 것입니다. 코드를 최적화 할 수는 있지만 XNA가 제공하는 성능 수준에 가깝지는 않습니다.

더 나은 옵션은 WPF에서 편집기를 작성하는 것이지만 XNA에서 렌더러를 유지하고 편집기 안에 호스트하는 것입니다.