開発マシンで完全に動作するPyQt5アプリケーションがありますが、対象の組み込みデバイス(Raspberry Pi 2)に重大なパフォーマンス問題があります。私のアプリケーションをPySide(Qt4ベース)からPyQt5に移植して、グラフィックパフォーマンス(ハードウェアアクセラレーションをサポートしてフレームバッファに直接書き込む)を改善するためにeglfsベースのQtビルドをRPi2で使用できるようにしましたが、ラスタエンジンベースのQWidgets(および対応するQPainter()クラス)をハードウェアアクセラレーション対応の同等物にまだ変換していません。以下はQWidgetをQOpenGLWidgetに変換する
は静的.pngの背景の上にダイナミックゲージの針を描画し、私の作業Qt4をベースのQWidget()paintEventクラスの抜粋です:
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で10秒間実行したcProfile(600アップデート)を実行すると、paintEvent()がプライマリのボトルネックになるため、完了までに約50秒かかりました。私はQT4WidgetクラスをQOpenGLWidgetに変更しましたが、ゲージは表示されず、エラーも発生しません。
class Qt5Widget(QtWidgets.QOpenGLWidget):
私はQOpenGLWidgetで既存paintEvent QPainter.drawPie、QPainter.drawPixmapとQPainter.drawEllipse関数を使用することができ、または私は完全にQOpenGLWidgetとハードウェアアクセラレーションを利用するために再起動する必要がありますか?
EDIT:Qt5のC++ドキュメントの状態はQPainterのクラスに次
のOpenGL 2.0(ES) - このバックエンドは、ハードウェア加速グラフィックスのための主要なバックエンドです。 OpenGL 2.0またはOpenGL/ES 2.0仕様をサポートするデスクトップマシンおよび組み込み機器で実行できます。これには、ここ数年で生産されたほとんどのグラフィックチップが含まれます。 QOpenGLWidgetにQPainterを使用することでエンジンを有効にすることができます。
QOpenGLWidget上の既存のQPainter()関数を正しく維持する私のアプローチは正しいですか?もしそうなら、なぜ何も表示されませんか?
RPi2で更新されたQOpenGLWidgetクラスをテストしたところ、完璧に動作したため、開発マシンに正しいOpenGLバージョンがない可能性があります。 – jars121
そのコメントを回答として投稿することはできますか? – Trilarion