QQuickGraphicsConfiguration Class
QQuickGraphicsConfiguration steuert untergeordnete Grafikeinstellungen für die QQuickWindow. Mehr...
Kopfzeile: | #include <QQuickGraphicsConfiguration> |
CMake: | find_package(Qt6 REQUIRED COMPONENTS Quick) target_link_libraries(mytarget PRIVATE Qt6::Quick) |
qmake: | QT += quick |
Seit: | Qt 6.0 |
Öffentliche Funktionen
QQuickGraphicsConfiguration() | |
~QQuickGraphicsConfiguration() | |
QByteArrayList | deviceExtensions() const |
(since 6.5) bool | isAutomaticPipelineCacheEnabled() const |
bool | isDebugLayerEnabled() const |
bool | isDebugMarkersEnabled() const |
bool | isDepthBufferEnabledFor2D() const |
QString | pipelineCacheLoadFile() const |
QString | pipelineCacheSaveFile() const |
bool | prefersSoftwareDevice() const |
(since 6.5) void | setAutomaticPipelineCache(bool enable) |
(since 6.5) void | setDebugLayer(bool enable) |
(since 6.5) void | setDebugMarkers(bool enable) |
void | setDepthBufferFor2D(bool enable) |
void | setDeviceExtensions(const QByteArrayList &extensions) |
(since 6.5) void | setPipelineCacheLoadFile(const QString &filename) |
(since 6.5) void | setPipelineCacheSaveFile(const QString &filename) |
(since 6.5) void | setPreferSoftwareDevice(bool enable) |
(since 6.6) void | setTimestamps(bool enable) |
(since 6.6) bool | timestampsEnabled() const |
Statische öffentliche Mitglieder
(since 6.1) QByteArrayList | preferredInstanceExtensions() |
Detaillierte Beschreibung
Die Klasse QQuickGraphicsConfiguration ist ein Container für Low-Level-Grafikeinstellungen, die beeinflussen können, wie die zugrundeliegende Grafik-API, wie z.B. Vulkan, durch den Qt Quick Szenengraphen initialisiert wird. Sie kann auch bestimmte Aspekte des Szenengraphen-Renderers steuern.
Hinweis: Das Setzen einer QQuickGraphicsConfiguration auf QQuickWindow muss früh genug erfolgen, bevor der Szenegraph zum ersten Mal für dieses Fenster initialisiert wird. Bei On-Screen-Fenstern bedeutet dies, dass der Aufruf vor dem Aufruf von show() auf QQuickWindow oder QQuickView erfolgen muss. Bei QQuickRenderControl muss die Konfiguration vor dem Aufruf von initialize() abgeschlossen sein.
Konfiguration für externe Rendering-Engines oder XR-APIs
Beim Erstellen und Anzeigen einer QQuickWindow, die Vulkan zum Rendern verwendet, werden eine Vulkan-Instanz (VkInstance
), ein physisches Gerät (VkPhysicalDevice
), ein Gerät (VkDevice
) und zugehörige Objekte (Warteschlangen, Pools) über die Vulkan-API initialisiert. Das Gleiche gilt in den meisten Fällen, wenn QQuickRenderControl verwendet wird, um das Rendering auf ein benutzerdefiniertes Rendering-Ziel, wie z. B. eine Textur, umzuleiten. Während die Konstruktion von QVulkanInstance dann unter der Kontrolle der Anwendung steht, erfolgt die Initialisierung anderer Grafikobjekte in QQuickRenderControl::initialize() auf die gleiche Weise wie bei einem On-Screen QQuickWindow.
Für die meisten Anwendungen ist keine zusätzliche Konfiguration erforderlich, da Qt Quick vernünftige Standardwerte für viele Low-Level-Grafikeinstellungen bietet, z. B. welche Geräteerweiterungen aktiviert werden sollen.
Dies wird jedoch nicht immer ausreichend sein. In fortgeschrittenen Anwendungsfällen, bei der Integration direkter Vulkan- oder anderer Grafik-API-Inhalte oder bei der Integration mit einer externen 3D- oder VR-Engine, wie z. B. OpenXR, wird die Anwendung ihre eigenen Einstellungen festlegen wollen, wenn es um Details geht, z. B. welche Geräteerweiterungen zu aktivieren sind.
Genau das ermöglicht diese Klasse. Sie ermöglicht beispielsweise die Angabe einer Liste von Geräteerweiterungen, die dann vom Szenegraphen bei der Verwendung von Vulkan oder von Grafik-APIs, auf die das Konzept anwendbar ist, übernommen wird. Wenn einige Konzepte nicht anwendbar sind, werden die entsprechenden Einstellungen einfach ignoriert.
Beispiele für Funktionen in dieser Kategorie sind setDeviceExtensions() und preferredInstanceExtensions(). Letztere ist nützlich, wenn die Anwendung ihre eigene QVulkanInstance verwaltet, die dann über QWindow::setVulkanInstance() mit der QQuickWindow verknüpft wird.
Qt Quick Konfiguration des Scene Graph Renderers
Eine weitere Klasse von Einstellungen bezieht sich auf den Renderer des Szenengraphen. In manchen Fällen möchten Anwendungen ein bestimmtes Verhalten steuern, wie zum Beispiel die Verwendung des Tiefenpuffers beim Rendern von 2D-Inhalten. In Qt 5 waren solche Einstellungen entweder überhaupt nicht steuerbar oder wurden über Umgebungsvariablen verwaltet. In Qt 6 bietet QQuickGraphicsConfiguration ein neues Zuhause für diese Einstellungen, während die Unterstützung für die alten Umgebungsvariablen beibehalten wird, wo dies möglich ist.
Ein Beispiel aus dieser Kategorie ist setDepthBufferFor2D().
Grafikgeräte-Konfiguration
Wenn die Grafikinstanz und die Geräteobjekte (z. B. die VkInstance und das VkDevice bei Vulkan, das ID3D11Device bei Direct 3D usw.) von Qt bei der Initialisierung eines QQuickWindow erstellt werden, gibt es Einstellungen, die Anwendungen oder Bibliotheken unter bestimmten Umständen kontrollieren möchten.
Vor Qt 6.5 waren einige dieser Einstellungen über Umgebungsvariablen steuerbar. Zum Beispiel QSG_RHI_DEBUG_LAYER
oder QSG_RHI_PREFER_SOFTWARE_RENDERER
. Diese sind immer noch verfügbar und funktionieren wie zuvor. QQuickGraphicsConfiguration bietet zusätzlich C++ Setter.
Zum Beispiel öffnet die folgende main()-Funktion eine QQuickView und gibt dabei an, dass die Vulkan-Validierung oder die Direct3D-Debug-Schicht aktiviert sein soll:
int main(int argc, char *argv[]) { QGuiApplication app(argc, argv); QQuickGraphicsConfiguration config; config.setDebugLayer(true); QQuickView *view = new QQuickView; view->setGraphicsConfiguration(config); view->setSource(QUrl::fromLocalFile("myqmlfile.qml")); view->show(); return app.exec(); }
Pipeline-Cache speichern und laden
Qt Quick unterstützt das Speichern des Grafik-/Rechen-Pipeline-Caches auf der Festplatte und das erneute Laden in späteren Durchläufen einer Anwendung. Was genau der Pipeline-Cache enthält, wie Lookups funktionieren und was genau beschleunigt wird, hängt vom Qt RHI Backend und der zugrunde liegenden nativen Grafik-API ab, die zur Laufzeit verwendet wird. Verschiedene 3D-APIs haben unterschiedliche Konzepte, wenn es um Shader, Programme und Pipeline-Statusobjekte und entsprechende Cache-Mechanismen geht. Das High-Level-Pipeline-Cache-Konzept hier abstrahiert all dies auf das Speichern und Abrufen eines einzelnen binären Blob in und aus einer Datei.
Hinweis: Die Speicherung des Cache auf der Festplatte kann bei späteren Durchläufen der Anwendung zu teilweise erheblichen Verbesserungen führen.
Wenn derselbe Shader-Programm- und/oder Pipeline-Zustand wie in einem früheren Lauf angetroffen wird, werden wahrscheinlich eine Reihe von Operationen übersprungen, was zu schnelleren Shader- und Materialinitialisierungszeiten führt, was bedeutet, dass der Start schneller erfolgen kann und Verzögerungen und "Ruckler" während des Renderns reduziert oder vermieden werden können.
Wenn Sie mit einer Grafik-API arbeiten, bei der das Abrufen und erneute Laden des Pipeline-Caches (oder von Shader-/Programmbinärdateien) nicht möglich ist oder nicht unterstützt wird, hat der Versuch, eine Datei zum Speichern und Laden des Caches zu verwenden, keine Auswirkungen.
Hinweis: In vielen Fällen sind die abgerufenen Daten vom Grafiktreiber (und möglicherweise der genauen Version davon) abhängig und an diesen gebunden. Qt führt die notwendigen Überprüfungen automatisch durch, indem es zusätzliche Metadaten in der Pipeline-Cache-Datei speichert. Wenn die Daten in der Datei zur Laufzeit nicht mit dem Grafikgerät und der Treiberversion übereinstimmen, wird der Inhalt für die Anwendung transparent ignoriert. Es ist daher sicher, auf einen Cache zu verweisen, der mit einem anderen Gerät oder Treiber erzeugt wurde.
Es gibt Ausnahmen von dem Problem der Treiberabhängigkeit, insbesondere Direct 3D 11, wo der "Pipeline-Cache" nur zum Speichern der Ergebnisse der HLSL->DXBC-Kompilierung zur Laufzeit verwendet wird und daher geräte- und herstellerunabhängig ist.
In einigen Fällen kann es wünschenswert sein, den allerersten Lauf der Anwendung zu verbessern, indem der Cache "vorgesättigt" wird. Dies ist möglich, indem man die Cache-Datei, die bei einem früheren Lauf gespeichert wurde, versendet und auf einem anderen Rechner oder Gerät referenziert. Auf diese Weise stehen der Anwendung oder dem Gerät bereits beim ersten Lauf die Shader-Programme/Pipelines zur Verfügung, die bei dem Lauf, bei dem die Cache-Datei gespeichert wurde, bereits verwendet wurden. Das Versenden und Bereitstellen der Cache-Datei ist nur dann sinnvoll, wenn das Gerät und die Grafiktreiber auf dem Zielsystem identisch sind. Andernfalls wird die Cache-Datei ignoriert, wenn die Geräte- oder Treiberversion nicht übereinstimmt (mit Ausnahme von D3D11), wie oben beschrieben.
Sobald der Cache-Inhalt geladen ist, besteht immer noch die Möglichkeit, dass die Anwendung Grafik- und Berechnungspipelines erstellt, die bei früheren Durchläufen nicht angetroffen wurden. In diesem Fall wird der Cache erweitert und die Pipelines/Shader-Programme werden hinzugefügt. Wenn die Anwendung den Inhalt auch speichert (vielleicht sogar in der gleichen Datei), werden sowohl die alten als auch die neuen Pipelines gespeichert. Das Laden aus und Speichern in dieselbe Datei bei jedem Lauf ermöglicht einen ständig wachsenden Cache, der alle angetroffenen Pipelines und Shader-Programme speichert.
In der Praxis kann man davon ausgehen, dass der Qt-Pipeline-Cache den folgenden nativen Grafik-API-Features entspricht:
- Vulkan - VkPipelineCache - Das Speichern des Pipeline-Caches speichert effektiv den Blob, der von vkGetPipelineCacheData abgerufen wird, mit zusätzlichen Metadaten, um das Gerät und den Treiber sicher zu identifizieren, da der Pipeline-Cache-Blob vom genauen Treiber abhängig ist.
- Metal - MTLBinaryArchive - Wenn das Speichern des Pipeline-Caches aktiviert ist, speichert Qt alle angetroffenen Render- und Compute-Pipelines in einem MTLBinaryArchive. Das Speichern des Pipeline-Caches speichert den aus dem Archiv abgerufenen Blob mit zusätzlichen Metadaten, um das Gerät zu identifizieren. Hinweis: Derzeit ist die Verwendung von MTLBinaryArchive unter macOS und iOS aufgrund verschiedener Probleme bei einigen Hardware- und Betriebssystemversionen deaktiviert.
- OpenGL - Es gibt kein natives Konzept von Pipelines, der "Pipeline-Cache" speichert eine Sammlung von Programm-Binaries, die über glGetProgramBinary abgerufen werden. Die Programm-Binärdateien werden in einen einzigen Blob gepackt, mit zusätzlichen Metadaten zur Identifizierung des Geräts, des Treibers und seiner Version, von dem die Binärdateien abgerufen wurden. Das dauerhafte Zwischenspeichern von Programm-Binärdateien ist in Qt nicht neu: Qt 5 hatte bereits eine ähnliche Funktionalität in QOpenGLShaderProgram, siehe z.B. addCacheableShaderFromSourceCode(). In der Tat ist dieser Mechanismus auch in Qt 6 immer aktiv, wenn Qt Quick mit OpenGL verwendet wird. Wenn man jedoch die neue, von der Grafik-API unabhängige Pipeline-Cache-Abstraktion verwendet, die hier zur Verfügung gestellt wird, wird der binäre Programm-Cache aus der Qt-5-Ära automatisch deaktiviert, da derselbe Inhalt nun in den "Pipeline-Cache" verpackt wird.
- Direct 3D 11 - Es gibt kein natives Konzept für Pipelines oder das Abrufen von Binärdateien für die zweite Phase der Kompilierung (in der der herstellerunabhängige, zwischengeschaltete Bytecode in den gerätespezifischen Befehlssatz kompiliert wird). Die Treiber verwenden in der Regel ihr eigenes Caching-System auf dieser Ebene. Stattdessen wird der Qt Quick "Pipeline-Cache" verwendet, um Fälle zu beschleunigen, in denen die Shader HLSL-Quellcode enthalten, der zunächst in das Zwischen-Bytecode-Format kompiliert werden muss. Dies kann in Anwendungen und Bibliotheken, die Shader-Code zur Laufzeit kompilieren, zu erheblichen Leistungsverbesserungen führen, da in nachfolgenden Läufen die potenziell teuren, nicht zwischengespeicherten Aufrufe von D3DCompile() vermieden werden können, wenn der Bytecode für den angetroffenen HLSL-Shader bereits verfügbar ist. Ein gutes Beispiel ist Qt Quick 3D, wo die zur Laufzeit generierten Shader für Materialien den Umgang mit HLSL-Quellcode erfordern. Das Speichern und erneute Laden des Qt Quick Pipeline-Caches kann daher in Szenen, die ein oder mehrere View3D Elemente enthalten, erhebliche Verbesserungen bringen. Ein Gegenbeispiel könnte Qt Quick selbst sein: Da die meisten eingebauten Shader für 2D-Inhalte mit DirectX-Bytecode ausgeliefert werden, der zur Erstellungszeit generiert wird, wird der Cache keine wesentlichen Verbesserungen bringen.
All dies ist unabhängig von der Shader-Verarbeitung, die durch das Qt Shader Tools Modul und seine Befehlszeilen-Tools wie qsb
durchgeführt wird. Nehmen wir als Beispiel Vulkan. Es ist gut, den Vulkan-kompatiblen GLSL-Quellcode entweder zur Offline- oder zur Build-Zeit (direkt über qsb oder CMake) nach SPIR-V zu kompilieren, da die teure Kompilierung aus dem Quellcode zur Laufzeit vermieden wird. SPIR-V ist jedoch ein herstellerunabhängiges Zwischenformat. Zur Laufzeit, beim Aufbau von Grafik- oder Rechenpipelines, findet wahrscheinlich eine weitere Kompilierungsrunde statt, diesmal vom Zwischenformat in den herstellerspezifischen Befehlssatz der GPU (und dies kann auch von bestimmten Zuständen in der Grafikpipeline und den Render-Targets abhängig sein). Der Pipeline-Cache hilft bei dieser letzten Phase.
Hinweis: Viele Grafik-API-Implementierungen verwenden ihren eigenen persistenten Festplatten-Cache, der für die Anwendungen transparent ist. Die Verwendung der Pipeline-Cache-Funktion von Qt Quick wird in diesem Fall wahrscheinlich Verbesserungen bringen, aber die Gewinne könnten geringer sein.
Rufen Sie setPipelineCacheSaveFile() und setPipelineCacheLoadFile() auf, um zu steuern, in welche Dateien QQuickWindow oder QQuickView den Pipeline-Cache speichert bzw. aus ihnen lädt.
Um einen Eindruck von den Auswirkungen der Aktivierung der Festplattenspeicherung des Pipeline-Caches zu bekommen, aktivieren Sie die wichtigsten Szenegrafik- und Grafikprotokolle entweder über die Umgebungsvariable QSG_INFO=1
oder die beiden Protokollierungskategorien qt.scenegraph.general
und qt.rhi.general
. Beim Schließen von QQuickWindow gibt es eine Log-Meldung wie die folgende:
Total time spent on pipeline creation during the lifetime of the QRhi was 123 ms
Dies gibt eine ungefähre Vorstellung davon, wie viel Zeit während der Lebensdauer des Fensters für die Erstellung von Grafiken und Berechnungspipelines aufgewendet wurde (was verschiedene Stufen der Shader-Kompilierung beinhalten kann).
Wenn das Laden aus einer Pipeline-Cache-Datei aktiviert ist, wird dies mit einer Meldung bestätigt:
Attempting to seed pipeline cache from 'filename'
Um zu überprüfen, ob das Speichern des Caches erfolgreich aktiviert wurde, suchen Sie nach einer Meldung wie dieser:
Writing pipeline cache contents to 'filename'
Der automatische Pipeline-Cache
Wenn kein Dateiname für das Speichern und Laden angegeben wird, wird die automatische Pipeline-Caching-Strategie verwendet. Dabei werden die Daten im anwendungsspezifischen Cache-Speicher des Systems gespeichert (QStandardPaths::CacheLocation).
Dies kann auf eine der folgenden Arten deaktiviert werden:
- Setzen Sie das Anwendungsattribut Qt::AA_DisableShaderDiskCache. (schaltet die automatische Speicherung vollständig aus)
- Setzen Sie die Umgebungsvariable QT_DISABLE_SHADER_DISK_CACHE auf einen Wert ungleich Null. (schaltet die automatische Speicherung vollständig aus)
- Setzen Sie die Umgebungsvariable QSG_RHI_DISABLE_SHADER_DISK_CACHE auf einen Wert ungleich Null. (schaltet die automatische Speicherung vollständig aus)
- Rufen Sie setAutomaticPiplineCache() auf und setzen Sie das Argument enable auf false. (schaltet die automatische Speicherung vollständig aus)
- Setzen eines Dateinamens durch Aufruf von setPipelineCacheLoadFile(). (deaktiviert nur das Laden aus dem automatischen Speicher und bevorzugt stattdessen die angegebene Datei)
- Setzen eines Dateinamens durch Aufruf von setPipelineCacheSaveFile(). (deaktiviert nur das Schreiben in den automatischen Speicher, stattdessen wird die angegebene Datei bevorzugt)
Die ersten beiden sind existierende Mechanismen, die seit Qt 5.9 verwendet werden, um den Binärcache des OpenGL-Programms zu kontrollieren. Aus Gründen der Kompatibilität und Vertrautheit werden das gleiche Attribut und die gleiche Umgebungsvariable auch für den erweiterten Pipeline-Cache von Qt 6 unterstützt.
Der automatische Pipeline-Cache verwendet eine einzige Datei pro Anwendung, aber eine andere für jedes RHI-Backend (Grafik-API). Das bedeutet, dass ein Wechsel zu einer anderen Grafik-API beim nächsten Durchlauf der Anwendung nicht dazu führt, dass der im vorherigen Durchlauf erzeugte Pipeline-Cache verloren geht. Anwendungen mit mehreren QQuickWindow Instanzen, die gleichzeitig angezeigt werden, profitieren jedoch möglicherweise nicht zu 100 % davon, da der automatische Cache nur die von jeweils einem RHI Objekt gesammelten Daten speichern kann. (und mit der Standard-Rendering-Schleife threaded
hat jedes Fenster sein eigenes RHI, da das Rendering unabhängig auf dedizierten Threads läuft). Um den Disk-Cache in Anwendungen mit mehreren Fenstern voll auszunutzen, sollten Sie den Dateinamen explizit pro Fenster über setPipelineCacheSaveFile() festlegen.
Siehe auch QQuickWindow::setGraphicsConfiguration(), QQuickWindow, und QQuickRenderControl.
Dokumentation der Mitgliedsfunktionen
QQuickGraphicsConfiguration::QQuickGraphicsConfiguration()
Konstruiert eine standardmäßige QQuickGraphicsConfiguration, die keine zusätzlichen Einstellungen für den Szenengraphen enthält, die zu berücksichtigen wären.
[noexcept]
QQuickGraphicsConfiguration::~QQuickGraphicsConfiguration()
Zerstörer.
QByteArrayList QQuickGraphicsConfiguration::deviceExtensions() const
Gibt die Liste der angeforderten zusätzlichen Geräteerweiterungen zurück.
Siehe auch setDeviceExtensions().
[since 6.5]
bool QQuickGraphicsConfiguration::isAutomaticPipelineCacheEnabled() const
Gibt true zurück, wenn der automatische Pipeline-Cache aktiviert ist.
Standardmäßig ist dies true, sofern nicht bestimmte Anwendungsattribute oder Umgebungsvariablen festgelegt sind. Siehe The Automatic Pipeline Cache für weitere Informationen.
Diese Funktion wurde in Qt 6.5 eingeführt.
Siehe auch setAutomaticPipelineCache().
bool QQuickGraphicsConfiguration::isDebugLayerEnabled() const
Gibt true zurück, wenn die Debug-/Validierungsebenen aktiviert werden sollen.
Standardmäßig ist der Wert false.
Siehe auch setDebugLayer().
bool QQuickGraphicsConfiguration::isDebugMarkersEnabled() const
Gibt true zurück, wenn Debug-Markierungen aktiviert sind.
Standardmäßig ist der Wert false.
Siehe auch setDebugMarkers().
bool QQuickGraphicsConfiguration::isDepthBufferEnabledFor2D() const
Gibt true zurück, wenn die Verwendung des Tiefenpuffers für 2D-Inhalte aktiviert ist.
Standardmäßig ist der Wert true, sofern die Umgebungsvariable QSG_NO_DEPTH_BUFFER
nicht gesetzt ist.
QString QQuickGraphicsConfiguration::pipelineCacheLoadFile() const
Gibt den aktuell eingestellten Dateinamen für das Laden des Pipeline-Cache zurück.
Standardmäßig ist der Wert eine leere Zeichenfolge.
Siehe auch setPipelineCacheLoadFile().
QString QQuickGraphicsConfiguration::pipelineCacheSaveFile() const
Gibt den aktuell eingestellten Dateinamen für die Speicherung des Pipeline-Cache zurück.
Standardmäßig ist der Wert eine leere Zeichenfolge.
Siehe auch setPipelineCacheSaveFile().
[static, since 6.1]
QByteArrayList QQuickGraphicsConfiguration::preferredInstanceExtensions()
Gibt die Liste der Vulkan-Instanzerweiterungen zurück, die Qt Quick bevorzugt in der VkInstance aktiviert haben möchte.
In den meisten Fällen ist Qt Quick für die Erstellung einer QVulkanInstance verantwortlich. Diese Funktion ist dann nicht relevant. Andererseits, wenn QQuickRenderControl in Kombination mit Vulkan-basiertem Rendering verwendet wird, liegt es in der Verantwortung der Anwendung, ein QVulkanInstance zu erstellen und es mit dem (offscreen) QQuickWindow zu verknüpfen. In diesem Fall wird erwartet, dass die Anwendung die Liste der zu aktivierenden Instanzerweiterungen abfragt und sie an QVulkanInstance::setExtensions() übergibt, bevor sie QVulkanInstance::create() aufruft.
Diese Funktion wurde in Qt 6.1 eingeführt.
bool QQuickGraphicsConfiguration::prefersSoftwareDevice() const
Gibt true zurück, wenn ein Software-Rasterizer-basiertes Grafikgerät priorisiert ist.
Standardmäßig ist der Wert false.
Siehe auch setPreferSoftwareDevice().
[since 6.5]
void QQuickGraphicsConfiguration::setAutomaticPipelineCache(bool enable)
Ändert die Verwendung des automatischen Pipeline-Cache auf der Grundlage von enable.
Der Standardwert ist true, sofern nicht bestimmte Anwendungsattribute oder Umgebungsvariablen festgelegt sind. Siehe The Automatic Pipeline Cache für weitere Informationen.
Diese Funktion wurde in Qt 6.5 eingeführt.
Siehe auch isAutomaticPipelineCacheEnabled().
[since 6.5]
void QQuickGraphicsConfiguration::setDebugLayer(bool enable)
Aktiviert die Debug- oder Validierungsschichten der Grafik-API-Implementierung, sofern verfügbar.
In der Praxis wird dies mit Vulkan und Direct 3D 11 unterstützt, vorausgesetzt, die notwendige Unterstützung (Validierungsschichten, Windows SDK) ist installiert und zur Laufzeit verfügbar. Wenn enable true ist, wird Qt versuchen, die Standard-Validierungsschicht auf der VkInstance zu aktivieren oder D3D11_CREATE_DEVICE_DEBUG
auf dem Grafikgerät zu setzen.
Für Metal unter macOS setzen Sie stattdessen die Umgebungsvariable METAL_DEVICE_WRAPPER_TYPE=1
, bevor Sie die Anwendung starten.
Der Aufruf dieser Funktion mit enable auf true ist gleichbedeutend mit dem Setzen der Umgebungsvariablen QSG_RHI_DEBUG_LAYER
auf einen Wert ungleich Null.
Der Standardwert ist false.
Hinweis: Das Aktivieren von Debug- oder Validierungsschichten kann einen nicht unerheblichen Einfluss auf die Leistung haben. Es wird dringend davon abgeraten, Anwendungen mit aktiviertem Flag in die Produktion zu überführen.
Hinweis: Beachten Sie, dass diese Einstellung aufgrund von Unterschieden im Design der zugrunde liegenden Grafik-APIs nicht immer per-QQuickWindow eingestellt werden kann, auch wenn jede QQuickWindow ihre eigene QQuickGraphicsConfiguration hat. Insbesondere bei Vulkan wird das Instanzobjekt (VkInstance) nur einmal erstellt und dann von allen Fenstern in der Anwendung verwendet. Daher wirkt sich die Aktivierung der Validierungsschicht auf alle Fenster aus. Das bedeutet auch, dass der Versuch, die Validierung über ein Fenster zu aktivieren, das erst angezeigt wird, wenn einige andere Fenster bereits mit dem Rendering begonnen haben, bei Vulkan keine Wirkung hat. Andere APIs, wie z.B. D3D11, stellen das Debug-Layer-Konzept als eine Einstellung pro Gerät (ID3D11Device) zur Verfügung, so dass es auf einer echten Pro-Fenster-Basis gesteuert wird (unter der Annahme, dass die Renderschleife des Szenegraphen ein dediziertes Grafikgerät/Kontext für jedes QQuickWindow verwendet).
Diese Funktion wurde in Qt 6.5 eingeführt.
Siehe auch isDebugLayerEnabled().
[since 6.5]
void QQuickGraphicsConfiguration::setDebugMarkers(bool enable)
Wo dies möglich ist, steuert enable das Einfügen von Debug-Markern und Objektnamen in den Grafikbefehlsstrom.
Einige Frameworks, wie z. B. Qt Quick 3D, haben die Möglichkeit, die von ihnen erstellten Grafikobjekte (Puffer, Texturen) mit Namen zu versehen und auch den Beginn und das Ende von Render-Passes im Befehlspuffer anzugeben. Diese sind dann in Frame-Captures sichtbar, die mit Tools wie RenderDoc oder XCode erstellt wurden.
Grafik-APIs, von denen man erwarten kann, dass sie unterstützt werden, sind Vulkan (wenn VK_EXT_debug_utils verfügbar ist), Direct 3D 11 und Metal.
Der Aufruf dieser Funktion mit enable auf true ist gleichbedeutend mit dem Setzen der Umgebungsvariablen QSG_RHI_PROFILE
auf einen Wert ungleich Null.
Der Standardwert ist false.
Hinweis: Das Aktivieren von Debug-Markern kann sich auf die Leistung auswirken. Es wird nicht empfohlen, Anwendungen mit aktiviertem Flag in die Produktion zu überführen.
Diese Funktion wurde in Qt 6.5 eingeführt.
Siehe auch isDebugMarkersEnabled().
void QQuickGraphicsConfiguration::setDepthBufferFor2D(bool enable)
Legt die Verwendung des Tiefenpuffers für 2D-Inhalte auf enable fest. Wenn diese Option deaktiviert ist, schreibt der Qt Quick -Szenengraph nie in den Tiefenpuffer.
Standardmäßig ist der Wert true, es sei denn, die Umgebungsvariable QSG_NO_DEPTH_BUFFER
ist gesetzt.
Der Standardwert "true" ist die optimale Einstellung für die große Mehrheit der Szenen. Die Deaktivierung der Verwendung des Tiefenpuffers verringert die Effizienz der Stapelverarbeitung des Szenengraphen.
Es gibt jedoch Fälle, in denen das Schreiben des 2D-Inhalts in den Tiefenpuffer nicht ideal ist. Betrachten Sie eine 3D-Szene als "Overlay" über der 2D-Szene, gerendert über Qt Quick 3D unter Verwendung von View3D mit renderMode auf Overlay
. In diesem Fall kann das Füllen des Tiefenpuffers durch 2D-Inhalte zu unerwarteten Ergebnissen führen. Dies liegt daran, dass die Art und Weise, wie der 2D-Szenengraph-Renderer Tiefenwerte generiert und behandelt, nicht unbedingt mit der Funktionsweise einer 3D-Szene kompatibel ist. Dies kann zu Überschneidungen von Tiefenwerten, Kollisionen und unerwarteten Fehlern bei der Tiefenprüfung führen. Daher ist der robuste Ansatz hier, diese Funktion mit enable auf false zu setzen und das Schreiben von Tiefenpuffern für den 2D-Inhalt in QQuickWindow zu deaktivieren.
Hinweis: Dieses Flag ist nicht vollständig identisch mit dem Setzen der Umgebungsvariablen QSG_NO_DEPTH_BUFFER
. Dieses Flag steuert nicht das Vorhandensein von Tiefenschablonenpuffern. Es ist vielmehr für die Rendering-Pipeline relevant. Um zu erzwingen, dass Tiefen-/Schablonenanhänge überhaupt nicht vorhanden sind, setzen Sie QSG_NO_DEPTH_BUFFER
und QSG_NO_STENCIL_BUFFER
. Beachten Sie jedoch, dass eine solche QQuickWindow und alle darin enthaltenen Elementebenen dann mit Elementen wie View3D in bestimmten Betriebsmodi inkompatibel werden können, da 3D-Inhalte einen Tiefenpuffer benötigen. Der Aufruf dieser Funktion ist immer sicher, kann aber dazu führen, dass Ressourcen, wie z. B. Tiefenpuffer, angelegt werden, obwohl sie nicht aktiv genutzt werden.
void QQuickGraphicsConfiguration::setDeviceExtensions(const QByteArrayList &extensions)
Legt die Liste der zusätzlichen extensions fest, die auf dem Grafikgerät aktiviert werden sollen (z. B. VkDevice
).
Beim Rendern mit einer Grafik-API, auf die das Konzept nicht anwendbar ist, wird extensions ignoriert.
Hinweis: Die Liste gibt zusätzliche, zusätzliche Erweiterungen an. Qt Quick aktiviert immer die Erweiterungen, die für den Szenegraphen erforderlich sind.
Siehe auch deviceExtensions().
[since 6.5]
void QQuickGraphicsConfiguration::setPipelineCacheLoadFile(const QString &filename)
Legt die filename fest, von der erwartet wird, dass QQuickWindow den anfänglichen Inhalt seines Grafik-/Rechen-Pipeline-Cache lädt. Der Standardwert ist leer, d. h. das Laden des Pipeline-Caches ist deaktiviert.
Siehe Pipeline Cache Save and Load für eine Diskussion über Pipeline-Caches.
Das dauerhafte Speichern des Pipeline-Caches kann zu Leistungsverbesserungen bei zukünftigen Durchläufen der Anwendung führen, da teure Shader-Kompilierungs- und Pipeline-Aufbauschritte vermieden werden können.
Ob und wann das Laden des Dateiinhalts geschieht, ist nicht definiert, abgesehen davon, dass es irgendwann während der Initialisierung des Szenegraphen der QQuickWindow geschieht. Daher muss die Datei nach dem Aufruf dieser Funktion weiter existieren. QQuickGraphicsConfiguration speichert nur den Dateinamen, sie kann selbst keine eigentlichen E/A- und Grafikoperationen durchführen. Die eigentliche Arbeit wird erst später erledigt, möglicherweise in einem anderen Thread.
Wenn Sie mit einer Grafik-API arbeiten, bei der das Abrufen und Neuladen des Pipeline-Caches (oder von Shader-/Programm-Binärdateien) nicht anwendbar ist oder nicht unterstützt wird, hat der Aufruf dieser Funktion keine Auswirkungen.
Der Aufruf dieser Funktion entspricht im Wesentlichen dem Setzen der Umgebungsvariablen QSG_RHI_PIPELINE_CACHE_LOAD
auf filename, mit einem wichtigen Unterschied: Diese Funktion steuert den Pipeline-Cache-Speicher nur für das zugehörige QQuickWindow. Anwendungen mit mehreren QQuickWindow - oder QQuickView -Instanzen können daher den Cache-Inhalt über Dateien, die für jedes Fenster bestimmt sind, speichern und später wieder laden. Die Umgebungsvariable lässt dies nicht zu.
Hinweis: Wenn die Daten in der Datei zur Laufzeit nicht mit dem Grafikgerät und der Treiberversion übereinstimmen, wird der Inhalt ignoriert, was für die Anwendung transparent ist. Dies gilt für eine Reihe von Grafik-APIs, und die notwendigen Überprüfungen werden von Qt übernommen. Es gibt Ausnahmen, vor allem Direct 3D 11, wo der "Pipeline Cache" nur verwendet wird, um die Ergebnisse der HLSL->DXBC-Kompilierung zur Laufzeit zu speichern und daher geräte- und herstellerunabhängig ist.
Diese Funktion wurde in Qt 6.5 eingeführt.
Siehe auch pipelineCacheLoadFile() und setPipelineCacheSaveFile().
[since 6.5]
void QQuickGraphicsConfiguration::setPipelineCacheSaveFile(const QString &filename)
Legt die filename fest, in der QQuickWindow den Inhalt des Grafik-/Rechen-Pipeline-Caches speichern soll. Der Standardwert ist leer, d. h. das Laden des Pipeline-Caches ist deaktiviert.
Siehe Pipeline Cache Save and Load für eine Diskussion über Pipeline-Caches.
Das dauerhafte Speichern des Pipeline-Caches kann zu Leistungsverbesserungen bei zukünftigen Durchläufen der Anwendung führen, da teure Shader-Kompilierungs- und Pipeline-Aufbauschritte vermieden werden können.
Ob und wann das Schreiben der Datei erfolgt, ist nicht definiert. Es wird wahrscheinlich zu einem bestimmten Zeitpunkt geschehen, wenn der Szenegraph aufgrund des Schließens des Fensters abgerissen wird. Daher sollten Anwendungen nicht davon ausgehen, dass die Datei verfügbar ist, bis QQuickWindow vollständig zerstört ist. QQuickGraphicsConfiguration speichert nur den Dateinamen, führt aber keine eigenen E/A- und Grafikoperationen durch.
Wenn Sie mit einer Grafik-API arbeiten, bei der das Abrufen des Pipeline-Caches (oder von Shader-/Programmbinärdateien) nicht möglich ist oder nicht unterstützt wird, hat der Aufruf dieser Funktion keine Auswirkungen.
Der Aufruf dieser Funktion entspricht im Wesentlichen dem Setzen der Umgebungsvariablen QSG_RHI_PIPELINE_CACHE_SAVE
auf filename, mit einem wichtigen Unterschied: Diese Funktion steuert den Pipeline-Cache-Speicher nur für das zugehörige QQuickWindow. Anwendungen mit mehreren QQuickWindow - oder QQuickView -Instanzen können daher den Cache-Inhalt über Dateien, die für jedes Fenster bestimmt sind, speichern und später wieder laden. Die Umgebungsvariable erlaubt dies nicht.
Diese Funktion wurde in Qt 6.5 eingeführt.
Siehe auch pipelineCacheSaveFile(), pipelineCacheLoadFile(), und setPipelineCacheSaveFile().
[since 6.5]
void QQuickGraphicsConfiguration::setPreferSoftwareDevice(bool enable)
Fordert die Auswahl eines Adapters oder physischen Geräts an, das softwarebasierte Rasterung verwendet. Gilt nur, wenn die zugrundeliegende API die Aufzählung von Adaptern unterstützt (z. B. Direct 3D oder Vulkan), und wird ansonsten ignoriert.
Wenn die Grafik-API-Implementierung keinen solchen Grafikadapter oder kein physisches Gerät zur Verfügung hat, wird die Anforderung ignoriert. Bei Direct 3D kann davon ausgegangen werden, dass ein WARP-basierter Rasterizer immer verfügbar ist. Bei Vulkan hat das Flag nur eine Auswirkung, wenn Mesas lavapipe
oder ein anderes physikalisches Gerät, das VK_PHYSICAL_DEVICE_TYPE_CPU
meldet, verfügbar ist.
Der Aufruf dieser Funktion mit enable auf true ist gleichbedeutend mit dem Setzen der Umgebungsvariablen QSG_RHI_PREFER_SOFTWARE_RENDERER
auf einen Wert ungleich Null.
Der Standardwert ist false.
Diese Funktion wurde in Qt 6.5 eingeführt.
Siehe auch prefersSoftwareDevice().
[since 6.6]
void QQuickGraphicsConfiguration::setTimestamps(bool enable)
Wenn diese Funktion aktiviert ist, werden GPU-Timing-Daten von Befehlspuffern auf Plattformen und 3D-APIs gesammelt, wo dies unterstützt wird. Diese Daten werden dann in den Renderer-Protokollen ausgedruckt, die über die Umgebungsvariable QSG_RENDER_TIMING
oder Protokollierungskategorien wie qt.scenegraph.time.renderloop
aktiviert werden können, und können auch für andere Module sichtbar gemacht werden, wie z. B. Qt Quick 3D's DebugView Element.
Standardmäßig ist dies deaktiviert, da das Sammeln der Daten je nach zugrunde liegender Grafik-API zusätzliche Arbeit, wie das Einfügen von Zeitstempel-Abfragen in den Befehlsstrom, bedeuten kann. Um dies zu aktivieren, rufen Sie entweder diese Funktion auf, wenn enable auf true gesetzt ist, oder setzen Sie die Umgebungsvariable QSG_RHI_PROFILE
auf einen Wert ungleich null.
Grafik-APIs, bei denen eine Unterstützung zu erwarten ist, sind Direct 3D 11, Direct 3D 12, Vulkan (solange die zugrunde liegende Vulkan-Implementierung Zeitstempelabfragen unterstützt), Metal und OpenGL mit einem Kern- oder Kompatibilitätsprofilkontext für Version 3.3 oder neuer. Zeitstempel werden von OpenGL ES nicht unterstützt.
Diese Funktion wurde in Qt 6.6 eingeführt.
Siehe auch timestampsEnabled() und setDebugMarkers().
[since 6.6]
bool QQuickGraphicsConfiguration::timestampsEnabled() const
Gibt true zurück, wenn die GPU-Timing-Sammlung aktiviert ist.
Standardmäßig ist der Wert false.
Diese Funktion wurde in Qt 6.6 eingeführt.
Siehe auch setTimestamps().
© 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.