初めまして。杉山と申します。
最近、業務のほうでQtを使ったアプリを作成しているのですが、 困っていることがあるので、ここで質問させてください。
カメラから取得した画像を連続して表示することで、スルー表示を 実現する組み込み製品のアプリを作成しています。 しかし、Qtを用いて描画する際にちらついて表示されてしまいます。
表示方法としてはQImageのデータを使っており、 QPainterにdrawImage()を用いて表示してます。
シンプルな表示のみのプロジェクトを作って確認したところ
・Windows環境→ちらつきなし ・Linuxのデスクトップ環境→ちらつきなし ・組み込みLinux環境→ちらつく
となりました。
開発環境 Qt5.7.0(GCC 4.9.1) Qt Creator 4.0.2
コンパイラ:arm-angstrom-linux-gunueabi-g++ 使用ボード:ToradexのColibri imx6 使用OS:Linux 3.14.52
私自身、Qtは触れたばかりなので、情報がとにかく少ないです。 答えにくいかもしれませんが、ヒントだけでもいいので、 何かあればお返事を下さい。
以上、よろしくお願いします。
hermit4です。こんにちは。
QtはQWidget側でダブルバッファリングなどを行っているため、 QPainter::drawImageでは、ダブルバッファリングなどはされないかと 思います。ですので、描画速度が追いつかない等でちらついているの ではないでしょうか。
Qt - xcb - X11経由で描画されているなら、Xの設定でGPU使えないのか 調べて描画速度の向上をするとか、GPUが使えないならダブルバッファ リングを実装するなどしてみてはどうでしょうか。
まぁ、組込みLinuxだと環境を持ってないと全部想像でざっくりな回答 になるので、はずしてたらごめんなさい。
2017年2月10日 7:43 杉山 剛史(Sugiyama Tsuyoshi) sugiyama-tsuyoshi@rexxam.co.jp:
初めまして。杉山と申します。
最近、業務のほうでQtを使ったアプリを作成しているのですが、 困っていることがあるので、ここで質問させてください。
カメラから取得した画像を連続して表示することで、スルー表示を 実現する組み込み製品のアプリを作成しています。 しかし、Qtを用いて描画する際にちらついて表示されてしまいます。
表示方法としてはQImageのデータを使っており、 QPainterにdrawImage()を用いて表示してます。
シンプルな表示のみのプロジェクトを作って確認したところ
・Windows環境→ちらつきなし ・Linuxのデスクトップ環境→ちらつきなし ・組み込みLinux環境→ちらつく
となりました。
開発環境 Qt5.7.0(GCC 4.9.1) Qt Creator 4.0.2
コンパイラ:arm-angstrom-linux-gunueabi-g++ 使用ボード:ToradexのColibri imx6 使用OS:Linux 3.14.52
私自身、Qtは触れたばかりなので、情報がとにかく少ないです。 答えにくいかもしれませんが、ヒントだけでもいいので、 何かあればお返事を下さい。
以上、よろしくお願いします。
Qt-users mailing list Qt-users@qt-users.jp http://qt-users.jp/mailman/listinfo/qt-users
hermit4さん
ご回答ありがとうございます。
QPainter::drawImageでは、ダブルバッファはされないのですか。。。 てっきりQtはダブルバッファがデフォルトだと思っていました。
指摘通りX11経由で描画していると思われます。QWS(Qtのウインドウズシステム?) では、ちらつきは起きませんでした。しかし、描画がかなり遅かったため、 現在はXシステムを用いてアプリを作成しています。
よろしければ、ダブルバッファやGPUの使い方など、サイトのリンクだけでもよいので ご教授のほどお願いできませんでしょうか?
以上、よろしくお願いします。
On 2017/02/11 11:27, Shingo Ishida wrote:
hermit4です。こんにちは。
QtはQWidget側でダブルバッファリングなどを行っているため、 QPainter::drawImageでは、ダブルバッファリングなどはされないかと 思います。ですので、描画速度が追いつかない等でちらついているの ではないでしょうか。
Qt - xcb - X11経由で描画されているなら、Xの設定でGPU使えないのか 調べて描画速度の向上をするとか、GPUが使えないならダブルバッファ リングを実装するなどしてみてはどうでしょうか。
まぁ、組込みLinuxだと環境を持ってないと全部想像でざっくりな回答 になるので、はずしてたらごめんなさい。
2017年2月10日 7:43 杉山 剛史(Sugiyama Tsuyoshi) sugiyama-tsuyoshi@rexxam.co.jp:
初めまして。杉山と申します。
最近、業務のほうでQtを使ったアプリを作成しているのですが、 困っていることがあるので、ここで質問させてください。
カメラから取得した画像を連続して表示することで、スルー表示を 実現する組み込み製品のアプリを作成しています。 しかし、Qtを用いて描画する際にちらついて表示されてしまいます。
表示方法としてはQImageのデータを使っており、 QPainterにdrawImage()を用いて表示してます。
シンプルな表示のみのプロジェクトを作って確認したところ
・Windows環境→ちらつきなし ・Linuxのデスクトップ環境→ちらつきなし ・組み込みLinux環境→ちらつく
となりました。
開発環境 Qt5.7.0(GCC 4.9.1) Qt Creator 4.0.2
コンパイラ:arm-angstrom-linux-gunueabi-g++ 使用ボード:ToradexのColibri imx6 使用OS:Linux 3.14.52
私自身、Qtは触れたばかりなので、情報がとにかく少ないです。 答えにくいかもしれませんが、ヒントだけでもいいので、 何かあればお返事を下さい。
以上、よろしくお願いします。
Qt-users mailing list Qt-users@qt-users.jp http://qt-users.jp/mailman/listinfo/qt-users
Qt-users mailing list Qt-users@qt-users.jp http://qt-users.jp/mailman/listinfo/qt-users
hermit4です。文中に回答します。
QPainter::drawImageでは、ダブルバッファはされないのですか。。。 てっきりQtはダブルバッファがデフォルトだと思っていました。
上位のQWidgetが必要に応じてやるから、下位のQPainterではやって ないというだけで、自力でがりがりと書く必要がないアプリなのであ れば、QLabel::setPixmapあたりを使う方が楽なのではないかと思いま す。
指摘通りX11経由で描画していると思われます。QWS(Qtのウインドウズシステム?) では、ちらつきは起きませんでした。しかし、描画がかなり遅かったため、 現在はXシステムを用いてアプリを作成しています。
よろしければ、ダブルバッファやGPUの使い方など、サイトのリンクだけでもよいので ご教授のほどお願いできませんでしょうか?
画面がちらついているということは、多くの場合は、人の認識できる速度 で描画途中の何かが表示されているという事なので、描画過程が気になら ないように画面描画全体の速度向上を目指す(GPU等で早くする)か、描 画過程を隠すため先にバッファに描きつけてから描画する(ダブルバッ ファリング)かが、まず思いつく対処方法というだけです。両方の対策を 同時に行う必要はないです。ご理解いただいてるとは思いますが、念の ため。
GPUアクセラレーションの話は、Xの設定やドライバの話が先ですから、 まずはボードメーカーなり、Linuxを載せた所なりに問い合わせてみる とか、ボード上で有効か否かなど色々調べてみた方がよろしいかと。 他にも、描画速度を上げる方法としては、drawImageは重い処理なの で、paintEventより前に描画対象の画像だけでもQPixmapにしておい て描画時にdrawPixmapを使うだけでもずいぶん違うかと思います。
ダブルバッファリングについては、QWidget系を使うのでなければ、ご 自身で実装する事になります。だいぶ古い書籍ですが、オライリーから 出ている「入門Qt4プログラミング」の5章にQWidgetを自分でダブル バッファリングする方法の解説があるので参考になるところはあるか と思います。
このあたりは、アルゴリズムや実装の領域ですので、職業プログラマが 仕事でという事ですと、本来、質問や相談を持ちかけて良いのは社内の 先輩や同僚といった範囲までかと思います。Webでの情報が欲しいので あれば、ご自身の責任で探して下さい。
Qtに限って職業倫理に反しないだろう範囲でお答えしましたが、画面の ちらつきは、実装したコードから無駄な白塗りや画面クリアの1行を削 除すれば収まるケースから、組込みともなると、実はフレームバッファ が2本あってドライバ側で切り替えながら使われていたけど、片方がシ リコンバグで腐ってて高負荷だとノイズが乗るのでちらついて見えてた なんて、底の底の方で起きてる罠にハマってる時まであるので、簡単に 解決できるかは場合によりけりです。
質問に直接回答していないところもありますが、ヒントは色々ちりば めたつもりですので、なんとか無事に解決できるよう頑張って下さい。
hermit4さん
回答ありがとうございます。
様々なヒントがもらえたので、これらを元に 問題の解決に取り組んでみたいと思います。
コミュニティの皆様、本当にありがとうございました。
On 2017/02/13 23:52, Shingo Ishida wrote:
hermit4です。文中に回答します。
QPainter::drawImageでは、ダブルバッファはされないのですか。。。 てっきりQtはダブルバッファがデフォルトだと思っていました。
上位のQWidgetが必要に応じてやるから、下位のQPainterではやって ないというだけで、自力でがりがりと書く必要がないアプリなのであ れば、QLabel::setPixmapあたりを使う方が楽なのではないかと思いま す。
指摘通りX11経由で描画していると思われます。QWS(Qtのウインドウズシステム?) では、ちらつきは起きませんでした。しかし、描画がかなり遅かったため、 現在はXシステムを用いてアプリを作成しています。
よろしければ、ダブルバッファやGPUの使い方など、サイトのリンクだけでもよいので ご教授のほどお願いできませんでしょうか?
画面がちらついているということは、多くの場合は、人の認識できる速度 で描画途中の何かが表示されているという事なので、描画過程が気になら ないように画面描画全体の速度向上を目指す(GPU等で早くする)か、描 画過程を隠すため先にバッファに描きつけてから描画する(ダブルバッ ファリング)かが、まず思いつく対処方法というだけです。両方の対策を 同時に行う必要はないです。ご理解いただいてるとは思いますが、念の ため。
GPUアクセラレーションの話は、Xの設定やドライバの話が先ですから、 まずはボードメーカーなり、Linuxを載せた所なりに問い合わせてみる とか、ボード上で有効か否かなど色々調べてみた方がよろしいかと。 他にも、描画速度を上げる方法としては、drawImageは重い処理なの で、paintEventより前に描画対象の画像だけでもQPixmapにしておい て描画時にdrawPixmapを使うだけでもずいぶん違うかと思います。
ダブルバッファリングについては、QWidget系を使うのでなければ、ご 自身で実装する事になります。だいぶ古い書籍ですが、オライリーから 出ている「入門Qt4プログラミング」の5章にQWidgetを自分でダブル バッファリングする方法の解説があるので参考になるところはあるか と思います。
このあたりは、アルゴリズムや実装の領域ですので、職業プログラマが 仕事でという事ですと、本来、質問や相談を持ちかけて良いのは社内の 先輩や同僚といった範囲までかと思います。Webでの情報が欲しいので あれば、ご自身の責任で探して下さい。
Qtに限って職業倫理に反しないだろう範囲でお答えしましたが、画面の ちらつきは、実装したコードから無駄な白塗りや画面クリアの1行を削 除すれば収まるケースから、組込みともなると、実はフレームバッファ が2本あってドライバ側で切り替えながら使われていたけど、片方がシ リコンバグで腐ってて高負荷だとノイズが乗るのでちらついて見えてた なんて、底の底の方で起きてる罠にハマってる時まであるので、簡単に 解決できるかは場合によりけりです。
質問に直接回答していないところもありますが、ヒントは色々ちりば めたつもりですので、なんとか無事に解決できるよう頑張って下さい。 _______________________________________________ Qt-users mailing list Qt-users@qt-users.jp http://qt-users.jp/mailman/listinfo/qt-users
@nekomatuです。
実はどうレスをつけるか悩みあぐねいていいやと諦めていましたが、 hermit4さんが適切な反応をされており安堵致したところです。
QPainterはプリミティブなクラスだからそのレイヤーではダブルバッファしていないんだろうなぁと妄想しましたが、 正しかったようです。その辺り、どう調べるのが良いのか?というのは少し経験値的なものが必要だと感じました。 (私はプログラマーではないため、経験値が乏しいのです)
気になって私も調べたのですが、 検索の仕方としては"qt double buffering"では情報が古そうなものが出てきてしまってよろしくなかったです。 "qt5 double buffering"で検索すると、トップに次のドキュメントがヒットし情報量が豊富でした。 http://doc.qt.io/qt-5/qwidget.html#transparency-and-double-buffering
Qtの検索に関しては"qt5"をキーワードにする。というのが、勉強会での雑談でもよく言われるベストプラクティスの1つです。 古いバージョンの4系を調べる時は"qt4" をキーワードにすると良いようです。
ではでは。
2017年2月13日 23:52 Shingo Ishida hermit4loop@gmail.com:
hermit4です。文中に回答します。
QPainter::drawImageでは、ダブルバッファはされないのですか。。。 てっきりQtはダブルバッファがデフォルトだと思っていました。
上位のQWidgetが必要に応じてやるから、下位のQPainterではやって ないというだけで、自力でがりがりと書く必要がないアプリなのであ れば、QLabel::setPixmapあたりを使う方が楽なのではないかと思いま す。
指摘通りX11経由で描画していると思われます。QWS(Qtのウインドウズシステム?) では、ちらつきは起きませんでした。しかし、描画がかなり遅かったため、 現在はXシステムを用いてアプリを作成しています。
よろしければ、ダブルバッファやGPUの使い方など、サイトのリンクだけでもよいので ご教授のほどお願いできませんでしょうか?
画面がちらついているということは、多くの場合は、人の認識できる速度 で描画途中の何かが表示されているという事なので、描画過程が気になら ないように画面描画全体の速度向上を目指す(GPU等で早くする)か、描 画過程を隠すため先にバッファに描きつけてから描画する(ダブルバッ ファリング)かが、まず思いつく対処方法というだけです。両方の対策を 同時に行う必要はないです。ご理解いただいてるとは思いますが、念の ため。
GPUアクセラレーションの話は、Xの設定やドライバの話が先ですから、 まずはボードメーカーなり、Linuxを載せた所なりに問い合わせてみる とか、ボード上で有効か否かなど色々調べてみた方がよろしいかと。 他にも、描画速度を上げる方法としては、drawImageは重い処理なの で、paintEventより前に描画対象の画像だけでもQPixmapにしておい て描画時にdrawPixmapを使うだけでもずいぶん違うかと思います。
ダブルバッファリングについては、QWidget系を使うのでなければ、ご 自身で実装する事になります。だいぶ古い書籍ですが、オライリーから 出ている「入門Qt4プログラミング」の5章にQWidgetを自分でダブル バッファリングする方法の解説があるので参考になるところはあるか と思います。
このあたりは、アルゴリズムや実装の領域ですので、職業プログラマが 仕事でという事ですと、本来、質問や相談を持ちかけて良いのは社内の 先輩や同僚といった範囲までかと思います。Webでの情報が欲しいので あれば、ご自身の責任で探して下さい。
Qtに限って職業倫理に反しないだろう範囲でお答えしましたが、画面の ちらつきは、実装したコードから無駄な白塗りや画面クリアの1行を削 除すれば収まるケースから、組込みともなると、実はフレームバッファ が2本あってドライバ側で切り替えながら使われていたけど、片方がシ リコンバグで腐ってて高負荷だとノイズが乗るのでちらついて見えてた なんて、底の底の方で起きてる罠にハマってる時まであるので、簡単に 解決できるかは場合によりけりです。
質問に直接回答していないところもありますが、ヒントは色々ちりば めたつもりですので、なんとか無事に解決できるよう頑張って下さい。 _______________________________________________ Qt-users mailing list Qt-users@qt-users.jp http://qt-users.jp/mailman/listinfo/qt-users