我创建一个网络动画(类似于南,如果你以前使用过它)。

基本上,我有表示为一个GTK +绘图区小点节点,并且我更新这些节点的位置和重新绘制绘图区中的循环。

将所得的动画是快速的,但不光滑(有很多的闪烁)。这可能是因为我填充每个帧之前纯色的绘图区。

你怎么想,我最能解决这个问题?如果我预渲染的帧到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是当前时间,这是在循环递增。

有帮助吗?

解决方案

我改变代码来渲染帧到像素图,并替换为图像的绘图区。

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

时间对一些优化,我猜。

<强>更新原来使用暴露的事件与一个影像不是个好主意。 CPU使用率是恢复正常。

其他提示

关于暴露事件处理,检查出动画第一段与开罗+的Gtk:P

  

<强>多线程动画与开罗和GTK + 结果   复杂的动画与   开罗和GTK +可导致laggy接口。这是因为   gtk_main()函数的线程在单个循环运行。所以,如果你的do_draw()   函数实现复杂的绘图命令,并且它被称为   从gtk_main()函数的线程(由on_window_expose_event说()   功能),你的GTK代码的其余部分将被阻塞,直到   do_draw()函数完成。必然地,菜单项,鼠标   点击,甚至关闭按钮的事件将是缓慢的进行处理和   你的界面会感到laggy。

     

一个解决方案是手断所有的处理器密集型绘制到   单独的线程,从而释放gtk_main()函数的线程来响应   事件

http://cairographics.org/threaded_animation_with_cairo/

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top