2012-12-19 4 views
5

우리는 세부 사항을 표시하기 위해 많은 렌더링을 수행하는 매우 큰 하위 컨트롤을 가지고 있지만 컨트롤의 일부만 실제로 표시됩니다 (계층의 위쪽에있는 항목에 의해 클리핑됩니다. OnRender 호출 중에 보이는 부분을 렌더링합니다.렌더링의 최적화를 위해 컨트롤의 가시 범위를 쉽게 결정할 수 있습니까?

다음 그림을 고려하십시오. 자식은 100x50이지만 보이는 영역은 자식 좌표의 (10,5) 및 (100,50)에 모서리가있는 사각형입니다. 그것이 우리가 찾고있는 영역입니다.

Clipped Child

참고 : 단순히 클리핑을하고있어 부모가 될 않을 수 있기 때문에 클리핑을위한 부모와 시험에 아이의 전환을 조정 할 수 없습니다.

ScrollViewer 내부에 중첩 된 캔버스 컨트롤을 고려하십시오. 내부 캔버스는 외부 캔버스의 경계 내에 완전히 배치 될 수 있지만 외부 캔버스는 ScrollViewer에 의해 잘릴 수 있으므로 내부 캔버스가 시각적으로 잘립니다.

시각적 트리를 걷고 각 부모를 테스트하면 성능이 저하됩니다.

컨트롤의 보이는 영역의 경계를 가져올 수있는 WPF가 내장되어 있습니다.

+0

이 스레드가 도움이 될 수 있습니다 당신은 당신이 원하는 것을 얻을 : http://stackoverflow.com/questions/1517743/in-wpf-how-can-i-determine-whether-a-control-is-visible -to-the-user –

+0

아니요! 그건 그냥 경계 검사 (위의 '참고'참조)입니다. 실제로 보이는 것을 나타내지는 않습니다. – MarqueIV

+0

어둠 속의 한 찌르기 - 반사판을 사용하여 IsMouseDirectlyOver 속성 (대부분의 WPF 컨트롤에 있음, FrameworkElement에서 상속)의 내부를 조사합니다. 이 속성은 중첩 된 객체를 통해 마우스가 정확한 특정 컨트롤 위에 직접 있는지 여부를 확인합니다. 나는 당신이 경계 검사를 위해 비슷한 논리를 사용할 수있을 것이라고 생각하고있다 ... – Marko

답변

0

일반적으로 OnRender 메서드 내에서 Z 항목에주의를 기울여 표시 항목을 작성하거나 렌더링해야하지만 시각적으로 보이는 항목에 대해 걱정할 필요는 없습니다. 이것은 C++가 아닙니다. WPF의 설계에 대한 추론의 일부는 시스템이 사용자를 위해 무엇이 보이고 그렇지 않은지를 결정할 수 있어야한다는 것입니다. 다소 높은 수준의 추상화를 지향합니다. 보이는 내용을 테스트하기위한 코드와 해당 보이는 부분의 경계가 무엇인지 알면 제대로 사용하지 않는 것일 수 있습니다. 조금 더 게으 르세요. 이것 (위에서 설명한 것)은 아주 단순한 것으로되어 있습니다.

눈에 보이는 물체가 미끄러지 듯 움직이거나 수직 순서 (즉, Z 순서)로 움직이면 - 단순히 눈에 보이게 될 것입니다. Z 순서 내에서 위치가 어긋나도 보이지 않게하려면 Visibility.Visible, Visibility.Hidden 또는 Visibility.Collapsed로 평가되는 속성에 바인딩하여 보이지 않게합니다.

참고 : 다른 플랫폼에서 WPF를 사용하는 개발자의 경우 그래픽의 다양한 구현을 살펴볼 때 실제로 OnRender를 재정의 할 필요가없는 경우가 종종 있습니다. 실시간으로 렌더링해야하는 그래픽이 많은 경우가 아니라면 WPF로 작업을 수행하고 XAML에서 표시 할 내용을 정의 할 수 있습니다.

+0

이것들은 모두 훌륭한 점이지만 적용되지 않는다. 실제로 렌더링이 일어나기 전에 수백 가지의 계산으로 구성 될 수 있기 때문에 간단한 (또는 복잡한) 바인딩이 처리 할 수없는 많은 수의 사용자 지정 렌더링을 수행하고 있습니다.그러나 클립 영역은 다른 요인에 따라 바뀔 수 있으므로 지금까지 보지 못한 것을 렌더링하는 데 많은 시간을 소비하고 있습니다. 당신은 근본적으로 내 질문이 아닌 다른 질문에 대한 대안을 제시하고 있습니다. 내 질문은 잘린 영역을 결정하는 방법을 찾는 것이 었습니다. 귀하의 의견을 주셔서 감사합니다. 다른 사람들에게 도움이 될 것이라고 확신합니다. 우리가 아니야. – MarqueIV

+0

레코드에 대해서는 네, WPF에서, OnRender 호출의 '렌더링'이 실제로 렌더링되지 않고 오히려 나중에 렌더링 될 드로잉 명령을 캐싱하는 경우를 제외하고 말합니다. 하드웨어에 대한 실제 호출 렌더링. 이 질문의 요점은 WriteableBitmap을 사용하여 매우 자주 다시 생성해야한다고 가정하기 때문에 실제로 볼 수없는 것이 있다면 그 부분을 최적화하고 싶습니다. – MarqueIV

+0

알았어. 이 유형의 대부분의 Q는 비교적 새로운 WPF 또는 간단한 시나리오의 개발자입니다. 분명히 여기서는 그렇지 않습니다. 나는 일반화 된 지름길을 모른다. 나는 복잡한 렌더링을 필요로하는 2 가지 작업을 수행했습니다. 하나는 내용이 가로로 슬라이드하는 것입니다 (두루마리 그래프 집합). 그래서 WritableBitmaps를 개념적으로 정리 된 스트립 형태로 가로로 쌓아 두었습니다. 각 스트립이 보이지 않게 왼쪽으로 미끄러짐에 따라, 오프 스크린으로 표시되고 스트립과 같은 비자가 오른쪽에서 볼 수 있습니다. 전적으로 앱의 기하학적 특성에 달려 있습니다. – JamesWHurst

관련 문제