2017-04-27 7 views
2

다루는 것은 여기에 시나리오의 :매우 낮은 애니메이션 프레임 속도

내가 주로리스트 박스를 포함하는 많은 뷰 시리즈를 가지고있다. 목록 상자, 일부에는 많은 양의 데이터가 있고 일부는 아주 적습니다. 현재 첨부 된 비헤이비어에는 본질적으로 새로운 내용이 이러한보기 (ContentPresenter)의 컨테이너에로드 될 때 감지하여 왼쪽 또는 오른쪽으로 200px만큼 컨테이너를 오프셋하는 간단한 XAML 스토리 보드를 트리거합니다 또한 불투명도를 0 % (0ms)로 낮춘 다음 100ms 이상이면 불투명도를 100 %로 복원하고 오프셋을 0px로 줄임으로써 '보기로 미끄러지 듯'효과를냅니다.

자, 문제는 :

이 애니메이션의 프레임 속도는 크게 다만 완료 될 때까지 1 개 프레임에서 지체하는, 무섭게 어디 과민로 원활하게 전환에서 다릅니다. 이것은 거의 새로운 뷰를로드하고 그 안에 모든 것을 렌더링 한 다음 더 멀리해야한다는 사실 때문에 거의 확실합니다. 많은 데이터가있는 목록은 더 많은 렌더링 시간을 필요로합니다. 그런 다음 애니메이션의 성능에 큰 영향을 미치는 위치 변경을 애니메이션화하려고 할 때 모든 일이 발생합니다. enter image description here

내 질문 :

는 WPF 여기

을 처리하기 위해 화면을 가로 질러 몇 픽셀을 이동하는 것과 같은 간단한 일이 너무 그래픽 집약적 인 저를 충격 애니메이션 자체의 원유 표현입니다 :

성능을 향상시키기 위해 WPF에서 집중적 인 애니메이션을 다루는 데있어 근본적인 모범 사례가 있습니까? 부스트 성능을 추가 할 때 사소한 변경 사항이 있습니까? WPF는 애니메이션 작업에만 끔찍한 일이며 우리는이를 처리해야합니다.

+1

'ListView'에서'가상화'가 가능합니까? 'VirtualizingStackPanel'을 들여다 보지 않으면. – XAMlMAX

+0

예, 그들은 모두 가지고, 그래서 내 추측은 일부 목록 상자 항목의 데이터 형식은 때로는 심지어 몇 가지 표시가 충분히 느려지는 것만 큼 복잡하다는 것입니다. – Logan

+0

가상화가 ListView에서 작동하는지 확인하고, 나는 과거에 문제가 있었다. 'ItemsSource'에 대해 보통 Binding을 사용합니까, 아니면'CollectionViewSource'를 사용합니까? 또한 포함 된 가상화를 사용하여 ListView의 'XAML'을 게시 할 수 있습니까? – XAMlMAX

답변

0

당신의 문제는 당신이 모든 것을 같은 시간에하거나 같은 스레드에서하려고한다는 것입니다. 분리 된 작업에서 비동기로 작업하십시오. 그것에는 많은 다른 접근 방식이 있습니다. 또 다른 접근법은 세마포어로 작업을 처리하는 것입니다. 그러면 성능이 약간 향상 될 것입니다.

+1

맞을 수도 있습니다 - 비동기 성은 우리가 훨씬 더 많은 것을 조사해야 할 필요가있는 것입니다. – Logan

0

필자의 경우 지터 문제를 해결할 수있는 해결책을 찾았습니다. 확실히 노력할 가치가 있습니다. 전략은을 통해 이 변경되지 않는 요소를 그리드 나 캔버스와 같은 로컬 참조 프레임 워크에 삽입하고 해당 그리드 또는 캔버스에 캐시 된 버전의 내용을 저장 한 다음 해당 애니메이션을 그리드 또는 캔버스, 안쪽 요소보다. 이 같은, 당신은 단순히 캔버스 제품 내부 (또는 격자를) 업데이트하지 않도록 할 것

<Grid ...Your grid properties...> <Grid.CacheMode> <BitmapCache /> </Grid.CacheMode> ...Your UI elements... </Grid> 

: 그리드에 대한

<Canvas ...Your canvas properties...> 
    <Canvas.CacheMode> 
     <BitmapCache /> 
    </Canvas.CacheMode> 
    ...Your UI elements... 
</Canvas> 

또는 : 그것은이처럼 간단합니다 캐시 된 버전을 실행 취소하면 WPF가 모든 프레임에서 해당 렌더링을 재생성하는 유사한 문제가 발생합니다.

캐시 된 버전의 콘텐츠를 사용하면 WPF가 화면에서 동적으로 업데이트되는 요소가 아닌 단순히 해당 요소의 마지막 렌더링 비트 맵이되며 WPF는 변경 사항이있는 경우에만 해당 비트 맵을 업데이트합니다 요소에 적용됩니다.

문제가 해결되지 않으면 로컬 요소의 생성 외부에서 발생하는 성능으로 인해 성능이 저하된다는 의미입니다. 즉, 전체 응용 프로그램을 보거나 응용 프로그램의 전체 프레임 속도를 줄이는 것이 좋습니다. 그러나 사실 WPF 애니메이션에서 발견되는 지터스럽고 불규칙한 움직임의 모든 경우에 BitmapCache 솔루션이 항상 작동하는 것처럼 보입니다. 캐싱 될 요소 내부의 객체에 애니메이션을 적용하지 않도록 조심하십시오.

관련 문제