Qtブログ(日本語)

Qt Graphs

作成者: Qt Group 日本オフィス|Sep 27, 2024 2:11:34 AM
本稿は「QtGraphs」の抄訳です。
 

このブログ記事では、データを2Dおよび3Dグラフで視覚化するQtの最新モジュールを紹介します。Qt Graphs と呼ばれるこのモジュールは、Qt 6.8 のリリースに伴い、正式に技術プレビュー版(TP)から外れる予定です。このモジュールは、2Dと3Dのデータ可視化を単一のパッケージに統合し、Qt 5 の初期に導入された古い Qt ChartsQt Data Visualization モジュールを事実上置き換えるものです。これらのモジュールを組み合わせることで、ユーザーはデータ可視化のニーズに適したモジュールをより直感的に、かつ便利に見つけることができるようになります。

レンダリング性能向上

3Dデータ視覚化モジュールが作成された当時、Qtには現在のような洗練されたグラフィックの抽象化や3Dレンダリングエンジンがありませんでした。そのため、Qt Data Visualization専用にカスタムのOpenGLレンダリングエンジンが作成されました。このレンダリングエンジンはOpenGL ES 2を使用するデバイスで動作する必要があったため、インスタンス化レンダリングのような最新のOpenGL機能が欠如していました。また、レンダリングエンジンがOpenGLを使用しているため、UIコンポーネントもOpenGLを使用する必要がありました。アプリケーションにOpenGLの使用を強制した結果、WindowsのDirect3Dなど、より優れたグラフィックの代替手段があるプラットフォームでは、最適とは言えないパフォーマンスしか得られませんでした。

Qt Graphsの3D側は、グラフの視覚化にQt Quick 3Dを使用しているため、OpenGLに限定されるものではありません。Qt Chartsはグラフィックビューフレームワークを使用していたため、ウィジェットフレームワークと非常に緊密に結合されていました。通常、これはソフトウェアレンダリングソリューションを使用することを意味します。しかし、Qt GraphsはQt Quickフレームワークをベースとしているため、2Dグラフはハードウェアアクセラレーションレンダリングを使用します。

3DデータAPIの変更

Qt Data Visualization と Qt Graphs の変更点は、データ API が大幅に改良されたように、表面的な部分だけではありません。 以前の API では、新しいデータ配列のヒープ割り当てが必要でした。 しかし現在では、すべてのデータをスタックに割り当てることができ、不要なデータのコピーを回避するためにムーブ セマンティクスが使用されています。

これらの API の変更に加えて、プロキシの使用方法も明確化されました。 Qt Data Visualization では、プロキシ内にデータSeries(シリーズ)に渡されたデータが含まれていました。しかし、プロキシはデータを保持するのではなく、データを渡すための中間レイヤーとして機能すべきです。Qt Graphsでは、データは依然としてプロキシに渡されますが、プロキシはデータを保存するのではなく、すぐにシリーズに渡します。

Widgetサポート

Qt Graphsは、Qt Data Visualizationのようなウィジェットでも使用できます。しかし、いくつかの違いがあります。Qt Quick 3DはQuickレンダリングインフラストラクチャを使用しているため、QWidgetの代わりにQQuickWidgetを使用する必要があります。Qt GraphsがTPにあった間は、すべてのグラフがQQuickWidgetから継承されていました。しかし、この設計はウィジェットフレームワークへの依存関係を強固に作り出すため、最適ではありませんでした。そのため、継承ではなく合成を使用するように設計が変更されました。

インタラクション方法

Qt Graphsは、3Dグラフのインタラクション方法についてはQt Data Visualizationと同じものを継承していますが、その実装は大幅に簡素化されています。以前は、Qt Data VisualizationはQAbstract3DInputHandlerQ3DInputHandlerQTouch3DInputHandlerを使用していました。現在は、すべてのクイック入力ハンドラを統合する単一クラス、QGraphsInputHandlerがあります。Qt Chartsでは、QQuickItemからグラフィックシーンイベントにイベントを変換していましたが、Qt Graphsの2D側では、QQuickItemからのイベントを直接使用できるようになりました。

テーマの変更

以前は、テーマはアプリケーションの視覚的な側面、例えば色、可視性、照明、フォントなどに多大な影響を与えていました。例えば、明るい色のテーマを設定すると、プラットフォームが暗い配色を使用していても、グラフのすべての色が明るい色に変更されてしまう可能性がありました。Qt Graphsでは、Q3DThemeタイプがQGraphsThemeに置き換えられ、2Dと3Dの両方で使用されています。QGraphsThemeは、配色とテーマという2つの異なる論理部分に分割されました。

配色は、グラフのメインオブジェクト以外の色、例えば背景、プロット領域、グリッド線、ラベルの背景、テキストなどを制御します。配色の値には、ライト、ダーク、自動の3種類があります。自動配色は、プラットフォームの配色に従います。当社のUXチームは、配色とすべてのデフォルトテーマを、Qtで現在使用されている標準に従うように近代化しました。

新機能

QtGraphsの3DはQQuick3Dで実装されており、これによりいくつかの新機能が可能になります。

現在では、他のQQuick3D要素をグラフに統合できるようになっています。importSceneプロパティを使用することで、モデル、ライト、パーティクルエミッタ、反射プローブのコレクションをグラフシーンに追加することができます。同様に、トーンマッピングモード、ポストプロセス効果、スカイボックスなど、シーン環境を拡張して使用することも可能です。これにより、興味深いシーンを実現することができます。

Qt Graphsは、Bars3DとScatter3Dの透明性もサポートするようになりました。Surface3Dの透明性は、既知の問題があるため現在はサポートされていませんが、今後追加される予定です。

3Dグラフのパフォーマンス

Qt Graphsでは、すべての3Dグラフタイプのパフォーマンスを向上させるための取り組みが行われてきました。棒グラフと散布図については、QtQuick3D が提供するモデルのインスタンス化機能を活用することで、多数の棒や点を効率的に表示できるようになりました。Qt Graphs は、optimizationHint: Legacy プロパティを使用して有効にできる、インスタンス化されていないレンダリングも引き続きサポートしています。曲面グラフについては、頂点の位置決めタスクを頂点シェーダーに切り替え、この操作に GPU の能力を活用しています。

改善を確認するために、パフォーマンステストを考案しました。このテストでは、100点から開始し、継続的にデータを変更するグラフをインスタンス化します。一定時間、シーンのFPSを測定し、その後、測定値を集約します。次に、グラフの点数を増やし、グラフのFPSを再測定します。この手順を各グラフタイプに対して実行します。

Qt Graphsの棒グラフと散布図は、インスタンス化された構成とインスタンス化されていない構成の両方で実行されました。一方、Qt Data Vizualizationでは静的構成と動的構成が使用されました。

このテストは、CPUにIntel i7-8700、GPUにNVIDIA Quadro 4000を搭載したLinuxマシン上で実行されました。Qt GraphsのRHIバックエンドにはOpenGLを使用し、すべてのテストで垂直同期(VSync)をオフにしました。MSAAは4倍に設定し、シャドウはテストではオフにしました。



レガシー構成の3DグラフはデフォルトのData Visualizationよりもパフォーマンスが劣りますが、3Dグラフのデフォルト構成では各グラフの平均FPSが著しく向上しており、新しい技術がパフォーマンスの向上に有効であることが示唆されています。

今後の展開

Qt Graphs は今後も開発が続けられ、新たにリクエストされた機能はすでに検討されています。例えば、グラフに3D要素を埋め込むことは可能ですが、QQuick3Dシーンにグラフを埋め込むことはまだできません。パラメトリックスプラインレンダリングも要望の多い機能であり、現在開発中です。2Dでは、x軸をグラフの上部または下部に表示するかどうかを変更できる機能が今後追加される予定です。同様に、y軸は左右に変更できるようになります。