Я реализую приложение для отображения ЭКГ на основе pyqtgraph.
Он обновляет 24 подграфика в сетке. Каждый подграфик имеет 4 канала ЭКГ, и каждый канал имеет соответствующий размер буфера 2500 целых чисел.
Выделенный поток UDP извлекает данные из сети и записывает в очереди Python, а очереди считываются функциями, которые периодически вызываются QTimer. Некоторые соответствующие фрагменты кода:
win = pg.GraphicsWindow()
#Create the GRID using the constructor and win.nextRow
for x in range(0, (config_data.num_of_devices / config_data.gridwidth)):
for y in range(0, config_data.gridwidth):
devicenum = (config_data.gridwidth * x) + y
devicehandle[devicenum] = Deviceplot(
devicenum, tpen, dataq[devicenum], win, config_data)
win.nextRow()
class Deviceplot(object):
def __init__(self, device, tpen, dataqueue, win, config_data):
self.p = win.addPlot()
self.curve1 = self.p.plot(self.data1, pen=self.tpen)
def update():
for x in range(0, config_data.num_of_devices):
devicehandle[x].getdata()
devicehandle[x].update1()
devicehandle[x].update2()
devicehandle[x].update3()
devicehandle[x].update4()
timer = pg.QtCore.QTimer()
timer.timeout.connect(update)
timer.start(100)
Таймер должен срабатывать каждые 100 мс. Но периодичность таймера составляет более 100 мс, когда я проверял. Следовательно, сюжеты кажутся медленнее. Время обработки функций обновления составляет менее 100 мс. Люк из группы Google pyqtgraph говорит, что дополнительное время уходит на перерисовку графического интерфейса.
Я включил обработчик кликов, который максимизировал один график и скрывал все остальные графики. Теперь таймер срабатывает правильно. я предполагаю, что Qt требуется меньше времени для перерисовки одного графика, даже если он максимизирован (возможно, из-за меньшего изменения уровня пикселей).
Итак, мой вопрос в том, как я могу оптимизировать или улучшить свой код, чтобы при просмотре всех графиков вместе в виде сетки график обновлялся правильно. Как сократить время перекраски? Или есть лучшее решение?
ОБНОВИТЬ
Я профилировал свой код, и вы можете просмотреть его на этой странице pastebin.
Я попробовал «отключить AutoRange». Но все же это не удовлетворительно.