2011-01-31 10 views
5

저는 긴 캔버스에 많은 선을 그립니다 (스트립 차트를 생각하십시오). 저급 지오메트리 클래스를 사용하고 동결하는 등 성능을 상당히 잘 조정했습니다. 이로 인해 성능이 크게 향상되었지만 캔버스에 몇 천 개의 항목을로드하는 데 몇 초가 걸렸습니다. 애플리케이션에 대한 성능 분석을 실행했는데 canvas.children.add()을 호출 할 때마다 큰 비율의 시간이 걸리는 것처럼 보입니다. 나는 이것이 가벼운 호출이어야한다는 것을 읽었고, 한 번에 여러 번 호출했기 때문에 무언가를 처리하려고해서는 안된다 ... 아마도 다른 이유가있을 수있다. 시간이 너무 많아? 그리고 어떤 식 으로든 속도를 낼 수 있을까요?WPF 캔버스 성능 - children.add는 여러 번 호출되었습니다.

성능은 심각하지 않지만 나중에 더 큰 데이터 세트를 처리해야 할 때 더 많은 문제가 발생할 수 있습니다.

참고로이 샘플에서는 1400 회 호출 된 것처럼 보이며 최신/빠른 노트북에서는 거의 3 초의 CPU 시간이 필요합니다.

캔버스가 다른 컨트롤의 계층에 포함되어 있기 때문에 캔버스가이 컨트롤에 기여하는지 궁금합니다.

추가 참고 : 그리드 부모 컨테이너를 채우기 위해 설정되었으므로 캔바스의 특정 높이를 설정하지 않았습니다. 이것이 문제의 근원이 될 수 있을까요?

+2

성능면에서 http : //msdn.microsoft.com/en-us/library/system.windows.media.streamgeometry.aspx 스트림 그리기 컨텍스트보다 가장 가벼운 구성 인 지오메트리. –

+0

예, 이미 스트림 지오메트리를 사용하여 좋은 결과를 얻었습니다. 덕분에 –

답변

0

아이들로 추가하는 대신 이미지에 이미지를 직접 그릴 것을 제안합니다. 어린이를 렌더링하는 데 큰 오버 헤드가 있습니다 (보시다시피).

How to draw line of ten thousands of points with WPF within 0.5 second?

+0

나는 이것을 피하기를 바랐다. 다른 일들이 계속 진행되어 항상 그리기가 복잡해 졌기 때문이다. 드래그 가능한 상단에 추가 된 텍스트 상자 및 이미지와 같은 섹션은 매우 길기 때문에 스크롤 가능한 컨테이너에 존재합니다. 고려해야 할 많은 변수 ... –

+3

중요한 성능의 중요성에 따라 C#의 여러 게임 프레임 워크 중 하나 (예 : 스프라이트를 조작하는 것)에서 솔루션을 고려할 수 있습니다. 물론 - 당신도 정말로 당신을 도울 다른 UI Framework 메커니즘을 사용하려는 경우 ... BTW : 특정 조건에서 WPF는 성능을 크게 저하시킬 수있는 하드웨어 렌더링을 사용하지 않습니다 -이 방법으로 확인할 수 있습니다 ' Debug.WriteLine ("WPF RenderCapabilities : 렌더링 계층 ="+ (RenderCapability.Tier >> 16) + "(원하는 2, 0은 하드웨어 가속을 의미하지 않습니다)"); ' – NightDweller

1

는 그냥 캔버스 내 컨트롤의 계층 구조에 대해 추가, 캔버스의 높이 :

유용한 기사에 대한 참조를 비슷한 질문이있다 캔버스는 주어진 시간만큼 공간을 많이 차지합니다. 아무리 자녀가 추가 되더라도 부모에게 새로운 Measuer/Arrange 패스를 유발하지 않습니다. 그 때문에 캔버스 내부에서 어떤 작업을해도 시각적 트리에 영향을 줄 수는 없습니다. 요약하자면, 문제는 거기서 올 수 없으며 StreamGeomatry에 대한 제안은 정확히 맞습니다. 이것이 성능 문제를 일으키는 원인입니다. streamgeormatry로 전환하면 문제가 해결됩니다.

+0

해당 추가 된 모든 어린이에 대해 이미 지형도 측정을 사용하고 있습니다. 그들은 성과를 많이 도왔지만 여전히 실질적으로 개선 될 것을 찾고 있습니다. –

+1

은 거짓말 쟁이로 만들었습니다. 실제로 어떤 시점에서 척수 측정법을 사용하여 감았습니다. 그냥 streamgeo로 변환하고 확실히 빠릅니다. –

+0

-1 나는 같은 문제가 있기 때문에 -1이지만 Shapes 유형의 하위 항목을 다루고 있으며 느린 동작이 동일합니다. – simo

4

StreamGeometry 개체를 사용하는 경우에도 Children.Add는 항상 느린 작업입니다. 최근에 같은 문제가 발생하여 다음과 같이 결론을 냈습니다. 새 캔버스에 여러 개의 오브젝트를 넣고 주 캔버스에 오브젝트를 중첩하면 추가 작업의 성능이 크게 향상됩니다. 그래서 1400 개의 요소를 추가하는 대신, 7 개의 캔버스에 200 개의 요소를 넣고 그 7 개의 캔버스를 주 캔버스에 추가하십시오. 모든 개체가 이제 다른 캔버스에 속하기 때문에 앱을 약간 조정해야하지만 DrawingVisual과 같은 대체 솔루션으로 이동하는 것보다 덜 혁신적인 솔루션 일 것입니다

+0

Jaime, 얼마나 큰 퍼포먼스 효과를 예상 할 수 있습니까? 즉 10 % 또는 100 % 속도 게인? 감사. –

+0

내 구체적인 경우 (300 개체가 한 번에 5000 개 이상의 어린이 컬렉션에 추가됨), 2.5 초의 지연이 있었고 0.3 초가되었습니다. –

+0

정말 놀랍습니다. 다시 한 번 감사드립니다. –

관련 문제