2012-02-13 3 views
2

많은 오브젝트가있는 큰 캔버스를 스크롤 할 수 있습니다 (따라서 왜 그렇게 큰지). 나는 클릭하고 드래그 할 수있는 (예를 들어, 텍스트 상자와 같은) 화면에 놓은 객체가 있습니다. 개체는 마우스를 캡처하는 중이고 Canvas.SetLeft() 및 SetTop()을 OnMouseMoved 이벤트로 호출합니다.많은 오브젝트가있는 큰 캔버스의 성능을 드래그하십시오.

작은 캔버스에서는 잘 작동하지만 수천 개의 개체가있는이 큰 개체는 드래그 한 개체를 매우 천천히 새로 고칩니다 ... 일반적으로 드래그하는 동안 두 번째 새로 고침을합니다. 별로 사용자 친화적이지 않습니다.

나는이 구매를 개선 할 필요가 있는지 어떻게 진행해야할지 잘 모르겠다.

내가 가진 한 가지 생각은 전경에 투명한 캔버스를 현재 창 크기로 유지하고 어린이를 포함하지 않는 것입니다. 드래그를 시작하면 끝날 때까지이 레이어로 이동하고 다시 큰 레이어로 이동합니다. 그래도 또 다른 해킹을위한 많은 노력이 필요합니다.

업데이트 : 천공을 사용하면이 객체를 드래그하는 동안 캔버스가 반복적으로 수행되는 레이아웃 패스를 얻는 것을 볼 수 있습니다. 이것은 느린 부분입니다. 이 문제를 피할 수있는 방법이 있는지 궁금해 ...

+0

일종의 가상화가 도움이 될 것입니다. 하지만 http://blogs.msdn.com/b/kaelr/archive/2010/08/11/zoomableapplication2-a-million-items.aspx는 이동식 항목에는 직접 적용되지 않을 수도 있습니다. –

+0

@ H.B .: 이동 된 항목이 항상 (가상화에 관계없이) 그려지는 한, 정상적으로 적용되어야합니다. 슬로우 리프레쉬는 캔버스가 단지 보이는 것 대신에 아이들의 모든 레이아웃을 반복적으로 레이아웃하는 것일 것입니다. 후자 만하고 있다면, 큰 퍼포먼스가 있어야합니다. –

+0

나는이 캔버스에 내장 된 (옵션?) 가상화 도구가 있었으면 좋겠다 ... 과거에 가상화 된 캔버스를 사용하려고 할 때마다 문제가 발생했지만 다른 시도를 할 때가있다. 아하. –

답변

0

성능 최적화는 "해킹"이 아닙니다. 큰 최적화는 종종 성능을 관리 할 수 ​​있도록 노력을 기울여야합니다.

당신의 제안은 적당하지만, 아이템을 "떨어 뜨리고"캔버스가 새로 고침 될 때 당신이 얻는 지연은 여전히 ​​일어날 것입니다. 또 다른 방법은 현재 화면 상에있는 것을 그리는 "가상화 된"캔버스를 만드는 것입니다. 이것은 여기에 샘플을 제공하지 않으려 고하는 복잡한 작업이지만, 전체적으로 애플리케이션의 성능을 향상시키는 데 도움이 될 것입니다.

+0

가상화 경로를 따라 가려고했지만 약간의 장애가 발생했습니다. 대신 대부분의 캔버스에서 매우 가벼운 항목을 사용하는 데 중점을 둡니다. 로딩 성능이 좋고 스크롤이 빠릅니다. 이제 주변을 끌고 다니는 항목들이 나 빠지기 만합니다. 아하. –

관련 문제