Вопрос:

Плавная анимация с использованием GTK +

animation gtk pygtk

4764 просмотра

2 ответа

80817 Репутация автора

Я создаю сетевой аниматор (похож на NAM, если вы использовали его раньше).

По сути, у меня есть узлы, представленные в виде маленьких точек на GTK + 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текущее время, которое увеличивается в цикле.

Автор: Can Berk Güder Источник Размещён: 22.02.2009 10:08

Ответы (2)


5 плюса

80817 Репутация автора

Решение

Я изменил свой код для рендеринга кадров на Pixmap и заменил DrawingArea изображением.

В то время как это решило мерцание, теперь использование процессора достигло максимума. Анимация все еще довольно быстрая, но я не думаю, что этот метод является масштабируемым.

Время для некоторой оптимизации, я думаю.

ОБНОВЛЕНИЕ: Оказывается, использование expose-event с Image было не очень хорошей идеей. Загрузка процессора вернулась к норме.

Автор: Can Berk Güder Размещён: 22.02.2009 10:39

2 плюса

21 Репутация автора

Об обработке события expose смотрите первый абзац об Анимациях с Cairo + Gtk: P

Многопоточная анимация с Cairo и GTK +
Сложная анимация с Cairo и GTK + может привести к задержке интерфейса. Это потому, что поток gtk_main () работает в одном цикле. Таким образом, если ваша функция do_draw () реализует сложную команду рисования, и она вызывается из потока gtk_main () (скажем, с помощью функции on_window_expose_event ()), остальная часть вашего кода gtk будет заблокирована до завершения функции do_draw () , Следовательно, пункты меню, щелчки мышью и даже события закрытия кнопок будут обрабатываться медленно, и ваш интерфейс будет ощущаться медленным.

Одно из решений состоит в том, чтобы передать весь процессоемкий рисунок в отдельный поток, освобождая поток gtk_main () для ответа на события.

http://cairographics.org/threaded_animation_with_cairo/

Автор: Matias Wald Размещён: 14.04.2011 02:48
32x32