如何加快动画速度?
我正在尝试用Matplotlib制作一个关于我爪子数据的动画,想要展示在整个压力板上随时间变化的压力分布(有256x64个传感器,记录250帧数据)。
我在Matplotlib官网上找到一个可以运行的示例,并成功在我的数据上实现了它。不过,这个“动画”运行得非常慢,我不知道怎么加快速度。
这里有一个例子,是Joe Kington在另一个回答中制作的gif,主要是关于显示速度的问题。考虑到测量频率是125赫兹,这让测量看起来非常慢。如果能以30-60帧每秒的速度运行,动画就能在4到8秒内完成,而不是现在的20多秒。
我不介意使用任何工具来完成这个任务,只要有好的文档可以帮助我理解怎么做就行。
所以我的问题是:我该如何加快这些动画的速度?
我已经按照Ignacio的建议加入了t.Start(1),不过只有在这个图形很大的时候才“勉强”能运行:
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文件的链接。
3 个回答
1
可以使用性能分析工具来找出问题的根本原因,最后的办法也可以考虑帧跳过。
或者可以换个方法,比如使用双缓冲技术和设备上下文,或者PyOpenGL...
4
传给 wx.Timer.Start()
的值是触发的频率,单位是毫秒。你可以传一个更小的值。
10
我发现了Joe Kington提到的使用Glumpy的方法。起初我自己在自己的数据上没能成功,但在聊天中得到了一些帮助后,我们终于找到了如何调整Glumpy自带的一个Matplotlib示例来适应我的数据。
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帧每秒以上。所以我必须说,我对最终的结果非常满意!