Плавная анимация с использованием GTK + - PullRequest
1 голос
/ 23 февраля 2009

Я создаю сетевой аниматор (аналогично 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 - текущее время, которое увеличивается в цикле.

Ответы [ 2 ]

5 голосов
/ 23 февраля 2009

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

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

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

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

2 голосов
/ 14 апреля 2011

Об обработке события 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/

...