关于python:如何加速动画?

How can I speed up an animation?

我正在尝试创建我的爪数据的matplotlib动画,在那里你可以看到整个压力板上的压力分布随时间的推移(256x64传感器,250帧)。

我在Matplotlib自己的网站上找到了一个工作示例,并设法让它在我自己的数据上工作。但是"动画"太慢了,我不知道如何加速。

下面是一个GIF的例子,乔·金顿在另一个答案中给出了答案,它是关于显示速度的。考虑到测量是在125赫兹的频率下进行的,这使得测量看起来非常缓慢。如果它以30-60 fps的速度运行,它可以在4或8秒内运行,而不是当前的20+。

enter image description hereenter image description here

我不介意使用任何我需要的工具来完成这项工作,只要有一些好的文档来说明如何完成。

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

我已经实施了Ignacio的建议,将其放入t.start(1),但是只有当数字如此之大时,它才会"得体地"运行:

氧化镁

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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()

当我在动画中调整窗口的大小时,它会立即变慢为爬行。这让我怀疑延迟不是减速的唯一原因。还有什么建议吗?如果你好奇的话,这里有一个到ASCII文件的链接。


我发现乔·金顿提到的答案是用闷闷不乐来代替的。起初,我无法让它在我自己的数据上工作,但在聊天方面的一些帮助下,我们设法找到了如何调整其中一个Matplotlib示例,该示例伴随着闷闷不乐的工作来处理我的数据。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
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


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


使用分析器查找根本原因,跳过帧也可能是最后的解决方法。

或者切换到其他解决方案,如使用设备上下文或pyopengl进行双缓冲…