d396d33799
* Remove the use of pyqtgraph.ptime With us supporting python3.7+, we have no more need for the ptime module and can instead safely use perf_counter for everything. * Address small issues PR turned up * Reword comment in ImageView
78 lines
2.8 KiB
Python
78 lines
2.8 KiB
Python
# -*- coding: utf-8 -*-
|
|
"""
|
|
This example demonstrates the use of RemoteGraphicsView to improve performance in
|
|
applications with heavy load. It works by starting a second process to handle
|
|
all graphics rendering, thus freeing up the main process to do its work.
|
|
|
|
In this example, the update() function is very expensive and is called frequently.
|
|
After update() generates a new set of data, it can either plot directly to a local
|
|
plot (bottom) or remotely via a RemoteGraphicsView (top), allowing speed comparison
|
|
between the two cases. IF you have a multi-core CPU, it should be obvious that the
|
|
remote case is much faster.
|
|
"""
|
|
|
|
import initExample ## Add path to library (just for examples; you do not need this)
|
|
from pyqtgraph.Qt import QtGui, QtCore
|
|
import pyqtgraph as pg
|
|
import pyqtgraph.widgets.RemoteGraphicsView
|
|
import numpy as np
|
|
from time import perf_counter
|
|
|
|
app = pg.mkQApp()
|
|
|
|
view = pg.widgets.RemoteGraphicsView.RemoteGraphicsView()
|
|
pg.setConfigOptions(antialias=True) ## this will be expensive for the local plot
|
|
view.pg.setConfigOptions(antialias=True) ## prettier plots at no cost to the main process!
|
|
view.setWindowTitle('pyqtgraph example: RemoteSpeedTest')
|
|
|
|
app.aboutToQuit.connect(view.close)
|
|
|
|
label = QtGui.QLabel()
|
|
rcheck = QtGui.QCheckBox('plot remote')
|
|
rcheck.setChecked(True)
|
|
lcheck = QtGui.QCheckBox('plot local')
|
|
lplt = pg.PlotWidget()
|
|
layout = pg.LayoutWidget()
|
|
layout.addWidget(rcheck)
|
|
layout.addWidget(lcheck)
|
|
layout.addWidget(label)
|
|
layout.addWidget(view, row=1, col=0, colspan=3)
|
|
layout.addWidget(lplt, row=2, col=0, colspan=3)
|
|
layout.resize(800,800)
|
|
layout.show()
|
|
|
|
## Create a PlotItem in the remote process that will be displayed locally
|
|
rplt = view.pg.PlotItem()
|
|
rplt._setProxyOptions(deferGetattr=True) ## speeds up access to rplt.plot
|
|
view.setCentralItem(rplt)
|
|
|
|
lastUpdate = perf_counter()
|
|
avgFps = 0.0
|
|
|
|
def update():
|
|
global check, label, plt, lastUpdate, avgFps, rpltfunc
|
|
data = np.random.normal(size=(10000,50)).sum(axis=1)
|
|
data += 5 * np.sin(np.linspace(0, 10, data.shape[0]))
|
|
|
|
if rcheck.isChecked():
|
|
rplt.plot(data, clear=True, _callSync='off') ## We do not expect a return value.
|
|
## By turning off callSync, we tell
|
|
## the proxy that it does not need to
|
|
## wait for a reply from the remote
|
|
## process.
|
|
if lcheck.isChecked():
|
|
lplt.plot(data, clear=True)
|
|
|
|
now = perf_counter()
|
|
fps = 1.0 / (now - lastUpdate)
|
|
lastUpdate = now
|
|
avgFps = avgFps * 0.8 + fps * 0.2
|
|
label.setText("Generating %0.2f fps" % avgFps)
|
|
|
|
timer = QtCore.QTimer()
|
|
timer.timeout.connect(update)
|
|
timer.start(0)
|
|
|
|
if __name__ == '__main__':
|
|
pg.exec()
|