如何加快动画速度?

18 投票
3 回答
15150 浏览
提问于 2025-04-16 11:52

我正在尝试用Matplotlib制作一个关于我爪子数据的动画,想要展示在整个压力板上随时间变化的压力分布(有256x64个传感器,记录250帧数据)。

我在Matplotlib官网上找到一个可以运行的示例,并成功在我的数据上实现了它。不过,这个“动画”运行得非常慢,我不知道怎么加快速度。

这里有一个例子,是Joe Kington在另一个回答中制作的gif,主要是关于显示速度的问题。考虑到测量频率是125赫兹,这让测量看起来非常慢。如果能以30-60帧每秒的速度运行,动画就能在4到8秒内完成,而不是现在的20多秒。

enter image description here enter image description here

我不介意使用任何工具来完成这个任务,只要有好的文档可以帮助我理解怎么做就行。

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

我已经按照Ignacio的建议加入了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()

当我在动画播放时调整窗口大小,动画立刻就变得非常慢。这让我怀疑,延迟并不是唯一导致速度变慢的原因。还有其他建议吗?如果你感兴趣的话,这是其中一个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帧每秒以上。所以我必须说,我对最终的结果非常满意!

enter image description here

撰写回答