2010-04-23 1 views
9

WriteableBitmap에 대해 간단한 MSDN example이 있습니다.Wpf : WriteableBitmap이 왜 느려지는가요?

그것은 마우스를 누를 때와 WPF - 이미지 컨트롤 위로 이동하면 하나 개의 픽셀을 업데이트하여 커서 프리 핸드 라인을 그리는 방법을 보여줍니다.

이미지/비트 맵의 ​​크기가 상대적으로 작은 예를 들어, 경우 : 매우 빠른 마우스 포인터를 이동할 때 지금

writeableBitmap.Lock(); 
(...set the writeableBitmap.BackBuffers pixel value...) 
writeableBitmap.AddDirtyRect(new Int32Rect(column, row, 1, 1)); 
writeableBitmap.Unlock(); 

나는 다음과 같은 행동을 이해하기 위해 노력하고있어 800 : 600 픽셀이면 마지막으로 그려진 픽셀은 항상 마우스 포인터 위치와 "동기화"됩니다. 즉, 마우스 움직임에 대한 지연, 매우 빠른 반응이 없습니다.

그러나

비트 맵은 더 큰 예를 얻는 경우에 1300 : 1050 픽셀이면 지연이 있음을 알 수 있습니다. 마지막으로 그려진 픽셀은 마우스 포인터 뒤로 약간 늦게 표시됩니다.

그래서 하나의 화소 만이 'AddDirtyRect "로 업데이트되는 두 경우에서와 같이, 반응 속도는 비트 맵의 ​​크기에 독립적이어야한다!? 그러나 Writeablebitmap이 크기가 커지면 속도가 느려집니다.

또는 비트 맵 전체가 writeableBitmap.Unlock(); 호출시 그래픽 장치로 전송되고 AddDirtyRect 메서드에서 정의 된 사각형 영역이 아닌?

프리츠

답변

4

전체 화상뿐만 아니라, 직사각형 영역을 무효화 AddDirtyRect에 대한 호출을 발생 닷넷 3.5 WPF 용 WriteableBitmap에서 문제가있다. http://social.msdn.microsoft.com/Forums/en-US/wpfprerelease/thread/1b84e451-9698-431f-9c51-078825a729b5

+0

는하지만 그렇게 사람이 진정으로이 고정되어 확인했습니다, 그 스레드에서 누군가가 여전히 반환 한 probs가 발생 된 것을 볼? –

+0

현재로서는 WriteableBitmap에 여전히 성능 문제가 있습니다. 나는 프리츠와 같이 AddDirtyRect를 사용하여 변경이 필요한 픽셀 만 변경하지만 이미지가 클수록 더 느리게 만듭니다. 나는 .NET 4.6을 사용하고 있습니다 : /. –

4

닷넷 4에서, 쓰기 가능한 비트 맵은 여전히 ​​더러운 RECT를 추가 할 위치에 상관없이 지역 전체를 무효화되지 참조

그것은 예정이다는 닷넷 4.0

에서 수정 된합니다. Windows SDK v7.1과 함께 제공되는 Windows Performance Toolkit의 일부인 Perforator를 사용하여 확인할 수 있습니다.

이 주요 성능 버그입니다.