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 l’utilisation d’un shader de sommets et d’un shader de fragments.

Voici ce qui se passe au moment de l'exécution lorsqu'un matériau est rencontré pour la première fois au cours du cycle de vie d'une scène 3D :

  • Les textes sources des shaders sont générés.
  • Les shaders sont acheminés via le pipeline de shaders standard de Qt. Il en résulte une version intermédiaire en bytecode du shader (SPIR-V), plusieurs variantes de code source pour d’autres API 3D (GLSL pour OpenGL, HLSL pour Direct3D, etc.), ainsi que des métadonnées supplémentaires.
  • Lorsque le moteur 3D crée une « graphics pipeline », une variante de bytecode ou de code source adaptée à l’API 3D utilisée est choisie, puis l’API 3D sous-jacente effectuera probablement une deuxième phase de compilation ciblant le jeu d’instructions réel du GPU.

Tout cela peut représenter une opération coûteuse en ressources. Pour éviter cela lors des exécutions suivantes de l’application, deux caches persistants, basés sur le disque, sont utilisés.

Cache de bas niveau

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

Voir QQuickGraphicsConfiguration#Pipeline Cache Save and Load pour une explication 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 tout de même stocker les binaires de programmes OpenGL ou les ressources similaires collectées au cours du cycle de vie d’une QQuickWindow. L'écriture des données sur le disque a lieu à la fermeture de la fenêtre, et celles-ci sont rechargées lors de la prochaine exécution de l'application. De cette manière, la création des pipelines graphiques peut être nettement plus rapide lorsque les shaders ont déjà été rencontrés lors d'exécutions précédentes de l'application.

Les shaders associés aux matériaux 3D et aux effets de post-traitement participent également à ce processus.

Cache des shaders de matériaux

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

La génération des textes sources des shaders, suivie de la compilation et de la transpilisation de première phase (voir Qt Shader Tools pour plus de détails), peut s’avérer une opération coûteuse en ressources. Pour les matériaux et effets 2D, cela se produit généralement au moment de la compilation, alors que pour la 3D, ce n’est actuellement pas possible.

C’est pourquoi Qt Quick 3D utilise un autre cache sur disque. Celui-ci stocke les ressources des matériaux et effets 3D générés.

Cela signifie que, combiné au cache de bas niveau, une scène 3D comportant un matériau déjà rencontré lors des exécutions précédentes de l’application n’entraînera pas d’opération coûteuse et bloquante lorsqu’elle sera à nouveau rencontrée lors d’exécutions ultérieures.

Remarque : tout comme pour le cache de bas niveau des shaders et du pipeline, cela nécessite un système de fichiers accessible en écriture et que la plateforme fournisse 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 des shaders de matériaux. Lorsqu’ils sont définis, le cache de matériaux de bas niveau de Qt et celui de ` Qt Quick 3D` sont tous deux 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.

Activez la catégorie de journalisation « qt.quick3d.cache » pour obtenir des informations concernant le cache de matériaux 3D lors de l'exécution.

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