2012-03-27 2 views
2

안녕하세요 저는 SlimDX 및 DirectX 11 그래픽을 D3DImage 및 공유 텍스처를 사용하여 WPF 응용 프로그램에 통합했습니다. 그러나 고해상도 (2560x1440)에서 간단한 장면 (예 : SlimDX 샘플의 GameOfLife)을 렌더링 할 때 성능이 약간 저하됩니다.WPF 및 SlimDX (DirectX 11) interop

내 렌더링 메서드의 성능 프로파일 링을 시도해 보았습니다. 그리고 대부분의 시간이 backbuffer를 무효로 할 때 D3DImage를 잠그는 데 소요 된 것처럼 보입니다.

_device.ImmediateContext.Flush(); // <- 20,6% of the time when rendering the frame 

누구든지이 문제를 알고 어떻게 최적화하는 방법 :

_d3dImage.Lock(); // <- this call takes 78,5 % of the time when rendering the frame 
_d3dImage.AddDirtyRect(new Int32Rect(0, 0, _d3dImage.PixelWidth, _d3dImage.PixelHeight)); 
_d3dImage.Unlock(); 

많은 시간 그린 후 장치를 flusing 소요되는? WPF와 SlimDX를 통합 할 때 하강 성능을 기대할 수 있습니까?

+1

잠금은 UI 스레드가 백 버퍼 읽기를 중지 할 때까지 스레드를 차단하고 플러시는 꽤 비싸므로 이러한 결과가 비정상적이지 않습니다. 실제 실적 수치는 무엇입니까? GPU가 쉐이더를 지원합니까? 그렇지 않다면 소프트웨어에서 (즉, 냄새의 속도로) 실행될 것입니다. –

+0

문제는 GameOfLife 샘플에 사용 된 계산 쉐이더와 관련이있는 것처럼 보입니다. 비활성화하면 프레임 속도가 최대 60fps로 돌아갑니다 ... – Pking

답변

1

호출 잠금 및 플러시 (GPU가 CPU와 동기화해야하는 지점)에서 성능 문제가 발생하므로 프로그램이 심각하게 GPU에 바인딩되어 있고 CPU가 계속 멈추어야한다고 생각합니다. 따라 잡기를 기다리고 있습니다. 컴퓨팅 쉐이더를 사용하지 않을 때 성능이 향상됩니다.

그 시점에서 당신에게 무엇을 말할지는 모르겠지만, 맞다면 카드가 부하를 처리 할 수없는 것으로 보입니다.

+0

고마워, 그렇게 보일 것입니다. 내가 상상할 수있는 부하를 처리해야하는 Radeon HD5850에서 실행 중이지만 셰이더는 그렇게 복잡하지 않습니다. – Pking

+1

확실히 그게 전부는 아닙니다. Lock()이 영원히 계속되는 것과 같은 문제가 있으며 Windows Forms에서 DirectX를 호스팅하면 성능이 훨씬 향상됩니다. –

+0

재미 있습니다. 아마도 WPF + Dx는 그럴 의도가 아닙니다. – Pking