문제

저는 네트워크 애니메이터를 만들고 있습니다(이전에 사용해 본 적이 있다면 nam과 비슷합니다).

기본적으로 GTK+ DrawingArea에 작은 점으로 표시되는 노드가 있으며, 이 노드의 위치를 ​​업데이트하고 루프에서 DrawingArea를 다시 그립니다.

결과 애니메이션은 빠르지만 부드럽지는 않습니다(깜빡임이 많습니다).이는 아마도 각 프레임 전에 DrawingArea를 단색으로 채우기 때문일 것입니다.

이 문제를 어떻게 가장 잘 해결할 수 있다고 생각하시나요?Pixbufs에 프레임을 미리 렌더링해야 합니까?더 나은 해결책이 있습니까?

내 현재 그리기 코드는 다음과 같습니다(PyGTK 사용).

rect  = self.drawing_area.get_allocation()
style = self.drawing_area.get_style()

pos   = [n.position_at(self.t) for n in self.nodes]

self.drawing_area.window.draw_rectangle(style.bg_gc[gtk.STATE_NORMAL], True,
                                        0, 0, rect.width, rect.height)

for p in pos:
    self.drawing_area.window.draw_arc(style.fg_gc[gtk.STATE_NORMAL], True,
                                      rect.width  * (p.x / 2400.0) - NODE_SIZE/2,
                                      rect.height * (p.y / 2400.0) - NODE_SIZE/2,
                                      NODE_SIZE, NODE_SIZE,
                                      0, 64 * 360)

어디 self.t 루프에서 증가되는 현재 시간입니다.

도움이 되었습니까?

해결책

프레임을 Pixmap에 렌더링하도록 코드를 변경하고 DrawingArea를 이미지로 바꿨습니다.

이로 인해 깜박임이 해결되었지만 이제 CPU 사용량이 최고조에 달했습니다.애니메이션은 여전히 ​​상당히 빠르지만 이 방법은 확장성이 없다고 생각합니다.

최적화가 필요한 것 같습니다.

업데이트: 이미지와 함께 노출 이벤트를 사용하는 것은 그다지 좋은 생각이 아닌 것으로 나타났습니다.CPU 사용량이 정상으로 돌아왔습니다.

다른 팁

노출 이벤트 처리에 대해서는 Cairo + Gtk:P를 사용한 애니메이션의 첫 번째 단락을 확인하세요.

Cairo 및 GTK+를 사용한 멀티스레드 애니메이션
카이로와 GTK+를 사용한 복잡한 애니메이션은 더러운 인터페이스를 초래할 수 있습니다.gtk_main () 스레드가 단일 루프로 실행되기 때문입니다.따라서 do_draw () 함수가 복잡한 그리기 명령을 구현하고 gtk_main () 스레드 (on_window_expose_event () 함수에 의해)에서 호출되면 나머지 GTK 코드는 do_Draw () 함수가 완료 될 때까지 차단됩니다. .결과적으로 메뉴 항목, 마우스 클릭 및 닫기 버튼 이벤트조차도 처리되면 느리게 진행되며 인터페이스는 느려집니다.

한 가지 해결책은 모든 프로세서 집약적 인 도면을 별도의 스레드로 전달하여 gtk_main () 스레드를 자유롭게하여 이벤트에 응답하는 것입니다.

http://cairographics.org/threaded_animation_with_cairo/

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top