Animation 使用GTK+平滑动画;

Animation 使用GTK+平滑动画;,animation,gtk,pygtk,Animation,Gtk,Pygtk,我正在创建一个网络动画师(类似于nam,如果您以前使用过的话) 基本上,我将节点表示为GTK+DrawingArea上的小点,然后更新这些节点的位置并在循环中重新绘制DrawingArea 生成的动画速度很快,但并不平滑(存在大量闪烁)。这可能是因为我在每一帧之前用纯色填充绘图区域 你认为我怎样才能最好地解决这个问题?我应该在Pixbufs上预渲染帧吗?有更好的解决办法吗 以下是我当前的绘图代码(使用PyGTK): 其中,self.t是当前时间,它在循环中递增。我更改了代码,将帧渲染到像素地图上

我正在创建一个网络动画师(类似于nam,如果您以前使用过的话)

基本上,我将节点表示为GTK+DrawingArea上的小点,然后更新这些节点的位置并在循环中重新绘制DrawingArea

生成的动画速度很快,但并不平滑(存在大量闪烁)。这可能是因为我在每一帧之前用纯色填充绘图区域

你认为我怎样才能最好地解决这个问题?我应该在Pixbufs上预渲染帧吗?有更好的解决办法吗

以下是我当前的绘图代码(使用PyGTK):


其中,
self.t
是当前时间,它在循环中递增。

我更改了代码,将帧渲染到像素地图上,并用图像替换了绘图区域

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

我想是时候进行一些优化了


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

关于暴露事件处理,请查看Cairo+Gtk动画的第一段:p

带有Cairo和GTK+的多线程动画
使用 cairo和GTK+可以产生一个滞后的接口。这是因为 gtk_main()线程在单个循环中运行。那么,如果您的do_draw() 函数实现一个复杂的绘图命令,并调用 从gtk_main()线程(例如,通过打开_窗口_expose_事件() 功能),其余的gtk代码将被阻止,直到 do_draw()函数完成。因此,菜单项、鼠标 点击,甚至关闭按钮事件的处理和恢复都会很慢 你的界面会感觉迟钝

一种解决方案是将所有处理器密集型绘图交给 分离线程,从而释放gtk_main()线程以响应 事件

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)