Sur cette page

Mise en cache persistante des shaders avec Qt Quick 3D

Shaders et matériaux 3D

Le rendu d'un objet 3D avec un matériau implique un nuanceur de sommets et de fragments.

Lorsqu'un matériau est rencontré pour la première fois au cours de la vie d'une scène 3D, il se produit ce qui suit au moment de l'exécution :

  • Les textes sources du shader sont générés.
  • Les shaders sont envoyés à travers le pipeline de shaders standard de Qt. Il en résulte une version intermédiaire en bytecode du shader (SPIR-V), un certain nombre de variantes du code source pour d'autres API 3D (GLSL pour OpenGL, HLSL pour Direct3D, etc.) et des métadonnées supplémentaires.
  • Lorsque le moteur 3D crée un site graphics pipeline, un bytecode ou une variante de code source adapté à l'API 3D utilisée est choisi, puis l'API 3D sous-jacente effectuera probablement une compilation de seconde phase ciblant le jeu d'instructions réel du GPU.

L'ensemble de ces opérations peut s'avérer coûteux. Pour éviter cela lors des exécutions ultérieures de l'application, deux caches persistants sur disque sont utilisés.

Cache de bas niveau

Qt Quick L'application 3D s'appuie sur Qt Quick et sur le graphe de scène. La même infrastructure est utilisée pour la mise en cache persistante sur disque des binaires des programmes OpenGL, des pipelines Vulkan, etc.

Voir QQuickGraphicsConfiguration#Pipeline Cache Save and Load pour une discussion détaillée à ce sujet.

Par défaut, le cache disque des shaders est activé. Cela signifie que même lorsque la plateforme ou l'implémentation de l'API 3D n'effectue pas sa propre mise en cache persistante des shaders compilés, Qt peut toujours stocker les binaires du programme OpenGL ou des actifs similaires qui sont collectés pendant la durée de vie d'une QQuickWindow. L'écriture des données sur le disque se produit lorsque la fenêtre est fermée, et elle est rechargée lors de la prochaine exécution de l'application. De cette manière, la création de pipelines graphiques peut être sensiblement plus rapide lorsque les shaders ont été rencontrés lors d'exécutions précédentes de l'application.

Les shaders des matériaux 3D et des effets de post-traitement y participent également.

Cache de shaders de matériaux

Contrairement à Qt Quick, Qt Quick 3D s'appuie actuellement sur la génération au moment de l'exécution des textes sources des shaders pour les matériaux et les effets 3D. La seule exception est l'utilisation de l'outil Shadergen, mais cette fonctionnalité est expérimentale et n'est pas recommandée pour une utilisation en production pour le moment.

Shader ToolsLa génération des textes sources des shaders, puis l'exécution de la première phase de compilation et de transpilation (voir Qt XML pour plus de détails) peuvent être des opérations coûteuses. Pour les matériaux et les effets 2D, cela se fait généralement au moment de la construction, alors que pour la 3D, ce n'est pas une option actuellement.

C'est pourquoi Qt Quick 3D utilise un autre cache sur disque. Il stocke les ressources pour les matériaux et les effets 3D générés.

Cela signifie qu'en combinaison avec le cache de bas niveau, une scène 3D avec un matériau qui a été rencontré au cours des exécutions précédentes de l'application ne conduira pas à une opération coûteuse et bloquante lorsqu'elle sera rencontrée à nouveau au cours des exécutions suivantes.

Remarque : comme pour le shader de bas niveau et le cache de pipeline, il faut un système de fichiers accessible en écriture et la plate-forme doit fournir un emplacement de cache accessible en écriture via QStandardPaths.

L'attribut d'application Qt::AA_DisableShaderDiskCache et la variable d'environnement correspondante s'appliquent également au cache de shaders matériels. Lorsqu'il est activé, le cache de matériaux de Qt 3D et le cache de matériaux de Qt Quick 3D sont désactivés.

Remarque : l'outil qml définit cet attribut par défaut. Passez l'argument de ligne de commande --enable-shader-cache pour obtenir un comportement identique à celui des applications Qt autonomes.

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