このタスクは を使用して実装するのに適しているとは思いません。ベースの描画とQSGGeometryNode
を使用して実装する方がはるかに簡単です。OpenGLは GL 描画もサポートしており、ソフトウェアよりも高速であるため、OpenGL の利点は引き続き得られます。ストックを点線または破線のパターンで使用するか、シンプルなパターンで独自のものを作成できます。QPainter
QQuickPaintedItem
QPainter
QPen
QVector
別の方法として、Qt が提供するクラスを使用する代わりに、カスタム GL 描画アプローチを使用することもできます。これは、高度な複合ジオメトリを表現する場合にかなり制限されます。インスタンス化 (利用可能な場合) を使用してパフォーマンスをさらに向上させ、ダッシュまたはドット ジオメトリをパス カーブに沿って配置することもできます。
最後になりましたが、QML Canvas 要素を使用できます。これは、ほぼ同じ操作をサポートしQPainter
、おそらく同じパフォーマンスを提供します。
編集: あなたの更新が示唆するように、QPainter
ソフトウェアと GL の両方で描画できると言った部分を見逃しており、GL 描画はしばしば大幅に高速です。また、GL コンテキストに描画することで、フレームバッファを CPU から GPU メモリに移動する必要がなくなり、GPU メモリに保持されます。したがって、オーバーヘッドはありません。QPainter
アニメーションやその他のものに関しては、確かに、あなたが提供するものに制限されている場合は不可能ですQPen
- 異なる結合、キャップなどを使用して形状をある程度変更することはできますが、奇跡はありません...シェーダーでも可能ですが、カスタム ジオメトリでのみ可能です。また、QObject
ダッシュ/ドット要素ごとにベース オブジェクトを使用して、それらを個別にアニメーション化すると、非常に高価になります。QObject
非常に重いので、軽い手では使用しないでください。そのため、FBO へのカスタム GL レンダリングは、そのような柔軟性が必要な場合に最適な方法ですが、QtQuick API から完全に GL ランドに移動する必要があります。
とにかく、破線シェーダーはそれほど複雑であってはなりません。基本的には、曲線からの距離とその長さに沿った「期間」に基づいてフラグメントに色を付けます。私はこの例を見つけましたが、自分で試したことはありません。しきい値をアニメートしたり、正弦関数を使用してファンキーなスタイルを作成したりすることもできます。
「純粋な」QtQuick 実装に関しては、API は実際にはそのようなタイプの描画タスクを処理するように設計されていません。そのため、ギャップを埋めて QML/JS から高度なペインティング機能を取得するために Canvas 要素が提供されました。Canvas は事実QPainter
上、FBO に描画するラッパーです。
結局のところ、何が可能か不可能かということにはなりませんが、どのアプローチが最も理にかなっていて、仕事を成し遂げるのに最も効率的かということになります。パフォーマンスQQuickPaintedItem
に満足できない場合は、別のより複雑なソリューションを実装し、最初のソリューションに対してプロファイルを作成することができます。結局のところ、それが最初に導入された理由です-クラスQQuickPaintedItem
で行うには不便なレガシーペインティングを処理するためです。QQuickItem