我在PyQt中编写了一个应用程序,它接收了8个传感器波形,我在一个窗口中有8个QGraphicViews来传输8个数据。当我只使用一个传感器时,一切正常。但如果我使用全部8个实时流,则绘图会变慢并崩溃。
什么是最佳做法以及在同时绘制大量实时流以减少性能时间时应该注意什么?多线程会有帮助吗?以较慢的帧速率绘图?
答案 0 :(得分:0)
由于任务是CPU绑定的,并且您仍在一个核心上运行(默认情况下为Python),因此多线程几乎没用。此外,PyQtGraph不能在多个线程中完成任何绘图:所有内容都必须在主线程中完成(请参阅作者对类似主题here的回复)。因此,虽然多线程或多处理可以帮助您获取或处理数据,但它不会解决主要瓶颈:在太小的空间中以太高的速率绘制太多数据。
解决方案?下采样。方便的是,PyQtGraph有这个builtin。这是一个例子(从PyQtGraph示例套件修改)。
import numpy as np
import pyqtgraph as pg
from PySide import QtGui, QtCore
win = pg.GraphicsWindow(title="Basic plotting examples")
win.resize(1000,600)
win.setWindowTitle('pyqtgraph example: Plotting')
# Enable antialiasing for prettier plots
pg.setConfigOptions(antialias=True)
p1 = win.addPlot(title="Downsampled")
# normally would plot 1000, but we downsample by 10 fold
p1.plot(np.random.normal(size=1000), pen=(255,0,0), name="Red curve", downsample=10)
p2 = win.addPlot(title="Normal")
p2.plot(np.random.normal(size=1000), pen=(0,0,255), name="Blue curve",)
## Start Qt event loop unless running in interactive mode or using pyside.
if __name__ == '__main__':
QtGui.QApplication.instance().exec_()
结果,这里左边的点数少了10倍,性能要高得多。