2009-02-22 2 views
1

Я создаю сетевой аниматор (аналогично nam, если вы использовали его раньше).Плавная анимация с использованием GTK +

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

ответ

5

Я изменил свой код, чтобы сделать кадры на Pixmap, и заменил DrawingArea на изображение.

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

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

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