QVulkanWindowRenderer Class
QVulkanWindowRenderer クラスは、QVulkanWindow に対するアプリケーション固有のレンダリングロジックを実装するために使用されます。詳細...
| ヘッダー: | #include <QVulkanWindowRenderer> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS Gui) target_link_libraries(mytarget PRIVATE Qt6::Gui) |
| qmake: | QT += gui |
パブリック関数
| virtual | ~QVulkanWindowRenderer() |
| virtual void | initResources() |
| virtual void | initSwapChainResources() |
| virtual void | logicalDeviceLost() |
| virtual void | physicalDeviceLost() |
| virtual void | preInitResources() |
| virtual void | releaseResources() |
| virtual void | releaseSwapChainResources() |
| virtual void | startNextFrame() = 0 |
詳細な説明
アプリケーションでは通常、QVulkanWindow と QVulkanWindowRenderer の両方をサブクラス化します。前者は入力などのイベント処理を可能にし、後者はアプリケーションのレンダリングを構成する Vulkan リソース管理およびコマンドバッファの構築を実装することを可能にします。
イベント処理に加え、QVulkanWindow のサブクラスは、QVulkanWindow::createRenderer() の実装も提供する必要があります。ここで、ウィンドウとレンダラーが接続されます。一般的な実装では、単にQVulkanWindowRendererのサブクラスの新しいインスタンスを作成します。
メンバ関数のドキュメント
[virtual noexcept] QVulkanWindowRenderer::~QVulkanWindowRenderer()
仮想デストラクタ。
[virtual] void QVulkanWindowRenderer::initResources()
この仮想関数は、レンダラーのグラフィックリソースを作成するタイミングになったときに呼び出されます。
QVulkanWindow::PersistentResources フラグやデバイスの喪失状況などによっては、QVulkanWindow の存続期間中にこの関数が複数回呼び出される場合があります。ただし、後続の呼び出しの前には、常にreleaseResources()が呼び出されます。
device()、graphicsQueue()、graphicsCommandPool() などのアクセサは、この関数内部およびその後、releaseResources() が呼び出されるまでの間のみ、有効な値を返すことが保証されています。
デフォルトの実装は空です。
[virtual] void QVulkanWindowRenderer::initSwapChainResources()
この仮想関数は、スワップチェーン、フレームバッファ、またはレンダリングパスに関連する初期化を実行できる際に呼び出されます。ウィンドウのリサイズイベントが発生すると、スワップチェーンおよび関連リソースはリセットされた後、再作成されます。そのため、initResources() とreleaseResources() の2つの呼び出しの間には、initSwapChainResources() やreleaseSwapChainResources() が複数回呼び出される場合があります。
QVulkanWindow::swapChainImageSize() のようなアクセサ関数は、この関数内部およびその後、releaseSwapChainResources() が呼び出されるまでの間のみ、有効な値を返すことが保証されています。
また、この関数は事実上、リサイズが行われるたびに呼び出されるため、サイズに依存する計算(例えば、投影行列)はここで行う必要があります。
デフォルトの実装は空です。
[virtual] void QVulkanWindowRenderer::logicalDeviceLost()
この仮想関数は、論理デバイス(VkDevice)が失われたときに呼び出されます。これは、VK_ERROR_DEVICE_LOST による何らかの操作が失敗したことを意味します。
デフォルトの実装は空です。
通常、この関数内で特別な処理を行う必要はありません。QVulkanWindow は、すべてのリソースを自動的に解放し(必要に応じてreleaseSwapChainResources()およびreleaseResources()を呼び出します)、新しいデバイスを取得して再初期化を試みます。物理デバイスも失われた場合、この再初期化の試みはphysicalDeviceLost()となる可能性があります。
physicalDeviceLost()も参照してください 。
[virtual] void QVulkanWindowRenderer::physicalDeviceLost()
この仮想関数は、物理デバイスが失われたときに呼び出されます。これは、論理デバイスの作成がVK_ERROR_DEVICE_LOST で失敗したことを意味します。
デフォルトの実装は空です。
QVulkanWindow は一定時間後に自動的に初期化を再試行するため、通常、この関数で特別な処理を行う必要はありません。
logicalDeviceLost()も参照してください 。
[virtual] void QVulkanWindowRenderer::preInitResources()
この仮想関数は、グラフィックスの初期化(最終的にinitResources()の呼び出しにつながる)が開始される直前に呼び出されます。
通常、この関数を再実装する必要はありません。しかし、物理デバイスとサーフェスの両方に基づいて判断を行う必要がある場合があります。Vulkanサーフェスはその段階では取得できないため、通常、QVulkanWindow を可視化する前にこれらの処理を実行することはできません。
その代わりに、アプリケーションはこの関数を再実装することができます。この時点では、QVulkanWindow::physicalDevice() とQVulkanInstance::surfaceForWindow() の両方が機能しますが、それ以上の論理デバイスの初期化はまだ行われていません。
デフォルトの実装は空です。
[virtual] void QVulkanWindowRenderer::releaseResources()
この仮想関数は、レンダラーのグラフィックスリソースを解放する必要があるときに呼び出されます。
実装では、この関数の呼び出し後に、後ほどinitResources()が呼び出される可能性があることを想定しておく必要があります。
QVulkanWindow は、この関数の呼び出しの前後に、デバイスがアイドル状態になるのを待つ処理を行います。
デフォルトの実装は空です。
[virtual] void QVulkanWindowRenderer::releaseSwapChainResources()
この仮想関数は、スワップチェーン、フレームバッファ、またはレンダーパスに関連するリソースを解放する必要がある際に呼び出されます。
実装では、この関数の呼び出し後に、後でinitSwapChainResources()が再度呼び出される可能性があることを想定しておく必要があります。
QVulkanWindow この関数の呼び出しの前後に、デバイスがアイドル状態になるのを待つ処理を行います。
デフォルトの実装は空です。
注:これは 、QVulkanWindow がすべてのグラフィックスリソースの解放を開始する前に、すべてのグラフィックスリソースが完全な状態で処理を行える最後の場所です。したがって、非同期で、場合によってはマルチスレッドとなるstartNextFrame() を持つ実装では、保留中のフレーム送信がある場合に備えて、この関数から戻る前に、ブロッキング待機を行い、QVulkanWindow::frameReady() を呼び出すことが不可欠です。
[pure virtual] void QVulkanWindowRenderer::startNextFrame()
この仮想関数は、次のフレームの描画呼び出しをコマンドバッファに追加する際に呼び出されます。
この関数を呼び出すたびに、その直後にQVulkanWindow::frameReady()を呼び出す必要があります。これを怠ると、レンダリングループが停止してしまいます。この呼び出しは、この関数から戻った後の任意のタイミングで実行することも可能です。つまり、非同期処理を開始し、その処理が完了した時点で初めてコマンドバッファを更新し、QVulkanWindow に通知することが可能です。
この関数が呼び出される時点で、すべてのVulkanリソースは初期化済みで利用可能な状態になっています。現在のフレームバッファとメインコマンドバッファは、QVulkanWindow::currentFramebuffer() およびQVulkanWindow::currentCommandBuffer() を通じて取得できます。論理デバイスとアクティブなグラフィックスキューは、QVulkanWindow::device() およびQVulkanWindow::graphicsQueue() を通じて利用可能です。実装では、QVulkanWindow::graphicsCommandPool() によって返されるプールから追加のコマンドバッファを作成することができます。 利便性のため、ホスト可視メモリおよびデバイスローカルメモリのインデックスは、QVulkanWindow::hostVisibleMemoryIndex() およびQVulkanWindow::deviceLocalMemoryIndex() を通じて公開されています。これらのアクセサはすべて、どのスレッドから呼び出しても安全です。
QVulkanWindow::frameReady() およびQVulkanWindowも参照してください 。
© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.