2013-02-08 2 views
1

'Windows 런타임'을 사용하여 Window 8 용 응용 프로그램을 만들고 있습니다.WinRt에서 사용자 지정 컨트롤의 SurfaceImageSource 관련 문제

나는 자신의 그림을 그리는 사용자 지정 컨트롤이 있습니다. 이것을 달성하기 위해 Rectangle 컨트롤을 사용하고 있으며 SurfaceImageSource에서 파생 된 ImageBrush에 'Fill'속성을 설정 한 다음 ID2D1RenderTarget을 사용하여 페인팅을 수행합니다. 비트 맵을 그리기 위해 ID2D1RenderTarget :: CreateBitmapFromWicBitmap을 사용하고 있으며 반환 된 ID2D1Bitmap을 저장하고 있습니다. 컨트롤은 애니메이션으로되어 있으며 필요한 비트 맵을 모두 만든 다음 계속해서 장면을 페인트합니다.

이 모두가 대부분 잘 작동합니다. 그러나 나는 무작위로 갑자기 모든 ID2D1 비트 맵을 찾아 내서 그림 그리기를 그만 둡니다. 코드를 통해 추적 할 수 있고 잘못된 것 같지만 ID2D1RenderTarget :: DrawBitmap을 호출하면 아무 일도 일어나지 않습니다. 그러나 ID2D1Bitmap을 강제로 파일에서 다시 만들면 다시 제대로 작동합니다. 마치 비트 맵이 무효화 된 것처럼 보입니다.

이 비트 맵 손실은 매우 드물게 발생하며 무작위로 표시되지만, 한 시간 이내에 재생할 수 있음을 거의 보증합니다. 사용 된 메모리가 증가하지 않고 한 번에 여러 시간 동안 앱을 실행할 수 있기 때문에 메모리 누출이 아니라고 확신합니다. 또한 비트 맵을 강제로 다시로드하면 아무 것도 발생하지 않은 것처럼 계속 진행할 수 있습니다.

아무도 나에게 여기에 무슨 일이 일어나고 있는지에 대한 단서를 줄 수 있습니까?

감사합니다.

+0

작고 고립 된 repro 프로젝트를 생성하고 여전히 발생하는지 확인한 다음 다른 장치에서 테스트하고 MSDN 포럼에서 Microsoft에 도움을 요청할 수 있습니다. 코드 또는 코드에서 버그인지 확인할 수 있기 때문입니다. 플랫폼. 오, 드라이버를 업데이트 해보십시오. :) –

+0

고마워. 많은 시행 착오 끝에 (문제를 재현하기가 매우 어렵다는 사실 때문에 도움이되지는 않음), 문제의 근본 원인은 ID2DRenderTarget :: BeginDraw에 대한 호출이 DXGI_ERROR_DEVICE_REMOVED를 반환한다는 것이 었습니다. 내 코드를 기반으로하는 예제 코드에서이 오류에 대한 응답으로 내가하고있는 컨텍스트를 다시 작성해야한다는 것을 알 수있었습니다. 그러나 이전 컨텍스트와 관련된 캐시 된 비트 맵을 모두 삭제하지 않았으며 이러한 비트 맵은 새 컨텍스트에서 작동하지 않습니다. 나는 그것을 고쳤고, 이제 나의 앱은이 오류로부터 회복된다. –

+0

잘 알고 있습니다. 나는 그것이 당신 자신의 질문에 대한 대답으로 그것을 놓을만한 가치가 있다고 생각합니다. –

답변

2

많은 시행 착오 끝에 (문제를 재현하기가 매우 어려워서 도움이되지 않음), 문제의 근본 원인은 ID2DRenderTarget :: BeginDraw에 대한 호출이 DXGI_ERROR_DEVICE_REMOVED를 반환하고 있음을 발견했습니다. 내 코드를 기반으로하는 예제 코드에서이 오류에 대한 응답으로 내가하고있는 컨텍스트를 다시 작성해야한다는 것을 알 수있었습니다. 그러나 이전 컨텍스트와 관련된 캐시 된 비트 맵을 모두 삭제하지 않았으며 이러한 비트 맵은 새 컨텍스트에서 작동하지 않습니다. 나는 그것을 고쳤고, 이제 나의 앱은이 오류로부터 회복된다.

이 방법으로 문제가 해결되었지만 재생 중에 임의의 시간에 '장치 제거됨'오류가 발생하는 이유를 잘 모르겠습니다. 물론, 재생 중에 모든 그래픽을 다시로드하는 것은 불쾌한 지연 결함으로 나타납니다. 다행히도 거의 발생하지 않기 때문에 나는 그걸로 살아야 할 것 같아요.

관련 문제