QtのQtの3Dは、6のように見えますか?

翻译自What about Qt 3D in Qt 6?
原文作者:Sean Harmer

このようバルカン、金属およびDirectX 12のようなレンダラキャッシュと現代のグラフィックスAPIの作業をサポートするために:Qtの6で、私たちはQtの3Dは多くの面で向上させることが可能に、この記事では、いくつかの主要な方向に焦点を当てることを願っています。

レンダラキャッシュ

Qtの3D操作は、前の2つのデータ構造に基づいています。

シーンGraph-シーンの説明;
フレームGraph-シーングラフアプローチをレンダリングする説明。
各画像をレンダリングする、私たちは下を描画するためにGPUに変換して転送通話の抽象的なシーングラフとフレームグラフを説明するために多くの作業を行う必要があります。簡単に言えば、次のステップ:

  • 1.各トラバースフレームグラフとレンダリングフェーズを識別する。各ステージは、ターゲット(スクリーン又はFBO)をレンダリングから成り、使用するカメラと、使用するウィンドウ、どの部分がシーングラフを描画する必要があり、GPUは、特定の状態を設定(例えば、無効デプステスト、または書き込み、またはマスク・テストをイネーブル) 。
  • 各レンダリング段階2.ステップ1は、我々はシーングラフに懸念しているエンティティをスクリーニングすることが必要です。
  • 3.各エンティティと適切な相電流のレンダリングシェーダを選択します。エンティティは、異なるシェーダの異なる段階で使用することができる、例えば、単純な早期Zフラグメントシェーダ行うパディング又はシャドウマップ生成を用いて、完全な照明は、シェーダ画面上の最終的な効果を達成するために使用されます。
  • (カスタムシェーダ変数用)4.組み合わせ均一変数。
  • この情報5.すべてがRenderCommandsにバインドされています。
  • 6.すべてのフェーズが完了すると、私たちは、そのスレッドが非常にうるさいです、OpenGLの長い歴史のために別のスレッドによってOpenGLのにRenderCommandsを提出します。
  • 各スレッドの反復段階を提出し、描画コマンドは、その中に含まれる、それらを記述7.OpenGLたちの途中からOpenGLのフォーマットに変換され、元のOpenGLの関数呼び出しに割り当てられました。

これはすべてのQt 3Dは非常に柔軟になりますが、実行時のパフォーマンスを犠牲にします。通常の方法は大幅に不必要なレンダリングのオーバーヘッドを回避するために、より何をキャッシュしないことにより、パフォーマンスを向上させることができます。理論的には、我々はいくつかの中間結果をキャッシュすることにより、アップグレードを取得することができます。実際には、このような動的レンダリングモードを組み合わせた方法などを検討するために多くのものが、キャッシュをレンダリングすることは行うことは本当に難しいです。

これを追跡するためにレンダリングされたシーンの必要性の外観に影響を与えることができますが、また、どのようないくつかの属性の更新後の異なる画面間のタスクの最小セットがあり、再描画される必要があります。どうかを把握するためにあまりにも多くのものがあります 私たちは、Qtの5バージョンでは、いくつかの追跡を追加しましたが、そうすることは、より完全な再構築を必要としてきました。

詳細に我々はこの点で行った作業を説明する前に、私は別の問題を議論したいと思います:

現代のグラフィックスAPI

これまでのところ、Qtのクイックは(基本的に)完全にOpenGL(またはOpenGL ES)の上に構築された、Qtの3Dは、おそらくケースです。OpenGLは長いグラフィックエンジニアのための良いサービスを提供してきたが、それは非常に古いAPIですが、新しいAPIを導入せずに解決することはできませんいくつかのルート根ざした構造的な問題があります。現代のGPUの実際の仕事、そしてアーティストと成長させることにより、必要な処理データ量に追いつくためにしようと「改革」に加えて、OpenGLの拡張との年後。OpenGLは、この印象的な改善を推進するために多くのことを行っているが、それはまだ、特にそのマルチスレッドモデルとアプリケーション開発者モードの運転挙動を予測しようとするヒューリスティックモデルのドライブの実装を制限しているが。
ここに画像を挿入説明

前節のように、ドライバの内部に、操作のOpenGLとQtの3Dモードが非常に類似しています。あなたはOpenGLの関数呼び出しの束を送信する場合、これらの呼び出しは、(最良推定値は、ドライバによって決定された)コマンドバッファに格納されたコマンドに変換し、その後、ある時点でハードウェアに処理するために提出されます。

ハードウェアバッファコマンドが順不同で処理された後、我々は再び、次のフレームのOpenGL関数呼び出しを送信する必要があります。同じプロセスは、場所を選ぶだろう、それは非常に無駄にすることができます。

ドライブでは、運用コマンドを作成することは非常に資源集約的ですが、また、OpenGLで、すべてのスレッド内に閉じ込め。だから、廃棄物のコマンドバッファのビットをクリアします。書き込み駆動型GPUメーカーは、キャッシュデータと最適化作業に可能な限りこれを取るために、ライブラリとアプリケーション開発者の実際の意図を予測しようとすると、ヒューリスティックの多様性を追加します。これは、ドライブが難しく維持するために、より大きく、より複雑になることができ、場合によってはGPUメーカー間のパフォーマンスに大きな違いにつながりました。

OpenGLは、スレッドモデルがシングルスレッドである本質的です。はい、そのようなコンテキストを共有するようないくつかの方法を介してマルチスレッドをサポートすることができるが、ドライバコールが依然としてシリアル化され以内。歴史の20年以上のOpenGLを考えると、それは驚くべきことではありません。

OpenGLの標準時代遅れのは別の問題です。アップルは、そのグラフィックスAPIなどの金属に焦点を当て、OpenGLを廃止予定と発表しました。将来のある時点で、我々は、OpenGLはMacOSのとiOSから消えることがあります。でもその前に、プラットフォーム上でOpenGLライブラリは、(実際には、彼らは長年にわたって更新されていない)のいずれかの新しい機能は表示されません。

我々は、これらの問題のために何ができますか?まあ、過去数年間で、現代のグラフィックスAPIの登場は、これらおよび他の問題を解決するために使用されます。バルカン、金属およびDirectX 12は、彼らがGPUを制御するために、より直接的なインターフェースを提供し、OpenGLのと比較して、非常に人気のAPIです。
あなたは素晴らしいことだが、実際には妥協であることを言うかもしれません。ほとんどのOpenGLドライバは現在、ライブラリやアプリケーション開発者によって行われた仕事を担当しています。それは怖いが、ある程度まで真実に聞こえることがあります。しかし、すべての後、我々はGPUのパフォーマンスを引き出すために、操作のアプリケーションマクロモードの理解を使用することができます。一方、我々はCPU /スリープ状態または省電力モードへのGPU、そして最終的には耐久性能を向上させるようにすることを、より短時間で同様の作業を行うことを選択することができます。これは、点では、モバイルデバイスとデスクトップコンピュータのための巨大な改善です。

OpenGLドライバは、コマンドバッファを破棄し、それが各フレームで消費作成し高いですが、我々は、アプリケーション開発者としてバルカンまたは同様のツールを使用するときに、これらのコマンドバッファと、次を維持するとき、我々は知ることができます彼らは安全である再提出しました。

あなたはどのようなメリットを知りたいことがあります。同じコマンドバッファは、私たちだけが、それはありませんが、画面上に前のフレームの内容と全く同じことを見てみましょうことができます送信しますか?もしそうなら、それは何をしているのですか?

これは良い質問です。実際には、我々は再びGPUコマンドバッファに提出しなければ場合でも、彼らは異なるデータを含むことができ、リソースを参照してください。のみならず、さらに材料特性とカメラの変換行列を保存するためのほぼ均一なバッファ・オブジェクトを含むことができ、頂点バッファおよびテクスチャです。我々は物事がシーンに変化するのを追跡することができた場合、あなたは、このように素晴らしいです多くの作業を、保存、GPUに同じコマンドを再提出することができるかどうかを判断することができます。

ケーキの上のアイシングの場合があります!バルカンは、コマンドバッファのプライマリおよびセカンダリコマンドバッファの概念を使用しています。私たちの主なコマンドバッファは、GPUのコンテンツに提出され、それが補助コマンドバッファへの呼び出しが含まれていてもよいです。一般的な用途は、予め特定のコマンドを描画するエンティティ、格納二コマンドバッファに記録されています。

我々は全体のシーンを描きたい場合は、私たちのレンダラは、目に見えるそれらのエンティティのバッファコマンド発行、マスターコマンドバッファを作成することができます。視認性の変化(例えば、カメラが移動している場合、または特定のエンティティが移動する)とき、我々は、メインコマンドバッファを再記録することができます。また、非常に良いです。

ケーキの上のアイシングもっと!使用バルカン、我々はまた、異なるスレッド・バッファ内のコマンドを読み書きすることができます!我々は、異なるキューにCPUとGPUとGPUとの間で同期タスクGPUコマンドバッファ・キューに送信するための責任を負うことがあり、(グラフィックス/コンピューティング/送信、等)。

あなたが見ることができるように、我々はより多くの操作を制御し、関係するハードウェアを得ることができますが、我々はより多くの仕事をしなければなりません。全体的に、これは性能を向上させる絶好の機会です。

Qtの6 Qtの3Dで話を続けます

Qtの開発時間に6ノード、我々は積極的に一般的な方向の両方を研究しています。以上の説明からわかるように、これらのタスクの両方が行われるシーングラフとフレームグラフとその後のQt 3Dの残りの作業で追跡ユーザーのステータスを変更する方法についての多くの作業を伴います。これは、我々は最終的にキャッシュがフレームバッファ間の他の中間状態を指揮し、作業の不必要な重複を避けるためにどのように含まれています。

すでにバルカン、メタル、DirectX 11のおよびOpenGL QRhi層のためのサポートを提供し、QtのクイックとQtクイック3D再構築されたQRhi層の基礎を知っているかもしれませんが。我々はまだそれが合理的にQtの3D機能のニーズを満たすために、この機能を拡張できるかどうかを勉強したり、マルチスレッド、またはあなたは、グラフィックスAPIを統合し、他の手段を使用する必要があるかどうかのQt 3DはまだQtのクイックとQtウィジェットモジュールでうまく動作できるようにしています使用しています。

ことは行うには多くの仕事が残っているが、最初の結果は非常に有望に見えます。我々は我々が60fpsのに制限されているとき、あなたができるレンダリング速度を毎秒600(なしスクリーンティアリング)を達成することができ、GPUを最大限に活用しようとするとき、またはシーンがミッドレンジのデスクトッププラットフォームで約1000のエンティティ、だまさが含まれているテストCPU負荷の1%を達成!また、今はシングルコアを使用しています!さらに、マルチスレッドアーキテクチャを改善するために、Qtの5シリーズの限界を超えて、我々はいくつかのアイデアを検証しています。

副産物この作品の、我々はそれがQtの3Dユーザの修正に理解しやすくかつ容易ので、非常に自然ななめらかなアップデートだ、フレームグラフの次の反復のバージョンを開発しているがあります。

概要

あなたが見ることができるように、Qtの5.xのサイクル以降の時間は、私たちはQtの3Dを改善するために舞台裏で多くの作業を行います。また、公開APIを改善する方法を探しますが、我々はこの分野で大きな変化を期待していないが、あまり望ましい機能および属性名いくつかのクリーンアップの一部。
これらの改善のすべてものQt 3DとQt 3Dの開発を使用して、他の3Dアプリケーションに基づいてKuesaに貢献していきます。これらの変更は、私たちはQtの6で、よりエキサイティングな拡張を追加できるように、強固な基盤の構築を支援します。

オリジナル住所

公開された254元の記事 ウォンの賞賛484 ビュー500 000 +

おすすめ

転載: blog.csdn.net/luoyayun361/article/details/104513815