我有一个PyQt5应用程序,它在我的开发机器上运行完美,但在我的目标嵌入式设备(Raspberry Pi 2)上有严重的性能问题。我将我的应用程序从PySide(基于Qt4)移植到PyQt5,以便在RPi2上使用基于eglfs的Qt构建,希望提高图形性能(通过硬件加速支持直接写入帧缓冲区),但是我还没有将基于栅格引擎的QWidgets(以及相关的QPainter()类)转换为硬件加速的等价物。
下面是我工作的基于Qt4的QWidget()paintEvent类的摘录,该类在静态.png背景上绘制动态测针:
class Qt4Widget(QtGui.QWidget):
def __init__(self, parent=None):
super(Qt4Widget, self).__init__(parent)
self.Background = QtGui.QPixmap("Images/Background.png")
#Other initialisation activity
#The paintEvent is called from various Qt4Widget.update(self) calls
def paintEvent(self, e):
self.Painter = QtGui.QPainter(self)
self.Painter.setRenderHint(self.Painter.Antialiasing)
self.Rect = e.rect()
self.MainRect = QtCore.QRect(self.Rect)
self.MainSize = self.MainRect.size()
self.MainPosition = self.MainRect.center()
self.MainRect.moveCenter(QtCore.QPoint(self.MainPosition.x()-self.MainSize.width(), self.MainPosition.y()-self.MainSize.height()))
self.MainRect.setSize(self.MainSize*0.85)
self.MainRect.moveCenter(self.MainPosition)
self.RefillRect = QtCore.QRect(self.MainRect)
self.MainSize = self.RefillRect.size()
self.MainPosition = self.RefillRect.center()
self.RefillRect.moveCenter(QtCore.QPoint(self.MainPosition.x()-self.MainSize.width(), self.MainPosition.y()-self.MainSize.height()))
self.RefillRect.setSize(self.MainSize*0.6)
self.RefillRect.moveCenter(self.MainPosition)
self.MainPainter.setPen(QtCore.Qt.NoPen)
self.MainPainter.drawPixmap(self.Rect, self.Background)
self.Painter.save()
self.Gradient = QtGui.QConicalGradient(QtCore.QPointF(self.MainRect.center()), 273.0)
self.Gradient.setColorAt(.8, QtCore.Qt.white)
self.Gradient.setColorAt(.4, QtCore.Qt.white)
self.Gradient.setColorAt(.2, QtCore.Qt.red)
self.Painter.setBrush(self.Gradient)
self.Painter.drawPie(self.MainRect, 225.0*16, self.Value*16)
self.Painter.restore()
self.Painter.setBrush(QtGui.QBrush(self.Background.scaled(self.Rect.size())))
self.Painter.drawEllipse(self.RefillRect)
self.Painter.end()
应用程序每秒更新仪表60次(60Hz显示),这可以在我的开发机器上轻松完成。但是,当我在RPi2上运行cProfile超过10秒的执行(600次更新)时,大约需要50秒才能完成,paintEvent()是主要的瓶颈。我已将QT4Widget类更改为QOpenGLWidget,但未显示量表,并且不会产生任何错误。
e.g。
class Qt5Widget(QtWidgets.QOpenGLWidget):
我可以将现有的paintEvent QPainter.drawPie,QPainter.drawPixmap和QPainter.drawEllipse函数与QOpenGLWidget一起使用,还是我需要完全重新启动才能利用QOpenGLWidget进行硬件加速?
编辑:Qt5 c ++文档在QPainter类上声明了以下内容:
OpenGL 2.0(ES) - 此后端是硬件加速图形的主要后端。它可以在支持OpenGL 2.0或OpenGL / ES 2.0规范的台式机和嵌入式设备上运行。这包括过去几年生产的大多数图形芯片。可以通过将QPainter用于QOpenGLWidget来启用引擎。
鉴于此定义,我在QOpenGLWidget上维护现有QPainter()函数的方法是否正确?如果是这样,为什么没有显示?
答案 0 :(得分:1)
根据QT5文档,QPainter()类可以在QOpenGLWidget上使用,就像它在基于栅格的QWidget上使用一样。因此,将所有QWidget类更改为QOpenGLWidget类应该启用QPainter()类的硬件加速操作,这是我在我的实例中找到的。