2009-02-22 110 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替换为Image。

虽然这解决了闪烁现在CPU使用率已达到峰值。动画仍然很快,但我不认为这种方法是可扩展的。

我想,有一些优化的时间。

更新:事实证明,使用与图像公开事件并不是一个好主意。 CPU使用率恢复正常。