Cherchez Unity

Les conseils d'Asa pour le profilage et l'optimisation de l'éclairage

Voici quelques unes des meilleures astuces d'Asa Reed : comment choisir entre un shader vertex ou fragment, des outils de débogage, et enfin ses sept optimisations préférées.

Shader vertex ou fragment : lequel choisir ?

Shader vertex : Si les performances sont votre priorité, alors ce type de shader vous convient probablement. Il agit sur chaque vertex de votre maillage, tandis qu'un shader fragment agit sur chaque pixel dans les triangles composés par ces vertex.

Les shaders vertex ont toutefois leurs limites : il est impossible d'obtenir des données d'éclairage précises ou de mapper les textures avec un shader de ce type. Mais ils permettent de modifier les textures UV coordonnées par un montant arbitraire (pour obtenir une sorte d'effet de surface animée, par exemple) dans un shader vertex a lieu d'un shader fragment.

Unity-shader-optimization-vertex-shader

Un exemple de modèle avec shader vertex, à partir d'exemples de shaders vertex et fragment.

Les effets de surface et d'éclairage dans les shaders vertex ont tendance à s'exécuter plus rapidement, mais la qualité/fidélité visuelle est inférieure. Toute opération qui cible spécifiquement la géométrie (vertex) doit toujours être exécutée dans un shader vertex, par exemple, le skinning de processeur.

Shader fragment : si vous voulez des visuels haute qualité ou des effets de surface intéressants, et si vous avez besoin d'un éclairage lisse et correct, le shader fragment est un bon choix. Soyez toujours attentif à ce que vous ajoutez aux shaders fragment, et faites votre possible pour simplifier ces opérations ou déplacez-les vers le shader vertex.

Unity-shader-optimization-vertex-and-fragment-shaders

Le même modèle avec un shader vertex et fragment, à partir d'exemples de shaders vertex et fragment.

Spécifiquement dans Unity, tenez compte de l'élément #pragma ou de toute autre utilisation de la fonctionnalité intégrée de Unity dans le code de votre shader. Vous pensez peut-être que votre shader reste léger lors des actions telles que la modification alpha, mais si ce même shader définit « #pragma surface surf BlinnPhong », alors des douzaines de calculs sont injectées dans votre shader pour calculer l'éclairage Blinn-Phong. Vous pouvez vérifier le code que ces éléments d'éclairage ajoutent dans le fichier lighting.cginc de votre répertoire d'installation Unity. Pour plus d'informations, consultez les documents Modèles d'éclairage personnalisé dans les shaders de surface.

Profilez vos shaders

Les Débogueur de frames vous permet de figer la lecture d'un jeu en cours d'exécution pour un frame particulier et de voir les requêtes individuelles utilisées pour le rendu de ce frame. En plus de lister les requêtes, le débogueur vous permet de les traiter une par une afin de voir en détails comment la scène est construite à partir de ses éléments graphiques.

Unity-shader-optimization-frame-debugger

Le débogueur de frame Unity

La version 2017.1 inclut également des informations sur le traitement par lots de la géométrie et vous fournit un retour précis sur la raison pour laquelle un maillage spécifique n'est pas traité par lots s'il est paramétré pour.

Il existe également d'excellents outils externes dédiés au débogage des shaders sur du matériel spécifique :

  1. Pour iOS et Mac OS : Xcode est doté d'un profiler intégré qui inclut des options telles que la capture de toute la mémoire utilisée par le GPU dans un frame spécifique ; camera.render, pour plonger au cœur du code et creuser pour un aperçu de la hiérarchie imbriquée des éléments appelés, et l'onglet FPS qui vous montre comment chaque shader affecte la durée de rendu totale.

    Unity-shader-optimization-xcode_profiler

    Profiler de frame Xcode.

  2. Sur PC et Mac, les outils RenderDoc et Intel GPA travaillent en profondeur et offrent la compatibilité matérielle la plus importante.

  3. Lorsque vous déboguez une cible matérielle spécifique pour des raisons liées aux performances ou à des sorties inadaptées, par exemple un chipset mobile comme ARM Mali, ou PS4, Xbox, Nintendo Switch, etc., utilisez TOUJOURS le débogueur de frame (parfois appelé profiler ou analyseur de frame) ou du fabricant. Leurs outils vous fourniront dans la plupart des cas les données les plus précises quant à ce chipset et comprendront des ensembles de données étendus par rapport aux outils plus génériques cités précédemment.

Sept optimisation de shader clés

Sur une base frame par frame, le code de votre shader travaille bien plus que le code de votre jeu. Essayez ces différentes optimisations pour conserver un ration performances/IPS transparent et efficace.

  1. Utilisez plus de calculs non-constants. Utilisez des constantes ou des éléments uniformes dynamiques (x=4/33, x=4xsin(24)).
  2. Multiplier les valeurs scalaires (float, int) avant les valeurs de vecteur (float3, float4).
  3. Évitez l'affichage d'instructions chaque fois que cela est possible,notamment pour les alphatests (surtout pour les contenus mobiles).
  4. Si possible, gardez vos calculs dans un shader vertex.
  5. Définissez un masque d'écriture pour une opération de vecteur lorsque cela est possible (si cela n'exploite pas tous les composants du résultat).
  6. Évitez la ramification à partir de valeurs dynamiques/non-uniformes (if-else, boucles).
  7. Vérifiez l'impact de vos opérations (discard(), floor(), etc.) sur votre modèle de rendu (OpenGL 2, OpenGL 3, OpenGL ES, etc.) et le matériel.
Plus de ressources

Documents et tutoriels sur les shaders :

Dites-nous si vous avez aimé ce contenu !

Oui, continuez comme ça Ça pourrait être mieux
Compris

Ce site utilise des cookies dans le but de vous offrir la meilleure expérience possible. Consultez la page de politique des cookies pour en savoir plus.