QVulkanWindowRenderer Class

Die Klasse QVulkanWindowRenderer wird verwendet, um die anwendungsspezifische Rendering-Logik für ein QVulkanWindow zu implementieren. ...

Kopfzeile: #include <QVulkanWindowRenderer>
CMake: find_package(Qt6 REQUIRED COMPONENTS Gui)
target_link_libraries(mytarget PRIVATE Qt6::Gui)
qmake: QT += gui

Öffentliche Funktionen

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

Detaillierte Beschreibung

Anwendungen sind in der Regel Unterklassen sowohl von QVulkanWindow als auch von QVulkanWindowRenderer. Erstere ermöglicht die Behandlung von Ereignissen, z. B. Eingaben, während letztere die Implementierung der Vulkan-Ressourcenverwaltung und des Befehlspufferaufbaus ermöglicht, die das Rendering der Anwendung ausmachen.

Neben der Ereignisbehandlung ist die Unterklasse QVulkanWindow auch für die Bereitstellung einer Implementierung für QVulkanWindow::createRenderer() verantwortlich. Hier werden das Fenster und der Renderer miteinander verbunden. Eine typische Implementierung wird einfach eine neue Instanz einer Unterklasse von QVulkanWindowRenderer erzeugen.

Dokumentation der Mitgliedsfunktionen

[virtual noexcept] QVulkanWindowRenderer::~QVulkanWindowRenderer()

Virtueller Destruktor.

[virtual] void QVulkanWindowRenderer::initResources()

Diese virtuelle Funktion wird aufgerufen, wenn es an der Zeit ist, die Grafikressourcen des Renderers zu erstellen.

Abhängig vom QVulkanWindow::PersistentResources Flag, von Situationen, in denen ein Gerät verloren geht, usw. kann diese Funktion mehr als einmal während der Lebensdauer eines QVulkanWindow aufgerufen werden. Nachfolgenden Aufrufen geht jedoch immer ein Aufruf von releaseResources() voraus.

Zugriffsfunktionen wie device(), graphicsQueue() und graphicsCommandPool() geben garantiert nur innerhalb dieser Funktion und danach gültige Werte zurück, bis releaseResources() aufgerufen wird.

Die Standardimplementierung ist leer.

[virtual] void QVulkanWindowRenderer::initSwapChainResources()

Diese virtuelle Funktion wird aufgerufen, wenn Swapchain-, Framebuffer- oder Renderpass-bezogene Initialisierungen durchgeführt werden können. Swapchain und verwandte Ressourcen werden zurückgesetzt und dann als Reaktion auf Ereignisse zur Größenänderung des Fensters neu erstellt, und daher kann ein Paar von Aufrufen von initResources() und releaseResources() mehrere Aufrufe von initSwapChainResources() und releaseSwapChainResources() dazwischen haben.

Zugriffsfunktionen wie QVulkanWindow::swapChainImageSize() geben garantiert nur innerhalb dieser Funktion und danach, bis zum Aufruf von releaseSwapChainResources(), gültige Werte zurück.

Dies ist auch der Ort, an dem größenabhängige Berechnungen (z. B. die Projektionsmatrix) vorgenommen werden sollten, da diese Funktion effektiv bei jeder Größenänderung aufgerufen wird.

Die Standardimplementierung ist leer.

[virtual] void QVulkanWindowRenderer::logicalDeviceLost()

Diese virtuelle Funktion wird aufgerufen, wenn das logische Gerät (VkDevice) verloren gegangen ist, d. h. eine Operation mit VK_ERROR_DEVICE_LOST fehlgeschlagen ist.

Die Standardimplementierung ist leer.

In der Regel muss in dieser Funktion nichts Besonderes ausgeführt werden. QVulkanWindow gibt automatisch alle Ressourcen frei (indem es releaseSwapChainResources() und releaseResources() aufruft) und versucht, sich neu zu initialisieren und ein neues Gerät zu beschaffen. Wenn das physische Gerät ebenfalls verloren wurde, kann dieser Reinitialisierungsversuch zu physicalDeviceLost() führen.

Siehe auch physicalDeviceLost().

[virtual] void QVulkanWindowRenderer::physicalDeviceLost()

Diese virtuelle Funktion wird aufgerufen, wenn das physische Gerät verloren geht, d. h. die Erstellung des logischen Geräts schlägt mit VK_ERROR_DEVICE_LOST fehl.

Die Standardimplementierung ist leer.

In der Regel ist es nicht notwendig, irgendetwas Besonderes in dieser Funktion auszuführen, da QVulkanWindow nach einer gewissen Zeit automatisch erneut versuchen wird, sich zu initialisieren.

Siehe auch logicalDeviceLost().

[virtual] void QVulkanWindowRenderer::preInitResources()

Diese virtuelle Funktion wird aufgerufen, bevor die Grafikinitialisierung, die mit dem Aufruf von initResources() endet, beginnt.

Normalerweise besteht keine Notwendigkeit, diese Funktion neu zu implementieren. Es gibt jedoch Fälle, in denen Entscheidungen getroffen werden müssen, die sowohl auf dem physischen Gerät als auch auf der Oberfläche basieren. Diese können normalerweise nicht durchgeführt werden, bevor die QVulkanWindow sichtbar gemacht wird, da die Vulkan-Oberfläche zu diesem Zeitpunkt nicht abrufbar ist.

Stattdessen können Anwendungen diese Funktion neu implementieren. Hier sind sowohl QVulkanWindow::physicalDevice() als auch QVulkanInstance::surfaceForWindow() funktionsfähig, aber es hat noch keine weitere Initialisierung des logischen Geräts stattgefunden.

Die Standardimplementierung ist leer.

[virtual] void QVulkanWindowRenderer::releaseResources()

Diese virtuelle Funktion wird aufgerufen, wenn die Grafikressourcen des Renderers freigegeben werden müssen.

Die Implementierung muss darauf vorbereitet sein, dass auf einen Aufruf dieser Funktion zu einem späteren Zeitpunkt ein initResources() folgen kann.

QVulkanWindow kümmert sich darum, dass vor und nach dem Aufruf dieser Funktion gewartet wird, bis das Gerät inaktiv wird.

Die Standardimplementierung ist leer.

[virtual] void QVulkanWindowRenderer::releaseSwapChainResources()

Diese virtuelle Funktion wird aufgerufen, wenn Swapchain-, Framebuffer- oder Renderpass-bezogene Ressourcen freigegeben werden müssen.

Die Implementierung muss darauf vorbereitet sein, dass auf einen Aufruf dieser Funktion zu einem späteren Zeitpunkt ein erneuter Aufruf von initSwapChainResources() folgen kann.

QVulkanWindow kümmert sich darum, dass vor und nach dem Aufruf dieser Funktion gewartet wird, bis das Gerät inaktiv wird.

Die Standardimplementierung ist leer.

Hinweis: Dies ist die letzte Stelle, an der alle Grafikressourcen intakt sind, bevor QVulkanWindow beginnt, sie freizugeben. Daher ist es unerlässlich, dass Implementierungen mit einem asynchronen, potenziell von mehreren Threads durchzogenen startNextFrame() ein blockierendes Warten durchführen und QVulkanWindow::frameReady() aufrufen, bevor sie von dieser Funktion zurückkehren, falls eine Bildübertragung ansteht.

[pure virtual] void QVulkanWindowRenderer::startNextFrame()

Diese virtuelle Funktion wird aufgerufen, wenn die Zeichenaufrufe für das nächste Bild in den Befehlspuffer eingefügt werden sollen.

Jeder Aufruf dieser Funktion muss von einem Aufruf von QVulkanWindow::frameReady() gefolgt werden. Geschieht dies nicht, wird die Rendering-Schleife angehalten. Der Aufruf kann auch zu einem späteren Zeitpunkt erfolgen, nachdem man von dieser Funktion zurückgekehrt ist. Dies bedeutet, dass es möglich ist, eine asynchrone Arbeit zu starten und den Befehlspuffer zu aktualisieren und QVulkanWindow zu benachrichtigen, wenn diese Arbeit beendet ist.

Alle Vulkan-Ressourcen sind initialisiert und bereit, wenn diese Funktion aufgerufen wird. Der aktuelle Framebuffer und der Hauptbefehlspuffer können über QVulkanWindow::currentFramebuffer() und QVulkanWindow::currentCommandBuffer() abgerufen werden. Das logische Gerät und die aktive Grafikwarteschlange sind über QVulkanWindow::device() und QVulkanWindow::graphicsQueue() verfügbar. Implementierungen können zusätzliche Befehlspuffer aus dem von QVulkanWindow::graphicsCommandPool() zurückgegebenen Pool erstellen. Der Einfachheit halber werden der Index eines sichtbaren Hosts und der Index des lokalen Speichertyps eines Geräts über QVulkanWindow::hostVisibleMemoryIndex() und QVulkanWindow::deviceLocalMemoryIndex() bereitgestellt. Alle diese Zugriffsfunktionen können sicher von jedem Thread aus aufgerufen werden.

Siehe auch QVulkanWindow::frameReady() und QVulkanWindow.

© 2025 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.