How can I speed up an animation?
我正在尝试创建我的爪数据的matplotlib动画,在那里你可以看到整个压力板上的压力分布随时间的推移(256x64传感器,250帧)。
我在Matplotlib自己的网站上找到了一个工作示例,并设法让它在我自己的数据上工作。但是"动画"太慢了,我不知道如何加速。
下面是一个GIF的例子,乔·金顿在另一个答案中给出了答案,它是关于显示速度的。考虑到测量是在125赫兹的频率下进行的,这使得测量看起来非常缓慢。如果它以30-60 fps的速度运行,它可以在4或8秒内运行,而不是当前的20+。
号
我不介意使用任何我需要的工具来完成这项工作,只要有一些好的文档来说明如何完成。
所以我的问题是:我如何加速这些动画?
我已经实施了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的速度运行。所以我必须说,我对最终结果非常满意!
。
传递给
使用分析器查找根本原因,跳过帧也可能是最后的解决方法。
或者切换到其他解决方案,如使用设备上下文或pyopengl进行双缓冲…