- 私のアプリケーションでは
QPainter
、widget
- によって作成され
QPainterPaths
、描画される事前計算されたパスが含まれています - は
widget
現在、QWidget
ではなくQGLWidget
ですが、これは変更される可能性があります。
- によって作成され
- 絵を画面外に移動して、チャンクジョブに分割しようとしています
- 各チャンクをにペイントし
QImage
、最後にすべての画像をに描画したいwidget
QPainterPaths
すでにチャンク化されているため、これは問題ではありません- 問題は、描画が描画よりも
QImages
約5 倍遅いことです。QWidget
- 各チャンクをにペイントし
- 私が行ったいくつかのベンチマークテスト
- 時間の値は、複数回の実行の丸め平均です
- テスト チャンクには
QPainterPaths
、それぞれ約 150 の直線セグメントを持つ100 が含まれます - 約 15,000 のパスが
QPainter::Antialiasing
レンダー ヒントで描画され、QPen
ラウンド キャップとラウンド ジョインが使用されます
QPainterPaths
私のソースは(および線幅+色;一部は描画され、一部は塗りつぶされていることを覚えておいてください)QPainter
他のすべての種類の描画サポートは必要ありませんQPainterPaths
に描画できる別のものに変換できますOpenGL buffer
。これは良い解決策です。- 私は
OpenGL
オフスクリーン レンダリングに詳しくありませんが、さまざまな種類の OpenGL バッファがあることを知っています。そのほとんどは 2D イメージ レンダリング用ではなく、頂点データ用です。
Paint Device for chunk | Rendering the chunk itself | Painting chunk on QWidget
-----------------------+----------------------------+--------------------------
QImage | 2000 ms | < 10 ms
QPixmap (*) | 250 ms | < 10 ms
QGLFramebufferObj. (*) | 50 ms | < 10 ms
QPicture | 50 ms | 400 ms
-----------------------+----------------------------+--------------------------
none (directly on a QWidget in paintEvent) | 400 ms
----------------------------------------------------+--------------------------
(*) These 2 lines have been added afterwards and are solutions to the problem!
アプリケーションを 2 つのバージョンでコンパイルしたいので、OpenGL ベース以外のソリューションも教えていただければ幸いです。また、ソリューションを非 GUI スレッド
でレンダリングできるようにしたいと考えています。OpenGL
non-OpenGL
チャンクを画面外に効率的に描画する良い方法はありますか? のペイント デバイスとして使用できる(オフスクリーン バッファー) のオフ
スクリーン カウンター部分はありますか?QGLWidget
OpenGL
QPainter