[Qt レンダリング エンジン] この記事では、ラスター エンジン (Raster)、OpenGL、ローカル描画システムを含む、qt の 3 つのレンダリング エンジンについて理解します。


概要

Qt は、ラスター エンジン (Raster)、OpenGL、ネイティブ描画システムなど、さまざまなレンダリング エンジンを提供します。どのエンジンを選択するかは、主にアプリケーション要件とハードウェア環境によって異なります。

  • ラスター: これは Qt のソフトウェア レンダリング エンジンで、すべての描画操作を CPU 上で実行します。ラスター エンジンは、すべてのプラットフォームで一貫したビジュアルを提供しますが、ハードウェア アクセラレーション エンジンよりも低速になる可能性があります。

  • OpenGL: これは、GPU 上で描画操作を実行する、クロスプラットフォームのハードウェア アクセラレーション レンダリング API です。OpenGL は、より高速なレンダリング速度と豊かな視覚効果を提供できますが、OpenGL をサポートするハードウェアとドライバーが必要です。

  • ネイティブ描画システム: これは、Windows の GDI または Direct2D、macOS の Quartz、Linux の X11 または Wayland などのオペレーティング システムの描画 API を使用します。ネイティブ グラフィック システムは、オペレーティング システムと一致する視覚効果を提供できますが、オペレーティング システムとハードウェアによって制限される場合があります。

アプリケーションで最速のレンダリング速度と豊富な視覚効果が必要な場合は、OpenGL を使用する必要があります。アプリケーションがオペレーティング システムと一致する視覚効果を必要とする場合は、ネイティブ描画システムを使用する必要があります。アプリケーションがすべてのプラットフォームで一貫した視覚効果を提供する必要がある場合、またはハードウェアが OpenGL をサポートしていない場合は、ラスター エンジンを使用する必要があります。

エンジンの詳しい説明

ラスターエンジン(ラスター)

ラスター エンジンは、CPU 上ですべての描画操作を実行する Qt のレンダリング エンジンです。このエンジンは、ラスタライゼーションと呼ばれる技術を使用して、ベクトル グラフィックス (線、曲線、多角形など) をピクセルのグリッド (つまりラスター) に変換します。

ラスター エンジンの主な利点は、Qt によって完全に制御され、オペレーティング システムやハードウェアの特異性に依存しないため、すべてのプラットフォームで一貫した視覚効果を提供できることです。これにより、アプリケーションがすべてのプラットフォームで同じように見えることが保証されるため、クロスプラットフォーム アプリケーションで非常に役立ちます。

また、ラスター エンジンは特別なハードウェア サポートを必要としないため、ハードウェア アクセラレーション レンダリングをサポートしていない一部の古いデバイスやローエンド デバイスを含む、Qt をサポートするあらゆるデバイス上で実行できます。

ただし、ラスター エンジンの主な欠点は、すべての描画操作を GPU ではなく CPU で実行するため、ハードウェア アクセラレータ エンジンよりも遅くなる可能性があることです。CPU は一般に、グラフィックス レンダリングに必要な大規模な並列コンピューティングではなく、複雑なロジックと制御フローの処理において GPU よりも優れています。したがって、アプリケーションで大量のグラフィックス レンダリングを実行する場合、または複雑な視覚効果を実装する必要がある場合、ラスター エンジンのパフォーマンスが不十分であることが判明する可能性があります。

全体として、ラスター エンジンは、クロスプラットフォームの一貫性を必要とするアプリケーションやローエンド ハードウェアで実行するアプリケーションに適した、柔軟で信頼性の高いレンダリング エンジンです。ただし、高性能のグラフィック レンダリングを必要とするアプリケーションの場合は、OpenGL などのハードウェア アクセラレーション レンダリング エンジンの使用を検討することをお勧めします。
Qt::AA_ForceRasterWidgetsQt がネイティブ描画システムの代わりにグリッド エンジンを使用してすべてのウィンドウとコントロールを描画するように強制する属性。これはアプリケーションのパフォーマンスと視覚効果に影響を与える可能性があるため、アプリケーションの要件とハードウェア環境に応じてこのプロパティを設定するかどうかを決定する必要があります。

OpenGL

Qt の OpenGL サポートは組み込まれています。つまり、Qt バージョンが OpenGL をサポートしている限り、OpenGL を追加インストールしなくても Qt アプリケーションで OpenGL を使用できます。

ただし、Qt アプリケーションで OpenGL を使用するには、システムに OpenGL をサポートするグラフィックス ドライバーが必要です。これは通常、OpenGL をサポートするグラフィック カード ドライバーがシステムにインストールされている必要があることを意味します。最新のデスクトップ システム (Windows、macOS、ほとんどの Linux ディストリビューションを含む) には OpenGL をサポートするグラフィック ドライバーが同梱されているため、通常は手動でインストールする必要はありません。

システムに OpenGL をサポートするグラフィックス ドライバーがない場合、またはグラフィックス ドライバーが必要な OpenGL のバージョンをサポートしていない場合は、新しいグラフィックス ドライバーを手動でインストールする必要がある場合があります。これには通常、グラフィックス カードの製造元の Web サイトからドライバーをダウンロードし、その指示に従ってインストールする必要があります。

Qt は OpenGL をサポートしていますが、すべての Qt 機能が OpenGL を必要とするわけではないことに注意してください。ほとんどの Qt 機能 (Qt Widgets および Qt Quick 2D を含む) は、OpenGL のないシステムでも動作します。OpenGL を必要とするのは、特定の機能 (Qt Quick 3D や一部の Qt 3D 機能など) のみです。

Qt は OpenGL の緊密な統合を提供するため、開発者は OpenGL の強力な機能を利用して、豊富な視覚効果を備えたアプリケーションを作成できます。Qt の OpenGL に関する重要なポイントをいくつか示します。

  1. QOpenGLWidget および QOpenGLWindow : これら 2 つのクラスは、OpenGL を使用して描画できるウィンドウまたはコントロールを提供します。およびメソッドをオーバーライドしてinitializeGLOpenGL コードを実行できます。resizeGLpaintGL

  2. QOpenGLFunctions : このクラスは、クロスプラットフォームの OpenGL API を提供します。このクラスを使用すると、OpenGL ヘッダー ファイルを直接組み込んだり、OpenGL ライブラリをリンクしたりせずに、OpenGL 関数を呼び出すことができます。

  3. QOpenGLBuffer、QOpenGLVertexArrayObject、QOpenGLFramebufferObject : これらのクラスは、OpenGL バッファー、頂点配列オブジェクト、およびフレームバッファー オブジェクトのラッパーを提供します。これらのクラスを使用して OpenGL データを管理できます。

  4. QOpenGLShader および QOpenGLShaderProgram : これら 2 つのクラスは、OpenGL シェーダおよびシェーダ プログラムのカプセル化を提供します。これらのクラスを使用して、シェーダをコンパイル、リンク、使用できます。

  5. QOpenGLTexture : このクラスは、OpenGL テクスチャのラッパーを提供します。このクラスを使用して、テクスチャをロード、生成、使用できます。

  6. Qt Quick と QML : Qt Quick は、QML 言語と OpenGL を使用して動的なハードウェア アクセラレーション ユーザー インターフェイスを作成する Qt のモジュールです。Qt Quick と QML を使用すると、OpenGL コードを直接記述することなく、豊富なアニメーションや視覚効果を備えたアプリケーションを作成できます。

  7. スレッド サポート: Qt は、マルチスレッド環境での OpenGL の使用をサポートします。OpenGL コンテキストとリソースを別のスレッドで作成して使用することはできますが、OpenGL スレッドの安全性の問題に注意する必要があります。

  8. 拡張機能のサポート: Qt は OpenGL の拡張機能をサポートしています。QOpenGLContext::hasExtensionおよびQOpenGLContext::getProcAddressメソッドを使用して、OpenGL 拡張機能を調べて使用できます。

  9. デバッグ サポート: Qt は OpenGL デバッグをサポートします。このクラスを使用してQOpenGLDebugLogger、OpenGL デバッグ メッセージを取得できます。

一般に、Qt は OpenGL を使用するためのツールとクラスの完全なセットを提供し、開発者が豊富な視覚効果を備えたアプリケーションを簡単に作成できるようにします。

ネイティブ描画システム

Qt では、「ネイティブ グラフィックス システム」は通常、オペレーティング システムのネイティブ グラフィックス API を使用してユーザー インターフェイスをレンダリングすることを指します。これらの API は、オペレーティング システムと一致する視覚効果を提供できますが、オペレーティング システムとハードウェアによって制限される場合があります。

Qt はさまざまなオペレーティング システムをサポートしているため、さまざまなネイティブ描画システムも備えています。ここではいくつかの例を示します。

  • Windows では、Qt は GDI (グラフィックス デバイス インターフェイス) または Direct2D を使用できます。GDI は Windows の従来の描画 API であり、すべての描画操作を CPU 上で実行します。Direct2D は、GPU 上で描画操作を実行する Windows の新しい描画 API であり、より高速なレンダリングとより豊かな視覚効果を提供します。

  • macOS では、Qt は Quartz を使用できます。Quartz は macOS の描画 API であり、GPU 上で描画操作を実行し、macOS で一貫した視覚効果を提供できます。

  • Linux では、Qt は X11 または Wayland を使用できます。X11 は Linux の従来の描画 API であり、すべての描画操作を CPU 上で実行します。Wayland は、GPU 上でグラフィックス操作を実行し、より高速なレンダリングとより豊かな視覚効果を提供する Linux 用の新しいグラフィックス API です。

Qt のネイティブ描画システムは、通常、ウィンドウやコントロールの描画に使用されます。ただし、Qt は、任意の描画デバイス上で複雑な 2D グラフィックスを描画できる QPainter など、より高度な描画関数も提供します。QPainter は、ネイティブ描画システム、またはラスター エンジンや OpenGL などの他のレンダリング エンジンを使用できます。

アプリケーションがオペレーティング システムと一致する視覚効果を必要とする場合は、ネイティブ描画システムを使用する必要があります。ただし、アプリケーションがすべてのプラットフォームで一貫した視覚効果を提供する必要がある場合、またはアプリケーションが複雑な 2D グラフィックスを必要とする場合は、QPainter またはその他のレンダリング エンジンを使用する必要がある場合があります。

戦略モードでさまざまなエンジンを選択

C++ では、仮想関数を継承およびオーバーライドすることで抽象基本クラスを実装できます。この例では、RasterEngineStrategy、 、OpenGLEngineStrategyおよび はNativeEngineStrategyすべて のApplicationEngineStrategyサブクラスであり、setEngine関数をオーバーライドします。具体的な実装は次のとおりです。

#include <QApplication>
#include <QSurfaceFormat>
#include <memory>

class ApplicationEngineStrategy {
    
    
public:
    virtual void setEngine(QApplication& app) = 0;
};

class RasterEngineStrategy : public ApplicationEngineStrategy {
    
    
public:
    void setEngine(QApplication& app) override {
    
    
        app.setAttribute(Qt::AA_ForceRasterWidgets, true);
    }
};

class OpenGLEngineStrategy : public ApplicationEngineStrategy {
    
    
public:
    void setEngine(QApplication& app) override {
    
    
        QSurfaceFormat format;
        format.setVersion(3, 2);
        format.setProfile(QSurfaceFormat::CoreProfile);
        QSurfaceFormat::setDefaultFormat(format);
    }
};

class NativeEngineStrategy : public ApplicationEngineStrategy {
    
    
public:
    void setEngine(QApplication& app) override {
    
    
        app.setAttribute(Qt::AA_ForceRasterWidgets, false);
    }
};

class Application {
    
    
private:
    std::unique_ptr<ApplicationEngineStrategy> strategy;
public:
    void setEngineStrategy(std::unique_ptr<ApplicationEngineStrategy> newStrategy) {
    
    
        strategy = std::move(newStrategy);
    }
    void applyEngineStrategy(QApplication& app) {
    
    
        if (strategy) {
    
    
            strategy->setEngine(app);
        }
    }
};

int main(int argc, char *argv[])
{
    
    
    QApplication a(argc, argv);

    Application app;
    // 根据需要选择不同的策略
    app.setEngineStrategy(std::make_unique<RasterEngineStrategy>());
    app.applyEngineStrategy(a);

    // ...
    return a.exec();
}

この例では、RasterEngineStrategy::setEngine関数はQt::AA_ForceRasterWidgetsプロパティを に設定しtrue、Qt にグリッド エンジンの使用を強制します。OpenGLEngineStrategy::setEngine関数はデフォルトを設定しますQSurfaceFormat。これにより、Qt は OpenGL エンジンを使用します。NativeEngineStrategy::setEngineこの関数はQt::AA_ForceRasterWidgetsプロパティを に設定しますfalse。これにより、Qt はネイティブ描画システムを使用します。

この例では、ApplicationEngineStrategy仮想関数を定義する抽象基本クラスsetEngineこの関数はQApplication参照を取得し、そのレンダリング エンジンを設定します。

ApplicationこのクラスにはApplicationEngineStrategy一意のポインター メンバーがありますstrategysetEngineStrategyポリシーを設定する機能とapplyEngineStrategyポリシーを適用する機能を持ちます。

このようにして、実行時のニーズに応じてさまざまなレンダリング エンジンを選択できます。たとえば、次のような戦略パターンを使用できます。

int main(int argc, char *argv[])
{
    
    
    QApplication a(argc, argv);

    Application app;
    if (useRasterEngine) {
    
    
        app.setEngineStrategy(std::make_unique<RasterEngineStrategy>());
    } else if (useOpenGLEngine) {
    
    
        app.setEngineStrategy(std::make_unique<OpenGLEngineStrategy>());
    } else {
    
    
        app.setEngineStrategy(std::make_unique<NativeEngineStrategy>());
    }
    app.applyEngineStrategy(a);

    // ...
}

この例では、useRasterEngineuseOpenGLEngine、 はuseNativeEngineアプリケーションの構成オプションであり、ニーズに応じて値を設定できます。

デフォルトの動作

デフォルトでは、Qt は、ハードウェアとオペレーティング システムに応じて、通常はネイティブ グラフィック システムまたは OpenGL である最適なレンダリング エンジンを使用しようとします。特別な必要がない場合、通常はレンダリング エンジンを手動で設定する必要はありません。

ただし、場合によっては、レンダリング エンジンを手動で設定する必要がある場合があります。たとえば、アプリケーションで特別なレンダリング効果が必要な場合は、OpenGL の使用を強制する必要がある場合があります。または、ハードウェアが OpenGL をサポートしていない場合は、ラスター エンジンの使用を強制する必要がある場合があります。

現在のレンダリング エンジンを取得することに関しては、Qt にはそれを行うための直接 API がありません。ただし、関連するプロパティや状態を調べることで、現在のレンダリング エンジンを推測することができます。たとえば、Qt::AA_ForceRasterWidgetsプロパティを確認して、それが である場合true、Qt はラスター エンジンを使用しているはずです。あるいは、メソッドによって返されたオブジェクトの型を確認することもできますQWidgetその型である場合、Qt は OpenGL を使用しているはずです。ただし、Qt は異なるウィンドウやコントロールで異なるレンダリング エンジンを使用する可能性があるため、これらの方法はいずれも 100% 信頼できるわけではないことに注意してください。paintEngineQPaintEngineQOpenGLPaintEngine

エピローグ

理解することは、プログラミング学習の次のレベルへの重要なステップです。ただし、新しいスキルやアイデアを習得するには、常に時間と粘り強さが必要です。心理学の観点から見ると、学習には継続的な試行錯誤と調整が伴うことが多く、これは私たちの脳が問題を解決するための「アルゴリズム」を徐々に最適化していくのと似ています。

だからこそ、間違いに遭遇したときは、それを単なる強迫観念ではなく、学び改善する機会として捉える必要があります。これらの問題を理解して解決することで、現在のコードを修正できるだけでなく、プログラミング能力を向上させ、将来のプロジェクトで同じ間違いが起こるのを防ぐことができます。

皆さんも積極的に参加し、プログラミング スキルを継続的に向上させることをお勧めします。あなたが初心者であろうと経験豊富な開発者であろうと、私のブログがあなたの学習の旅に役立つことを願っています。この記事が役立つと思われる場合は、クリックしてブックマークするか、コメントを残して洞察や経験を共有してください。また、私のブログの内容について提案や質問をすることも歓迎します。「いいね!」、コメント、シェア、フォローのすべてが私にとって最大のサポートであり、共有し、創作を続けるモチベーションとなっています。


私の CSDN ホームページを読んで、よりエキサイティングなコンテンツのロックを解除してください: Bubble の CSDN ホームページ
ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/qq_21438461/article/details/131760627