마우스 포인터를 움직일 때마다 원을 그려서 이미지를 업데이트하려고합니다. pixelBuffer는 map
개체에 저장되고 CircleFilledWithGradientMethod()
으로 업데이트됩니다. WriteableBitmap Bitmap
에 픽셀 버퍼를로드 한 다음 내 XAML UI의 이미지 요소 이미지 소스를 비트 맵으로 설정하여 표시하려고합니다. 어떻게하면 마우스를 처음 움직이면 맨 처음 2 개의 원이 그려지지만 마우스를 움직이면 이미지가 업데이트되지 않습니다. 왜 그럴 수 있죠? Image
에 강제로 다시 그려야하는 메서드가 있습니까? 제가 stream.WriteAsync
을 두 번 사용하는 이유는 방금 하나를 사용할 수 있었을 때 제대로 작동하고 있음을 보여주기 위해서입니다. 나는 무슨 일이 일어나고 무슨 생각WritableBitmap이 변경된 후에 인터페이스의 이미지가 업데이트되지 않습니다.
private async void TextArea_PointerMoved(object sender, PointerRoutedEventArgs e)
{
Pixel pixel1 = new Pixel(255, 0, 0);
Pixel pixel2 = new Pixel(255, 255, 255);
map.CircleFilledWithGradient((int) pointer.Position.X, (int)pointer.Position.Y, 100, pixel1, pixel2);
using (Stream stream = Bitmap.PixelBuffer.AsStream())
{
stream.WriteAsync(map.pixelData, 0, map.pixelData.Length);
}
map.CircleFilledWithGradient((int)pointer.Position.X+100, (int)pointer.Position.Y, 100, pixel1, pixel2);
using (Stream stream = Bitmap.PixelBuffer.AsStream())
{
stream.WriteAsync(map.pixelData, 0, map.pixelData.Length);
}
this.Image.Source = Bitmap;
}
는 최대한 빨리이 화면에 이미지를 그릴 때, 그것을 캐시 한 후 기존 이미지를 사용하여 유지한다는 것이다. 아니면 표준 이미지 요소가 다시 그리기를 지원하지 않습니까?
업데이트 : 내 Bitmap
은 개인 클래스 변수입니다. 내가 할 경우
WriteableBitmap Bitmap = new WriteableBitmap((int)this.ActualWidth, (int)this.Grid.RowDefinitions[1].ActualHeight);
모두 작동하기 시작하지만 메모리가 비효율적이지 않습니까? 마우스를 움직일 때마다 각각 새로운 WriteableBitmap
에 대한 메모리를 할당하지 않습니까? 그리고 내가 알아 낸 바에 따르면이 문제는 이미지 구성 요소와 관련이 있습니다. 왜 소스 코드를 변경하더라도 업데이트되지 않지만 소스 코드를 다른 객체로 변경하면 업데이트됩니다. `
그래서 Win32의 InvalidateRegion과 같은 것이 있습니까? 1 픽셀을 그리려면 전체 이미지를 다시 그릴 필요가 있습니까? 꽤 비효율적 인 것 같습니다. –
보다 효율적인 직접 모드 렌더링을 위해서는 WriteableBitmap 대신 Win2D를 사용하십시오. https://github.com/Microsoft/Win2D –