2009-07-15 5 views
3

pygtk를 사용하여 Maemo 플랫폼 용 응용 프로그램을 작성 중이며 트리보기의 렌더링 속도가 문제가되는 것 같습니다. 응용 프로그램은 미디어 컨트롤러이므로 UI에서 전환 애니메이션을 사용하고 있습니다. 이 애니메이션은 UI를 이동할 때 컨트롤을 뷰로 슬라이드합니다. 트리 컨트롤의 문제점은 느리다는 것입니다.GTK 트리보기 속도 향상

화면 가운데에서 위젯을 움직이는 것은 그리 느리지 않지만 세포가 노출되면 프레임 속도가 떨어집니다. 좀 더 짜증나게 만드는 이유는 노출되는 유일한 영역이 행 레이블이있는 제목 행이면 프레임 속도가 계속 제어된다는 것입니다.

이것으로 판단하면 GTK 트리 뷰가 픽셀의 단일 행이 노출 될 때마다 전체 셀을 다시 그리는 것으로 의심됩니다. GTK가 어떻게 일부 버퍼에 전체 위젯을 그리도록 강제하는 방법이 있나요? 그 중 일부가 화면을 벗어난 경우에도 애니메이션을 만들 때 버퍼를 사용하여 위젯을 그릴 수 있습니까?

또한 뷰포트를 사용하여 위와 레이아웃 패널을 사용하고 위젯을 아래로 이동하는 것과는 다른 점이 있습니까? 나는 Viewport가 더 빠르다는 것을 상상 했겠지만 두 버전을 모두 시험해 보았을 때는 아무런 차이가 없었습니다.

GTK가 반드시 만들어 졌는지는 알지 못합니다. 내가 해본 다른 대안은 파이 게임이지만 위젯 기반 이벤트 처리 기능이 내장 된 좀 더 높은 수준의 implementaion을 선호합니다. 또한 pygtk는 윈도우와 윈도우에서 실행되는 이점이있어서 개발이 쉬워졌습니다.

답변

1

본인은 본 적이 없지만 캐싱을 직접 구현할 수 있습니다. 미리 정의 된 셀 렌더러를 사용하는 대신 실제 셀 래퍼를 구현하고 (실제로는 래퍼로 구현) 픽스맵을 캐시합니다.

PyGTK에서는 gtk.GenericCellRenderer을 사용할 수 있습니다. 당신의 장식 셀 렌더링에서 다음을 수행 렌더링하는 물었을 때 :

  • 오프 스크린 픽스맵의 캐시를 유지 (또는 더 나은, 단지 하나의 큰 하나)과 크기의 캐시
  • 을 예측하는 요구한다면, 크기 또는 렌더링, 관련 속성에서 키를 만듭니다.
  • 키가 캐시에 있으면 캐시 된 픽스맵을 사용하고 제공된 드로어 블에 캐시 된 픽스맵을 blit합니다.
  • 그렇지 않은 경우 먼저 실제 셀 렌더러에 작업 한 다음 복사하십시오.

마지막 단계는 또한 셀이 처음 렌더되는 동안 캐싱에 오버 헤드가 발생 함을 의미합니다. 이 문제는 캐싱 전략을 사용하여 약간 완화 할 수 있습니다. 당신은 렌더링 된 값의 분포에 따라, 다른 일을 시도 할 수 있습니다 :

  • 모든 세포는 어느 한계까지 모든 캐싱보다 할 일이 많이, 고유하지 않은, 또는 MRU 전략 경우
  • 경우 당신은 어떤 종류의 Zipf distribution을 가지고 있습니다. 즉, 일부 셀은 매우 일반적입니다. 반면 다른 셀은 매우 드물지만, 셀을 고주파로 캐시하고 희귀 셀 값에 대한 캐싱 오버 헤드를 제거해야합니다.

나는 그것이 어떤 차이를 만들지 말할 수는 없다. 다소 비슷한 문제에서의 경험은 텍스트를 포함하는 모든 것이 일반적으로 캐싱이 느리다는 것만큼이나 느리다는 것입니다. 나는 더 간단한 조언을 줄 수 없다는 점을 유감스럽게 생각합니다.

이것을 시도하기 전에 셀이 실제로 렌더링되는 빈도를 계산하고 타이밍 정보를 얻는 꾸미기 셀 렌더러를 간단하게 작성할 수 있으므로 핫 스폿이 어디에 있고 값을 캐싱하는지 알 수 있습니다 전혀 이해가되지 않습니다.