2009-11-30 4 views
1

Im은 애니메이션을 통해 ImageBrush의 ImageSource 속성을 변경할 수있는 PNG 시퀀서 클래스를 만들려고합니다.WPF - RenderTargetBitmap이 이미지 소스를 변경하는 것보다 낫습니까?

문제는 내가로드 할 PNG 파일이 약 150 개이며, 화면에 애니메이션이 몇 개있을 때 성능에 영향을줍니다.

나는 RenderTargetBitmap과 WriteableBitmap에 대해 조금 읽었지만 실제로 성능 향상을 위해 어떻게해야하는지 잘 모르겠다.

일부 경우에는 6fps로 내려 가고 있는데, 이는 분명히 허용되지 않습니다.

내 시퀀서 클래스에서 ImageBrush의 ImageSource 속성을 변경하는 CurrentFrame CurrentFrame을 업데이트합니다.

성능을 향상시키는 방법에 대한 아이디어가 있으십니까?

+0

아마도 CompositionTarget.Rendering을 사용해야합니까 ?? – Mark

답변

3

1 단계는 모든 이미지를 미리로드합니다 (배경 스레드가 좋음). BitmapImage 객체를 CacheOption = BitmapCacheOption.OnLoad으로 초기화해야합니다. 이미이 작업을 수행 중이거나 문제가 아닐 수도 있습니다 (기본적으로 이미지 캐시).

그러나 렌더링 스레드는 이미지 소스를 변경할 때도 약간의 작업이 필요합니다. 원본 이미지 크기로 표시하지 않으면 문제가 발생할 수 있습니다. 기본적으로 Image 컨트롤은 고품질의 Fant scaling 알고리즘을 사용합니다. 이 경우 Image에서 RenderOptions.SetBitmapScalingMode(uiImage, BitmapScalingMode.LowQuality);으로 전화하여 실적을 높일 수 있습니다. 낮은 품질의 스케일링은 수십 배 더 빠릅니다. 그러나 그 후에도 여전히 약간의 작업이 필요합니다. 가능한 한 가장 빠른 애니메이션을 얻으려면 모든 프레임에 대해 Image 컨트롤을 만든 다음 모두 동일한 위치에서 겹치고 위에 표시되는 것을 변경합니다. 모든 이미지를로드하는 렌더링 스레드에서 여전히 히트를 얻지 만, 실제 애니메이션은 아주 잘 보일 것입니다.

+0

와우, 지금 시점에서 Scaling Mode 옵션이 효과적이었습니다! 고마워. 한가지 더, WPF 성능 프로파일 러를 실행할 때 이미지를 처음로드 할 때 비디오 카드 메모리가 몇 백 MB 씩 증가하는 것을 볼 수 있습니다. 또한, 그것은 지금까지 드롭 다운, 그렇지? – Mark

+0

모든 이미지가 비디오 카드에 미리 렌더링 되었기 때문에 (즉, 왜 그렇게 빠른지) 각 이미지를 별도의 이미지로로드하고 z 순서를 변경하면이 동작이 발생할 것으로 예상됩니다. 아직 BitmapSource를 변경하는 중이라면 그 상황에서해야 할 일을 잘 모릅니다. 메모리 건너 뛰기가 모든 애니메이션의 총 프레임 수와 관련되어 있습니까? – RandomEngy

+0

알기 힘들지 만 분명히 관련이 있습니다. 애니메이션을 실행하기 전까지는 비디오 메모리에 아무런 변화가 없습니다. 또한 애니메이션을 3D 지오메트리의 재질로 사용하고 있기 때문에 모든 하드웨어가 렌더링되므로 메모리에로드하는 것이 좋습니다. – Mark

관련 문제