2017-03-13 14 views
1

私はQtとOpenGLを使って3Dアプリケーションを開発しています。このアプリは、中央ウィジェットとしてのQOpenGLWidgetとドックウィジェットとしてのQML UIを持つQMainWindowで構成されています。私は、ユーザーの入力とUIはレンダリングのパフォーマンスに依存することを認識しました。私のアプリケーションが低いfpsで実行されると、ユーザーの入力がすべて捕捉されず、UIを使用するのが難しくなります。QOpenGLWidgetとマルチスレッド

私は別のスレッドでレンダリングを行うことを考えていました。私はQTimerやQThreadのようないくつかの手法を試しましたが、私はいつもOpenGLコンテキストを共有したり、サイズを変更したり、QPainterを使用したりする問題を抱えています。

別のスレッドでレンダリングを行うのがよいアプローチであるかどうかは疑問です。

提案、アドバイスはありますか?

ありがとうございました。

答えて

2

一般的なGUIフレームワークは、複数のスレッドから直接使用するようには設計されておらず、QTも例外ではありません。異なるスレッドからGUIのものを作成しようとすると、通常、何らかの問題が発生します。

これらのフレームワークは通常、イベントが配置され、次々に処理される内部イベントキューを持ちます。フレームワークが正しく使用されると、GUI関連のものが1つのスレッドのみからアクセスされることが保証されます。しかし、追加のイベントをキューに追加することができます。

ここで私たちは行きます:GUI全体を1つのスレッドに保ち、もう一方のスレッドでユーザー入力処理を行います。ユーザーデータが処理されるとすぐに、適切なGUIを入力してください。

Qtが提供する方法はeです。 g。 invoke機能またはevent systemです。

0

QOpenGLWidgetを使用しないでください。すべてのために単一のQMLウィンドウを使用してください。

QQuickWindow::beforeRendering()またはQQuickWindow::afterRendering()信号を使用して、QMLのレンダリングまたはポストレンダリング機能でOpenGLのものをレンダリングします。

これはQMLのレンダリングスレッドを使用するため、作成する必要はありません。ユースケースと同期については、Qtのドキュメントで説明しています。

http://doc.qt.io/qt-5/qtquick-scenegraph-openglunderqml-example.html