Dauerhafte Zwischenspeicherung von Shadern mit Qt Quick 3D
Shader und 3D-Materialien
Das Rendern eines 3D-Objekts mit einem Material erfordert einen Vertex- und Fragment-Shader.
Folgendes geschieht zur Laufzeit, wenn ein Material zum ersten Mal während der Lebensdauer einer 3D-Szene angetroffen wird:
- Die Shader-Quelltexte werden generiert.
- Die Shader werden durch die standardmäßige Qt-Shader-Pipeline geschickt. Das Ergebnis ist eine Bytecode-Zwischenversion des Shaders (SPIR-V), eine Reihe von Quellcodevarianten für andere 3D-APIs (GLSL für OpenGL, HLSL für Direct3D usw.) und zusätzliche Metadaten.
- Wenn die 3D-Engine eine graphics pipeline erstellt, wird ein für die verwendete 3D-API geeigneter Bytecode oder eine Quellcodevariante ausgewählt, und dann führt die zugrunde liegende 3D-API wahrscheinlich eine zweite Kompilierungsphase durch, die auf den tatsächlichen GPU-Befehlssatz abzielt.
Dies alles zusammen kann ein kostspieliger Vorgang sein. Um dies bei späteren Durchläufen der Anwendung zu vermeiden, werden zwei persistente, plattenbasierte Caches eingesetzt.
Low-Level-Cache
Qt Quick 3D stützt sich auf Qt Quick und den Szenegraphen. Für die dauerhafte, festplattenbasierte Zwischenspeicherung von OpenGL-Programmbinärdateien, Vulkan-Pipelines usw. wird die gleiche Infrastruktur verwendet.
Siehe QQuickGraphicsConfiguration#Pipeline Cache Save and Load für eine ausführliche Diskussion hierüber.
Standardmäßig ist der Shader-Festplattencache aktiviert. Das bedeutet, dass Qt auch dann, wenn die Plattform oder die 3D-API-Implementierung keine eigene dauerhafte Zwischenspeicherung von kompilierten Shadern vornimmt, die OpenGL-Programmbinärdateien oder ähnliche Assets speichern kann, die während der Lebensdauer eines QQuickWindow gesammelt werden. Das Schreiben der Daten auf die Festplatte erfolgt, wenn das Fenster geschlossen wird, und sie werden bei der nächsten Ausführung der Anwendung neu geladen. Auf diese Weise kann die Erstellung von Grafikpipelines deutlich schneller erfolgen, wenn die Shader bei früheren Durchläufen der Anwendung angetroffen wurden.
Auch die Shader für 3D-Materialien und Nachbearbeitungseffekte sind hieran beteiligt.
Material-Shader-Zwischenspeicher
Im Gegensatz zu Qt Quick verlässt sich Qt Quick 3D derzeit auf die Generierung der Shader-Quelltexte für 3D-Materialien und -Effekte während der Laufzeit. Eine Ausnahme bildet die Verwendung des Shadergen-Tools. Diese Funktion ist jedoch experimentell und wird derzeit nicht für den Produktionseinsatz empfohlen.
Die Generierung der Shader-Quelltexte und die anschließende Kompilierung und Transpilierung in der ersten Phase (siehe Qt Shader Tools für Details) kann ein teurer Vorgang sein. Bei 2D-Materialien und -Effekten geschieht dies typischerweise zur Erstellungszeit, während dies bei 3D derzeit keine Option ist.
Daher verwendet Qt Quick 3D einen weiteren festplattenbasierten Cache. Dieser speichert die Assets für die generierten 3D-Materialien und -Effekte.
In Kombination mit dem Low-Level-Cache bedeutet dies, dass eine 3D-Szene mit einem Material, das bei früheren Durchläufen der Anwendung gefunden wurde, nicht zu einer teuren, blockierenden Operation führt, wenn sie bei späteren Durchläufen erneut gefunden wird.
Hinweis: Wie beim Low-Level-Shader- und Pipeline-Cache ist auch hier ein beschreibbares Dateisystem erforderlich, und die Plattform muss über QStandardPaths einen beschreibbaren Cache-Speicherplatz bereitstellen.
Das Anwendungsattribut Qt::AA_DisableShaderDiskCache und die entsprechende Umgebungsvariable gelten auch für den Material-Shader-Cache. Wenn es gesetzt ist, werden sowohl der Low-Level-Cache von Qt als auch der Material-Cache von Qt Quick 3D deaktiviert.
Hinweis: Das qml Tool setzt dieses Attribut standardmäßig. Übergeben Sie das --enable-shader-cache Kommandozeilenargument, um ein Verhalten zu erhalten, das identisch mit eigenständigen Qt-Anwendungen ist.
© 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.