我怎样才能加快动画效果?

时间:2011-02-15 11:32:45

标签: python animation

我正在尝试创建我的爪子数据的Matplotlib动画,在那里你可以看到the entire pressure plate over time上的压力分布(250x帧的256x64传感器)。

我找到了working example on Matplotlib's own site,并设法让它处理我自己的数据。然而,'动画'非常缓慢,我不知道如何加快速度。

这是一个gif Joe Kington made in another answer的例子,它与它的显示速度有关。考虑到测量是在125 Hz下进行的,这使得测量看起来非常慢。如果它以30-60 fps运行,它可以在4或8秒内运行,而不是当前的20 +。

enter image description here enter image description here

我不介意使用我需要的任何工具来完成工作,只要有一些好的文档来弄清楚如何去做。

所以我的问题是:如何加快这些动画?

I've implemented Ignacio's suggestion放入t.Start(1),但是当图如此大时,它只能'正常'运行:

enter image description here

class PlotFigure(Frame):
    """ This class draws a window and updates it with data from DataCollect
    """
    def __init__(self):
        Frame.__init__(self, None, -1, "Test embedded wxFigure")
        #Varying the size of Figure has a big influence on the speed            
        self.fig = Figure((3,3), 75) 
        self.canvas = FigureCanvasWxAgg(self, -1, self.fig)
        EVT_TIMER(self, TIMER_ID, self.onTimer)

    def init_plot_data(self):
        self.datagen = DataCollect(array3d)
        self.axes = self.fig.add_subplot(111)
        self.axes.imshow(self.datagen.next().T)

    def onTimer(self, evt):
        self.data = self.datagen.next()
        self.axes.imshow(self.datagen.next().T)
        self.canvas.draw()

当我在动画期间调整窗口大小时,它会立即变慢为爬行速度。这让我怀疑延迟并不是减速的唯一原因。 那么还有其他任何建议吗?如果你很好奇,here's a link to one of the ASCII files.

3 个答案:

答案 0 :(得分:8)

我发现了Joe Kington's answer that mentioned using Glumpy。起初,我无法让它处理我自己的数据,但with some help on chat我们设法弄清楚如何调整one of the Matplotlib examples that come with Glumpy来处理我的数据。

import numpy, glumpy
from glumpy.pylab import *

window = glumpy.Window(256,64)
Z = data.astype(numpy.float32)

t0, frames, t = 0,0,0
fig = plt.figure(figsize=(7,7))
ax = plt.subplot(111)
ax = imshow(Z[:,:,0], origin='lower', interpolation='bilinear')
show()
window = glumpy.active_window()

@window.event
def on_idle(dt):    
    global Z, t0, frames, t

    t += dt
    frames = frames + 1
    if frames > 248:
        fps = float(frames)/(t-t0)
        print 'FPS: %.2f (%d frames in %.2f seconds)' % (fps, frames, t-t0)
        frames,t0 = 0, t

    for image, axis, alpha in items:
        image.data[...] = Z[:,:,frames]
        image.update()
    window.draw()

window.mainloop()

最终结果可以在这里看到,无论我制作多大的窗口,它都会以非常稳定的58+ fps运行。所以我必须说,我对最终结果非常满意!

enter image description here

答案 1 :(得分:4)

传递给wx.Timer.Start()的值是以毫秒为单位的触发率。传递较小的值。

答案 2 :(得分:1)

使用Profiler查找根本原因,跳帧也可能是最后的手段。

或切换到其他解决方案,例如Double Buffering using Device ContextsPyOpenGL ...