This translation is community contributed and may not be up to date. We only maintain the English version of the documentation. Read this manual in English
Defold comprend des outils de profilage intégrés au moteur et à la chaîne de build. Ils aident à détecter les problèmes de performances, de mémoire et d’utilisation des ressources. Plusieurs outils peuvent exploiter les données de profilage recueillies à l’exécution :
Le paramètre Profiler de l’App Manifest détermine si le code du profileur est lié au build. Debug Only est la valeur par défaut, None l’exclut et Always l’inclut dans les builds de débogage comme dans ceux de publication. Les paramètres profiler de game.project contrôlent le comportement à l’exécution, mais ne réintègrent pas dans un build le code du profileur qui en a été exclu. En particulier, Track CPU contrôle l’échantillonnage de l’utilisation du CPU ; ce paramètre est indépendant du choix effectué dans l’App Manifest.
Les builds qui incluent la prise en charge du profileur disposent d’un profileur visuel qui affiche des informations en temps réel, en surimpression sur l’application en cours d’exécution :
function on_reload(self)
-- Toggle the visual profiler on hot reload.
profiler.enable_ui(true)
end

Le profileur visuel fournit plusieurs fonctions permettant de modifier la manière dont il présente ses données :
profiler.set_ui_mode()
profiler.set_ui_view_mode()
profiler.view_recorded_frame()
Consultez la référence de l’API du profileur pour en savoir plus sur les fonctions du profileur.
Lorsqu’un build de bureau ou mobile incluant la prise en charge du profileur est en cours d’exécution, vous pouvez accéder aux profileurs interactifs d’images et de ressources dans un navigateur.
Le profileur d’images vous permet d’échantillonner votre jeu en cours d’exécution et d’analyser chaque image en détail. Pour accéder au profileur :
Le profileur d’images est divisé en plusieurs sections qui offrent chacune une vue différente du jeu en cours d’exécution. Appuyez sur le bouton Pause dans le coin supérieur droit pour interrompre temporairement la mise à jour des vues du profileur.

Lorsque vous utilisez plusieurs cibles simultanément, vous pouvez passer manuellement de l’une à l’autre en modifiant le champ Connection Address en haut de la page pour qu’il corresponde à l’URL du profileur Remotery affichée dans la console au démarrage de la cible :
INFO:ENGINE: Defold Engine 1.3.4 (80b1b73)
INFO:DLIB: Initialized Remotery (ws://127.0.0.1:17815/rmt)
INFO:ENGINE: Loading data from: build/default



La valeur LuaMem correspond à la quantité de mémoire, en kilo-octets, utilisée par la machine virtuelle Lua, telle qu’elle est indiquée par le ramasse-miettes de Lua. Memory correspond à la quantité de mémoire, en kilo-octets, utilisée par le moteur.
Le paramètre Max Sample Count limite le nombre d’échantillons de profilage enregistrés par thread et par image. Si le profileur signale que la limite a été dépassée, vérifiez d’abord si le code de profilage des extensions natives comporte une paire de début/fin de zone de mesure dont l’un des éléments manque. N’augmentez la limite que si une image contient légitimement plus de zones de mesure que la limite configurée.
Le profileur de ressources vous permet d’inspecter votre jeu en cours d’exécution et d’analyser en détail l’utilisation des ressources. Pour accéder au profileur :
http://<address>:<port>/. Utilisez l’adresse et le port indiqués dans la console par le moteur en cours d’exécution.Le profileur de ressources est divisé en deux sections : l’une affiche une vue hiérarchique des collections, des objets de jeu (game objects) et des composants actuellement instanciés dans votre jeu, et l’autre affiche toutes les ressources actuellement chargées.

Vous pouvez aussi inspecter le temps de chargement de chaque ressource. Activez Resource → Profile dans game.project avant de lancer le jeu. Dans la vue texte, ce paramètre est :
[resource]
profile = 1
Le paramètre est désactivé par défaut. Redémarrez le jeu après l’avoir activé pour mesurer les chargements de démarrage. Chaque chargement terminé ou échoué écrit une entrée de journal de niveau INFO avec le chemin de la ressource, la durée totale et les durées des étapes de préchargement, lecture, création, post-création, mise en file d’attente et attente. Les accès au cache ne produisent pas de nouveaux enregistrements de chargement.
Dans le profileur de ressources, cliquez sur Capture, puis sur Show load times pour afficher les colonnes de durée. Capture rafraîchit la vue des mesures conservées ; cela n’active pas le profilage et ne mesure pas rétroactivement les chargements précédents.
| Colonne | Signification |
|---|---|
| Load (ms) | Durée totale écoulée pour le chargement initial, y compris les dépendances, le travail après création, la mise en file d’attente et l’attente. |
| Preload (ms) | Temps passé à préparer la ressource dans son callback de préchargement. |
| Read (ms) | Temps passé à lire les données de la ressource. |
| Create (ms) | Temps passé à créer la ressource d’exécution dans son callback de création. |
Afficher les durées de chargement trie la table par durée totale, les ressources les plus lentes en premier. Cliquez sur l’en-tête d’une colonne de durée pour trier selon cette étape ; cliquez à nouveau pour inverser l’ordre. Les barres de la colonne Load montrent chaque total par rapport à la ressource visible la plus lente. Cliquez sur Hide load times pour masquer à nouveau les colonnes.
Les durées de chargement et de callback incluent les travaux des dépendances imbriquées. N’additionnez pas les totaux des ressources pour calculer le temps de démarrage, car un même travail peut apparaître dans les mesures de plusieurs ressources. Les colonnes Preload, Read et Create ne couvrent pas non plus toute la durée totale ; le journal fournit les étapes supplémentaires.
Un tiret cadratin (—) signifie qu’aucune mesure terminée n’est disponible, par exemple parce que le profilage était désactivé ou que le chargement initial n’est pas terminé. Une valeur nulle mesurée est affichée comme 0.000. Les mesures décrivent le chargement initial : les accès au cache et les rechargements à chaud ne les modifient pas, et décharger une ressource supprime sa mesure conservée.
Le service HTTP du moteur peut capturer les commandes GPU Metal dans un document .gputrace sur macOS. Ouvrez la trace terminée dans Xcode pour inspecter les images capturées. Cette fonctionnalité est intégrée au moteur de débogage.
Créez un bundle Debug macOS incluant le backend graphique Metal natif. Si vous utilisez un manifeste d’application, sélectionnez une option Graphics (macOS) qui inclut Metal ; consultez Backends graphiques.
Lancez l’exécutable du bundle depuis un terminal avec METAL_CAPTURE_ENABLED=1 et sélectionnez l’adaptateur Metal. Remplacez le chemin du bundle et le nom de l’exécutable dans cet exemple :
METAL_CAPTURE_ENABLED=1 \
"/absolute/path/MyGame.app/Contents/MacOS/MyGame" --graphics-adapter=metal
La variable d’environnement doit être définie au démarrage du moteur. La définir uniquement dans le terminal utilisé pour les requêtes HTTP n’active pas la capture dans un moteur déjà en cours d’exécution.
Dans un second terminal, utilisez le port du service du moteur affiché dans le journal. Les exemples suivants utilisent curl et jq :
ENGINE_URL="http://127.0.0.1:<port>"
curl -fsS "$ENGINE_URL/openapi.json" | jq '.paths["/profiler/gputrace"]'
curl -sS -i "$ENGINE_URL/profiler/gputrace"
La route n’est enregistrée que sur macOS. Une entrée null dans le document OpenAPI signifie que ce moteur ne l’expose pas. Même si la route est présente, la prise en charge de la capture dépend de l’adaptateur graphique et de l’environnement de lancement. GET /profiler/gputrace renvoie HTTP 501 avec error.code: "gputrace_unsupported" lorsque la capture Metal est indisponible. Vérifiez que le moteur utilise Metal et qu’il a été lancé avec METAL_CAPTURE_ENABLED=1 avant de continuer. Une demande prise en charge renvoie HTTP 200 avec l’état de capture.
Choisissez un chemin de sortie absolu accessible en écriture et se terminant par .gputrace, avec un répertoire parent existant et aucune trace déjà présente à cet emplacement. Le chemin se trouve sur l’ordinateur qui exécute le moteur. Pour un moteur local, cet exemple crée un nouveau répertoire temporaire et demande une image :
GPU_TRACE_DIR=$(mktemp -d /tmp/defold-gputrace.XXXXXX)
GPU_TRACE_PATH="$GPU_TRACE_DIR/frame.gputrace"
GPU_TRACE_REQUEST=$(jq -n --arg path "$GPU_TRACE_PATH" '{path: $path, frames: 1}')
curl -fsS -X POST \
-H 'Content-Type: application/json' \
--data "$GPU_TRACE_REQUEST" \
"$ENGINE_URL/profiler/gputrace" | jq
frames est facultatif, vaut 1 par défaut et accepte les entiers de 1 à 10000. La capture commence avant l’image rendue suivante et s’arrête après la soumission du nombre demandé d’images complètes. Laissez le jeu effectuer son rendu pendant l’attente. Une seule capture peut être en attente ou active ; une autre demande de démarrage renvoie HTTP 409 avec error.code: "gputrace_active".
POST renvoie HTTP 200 avec ok: true et data.state: "pending" lorsque la capture est planifiée. La fin de la capture est signalée par les requêtes d’état suivantes. Répétez la requête d’état jusqu’à ce que data.state devienne complete, canceled ou failed :
curl -fsS "$ENGINE_URL/profiler/gputrace" | jq
data.state |
Signification |
|---|---|
idle |
Aucune capture n’a été planifiée. |
pending |
La capture attend le début du rendu. |
capturing |
La capture est active ; data.frames_captured indique les images terminées. |
complete |
La capture est terminée et la trace peut être ouverte. |
canceled |
Une capture en attente a été annulée avant son démarrage. |
failed |
La capture n’a pas pu démarrer ; consultez data.error pour l’erreur native. |
GET décrit la capture courante ou la plus récente. Vérifiez que data.path correspond au chemin demandé. Une capture échouée renvoie toujours HTTP 200 avec ok: true ; inspectez data.state et data.error pour déterminer le résultat. Pour un client automatisé, interrogez périodiquement l’état avec un délai entre les requêtes et un délai d’expiration.
Une fois l’état complete, ouvrez la trace dans Xcode sur le Mac du moteur :
open -a Xcode "$GPU_TRACE_PATH"
Le point de terminaison HTTP renvoie l’état ; la trace est enregistrée à data.path sur l’hôte du moteur. Pour un moteur distant, récupérez le document terminé depuis cet hôte avant de l’ouvrir localement.
Pour annuler une capture en attente ou terminer plus tôt une capture active :
curl -fsS -X DELETE "$ENGINE_URL/profiler/gputrace" | jq
Une capture en attente passe à canceled. Pour une capture active, data.stop_requested devient true, et la capture se termine après la soumission de l’image actuellement rendue. Continuez à interroger GET jusqu’à un état terminal. DELETE conserve toute trace déjà écrite sur le disque. Si aucune capture n’est en attente ou active, la réponse est HTTP 409 avec error.code: "gputrace_inactive".
HTML5 utilise l’API Web Performance à la place de Remotery pour sa chronologie dans le navigateur. Pour enregistrer les zones de mesure de Defold :
profiler.performance_timeline_enabled) dans game.project.Cette chronologie du navigateur est distincte à la fois du profileur visuel intégré au jeu et du profileur web interactif Remotery.
Lors de la création du bundle de votre jeu, une option vous permet de créer un rapport de build. Ce rapport est très utile pour connaître la taille de toutes les ressources qui font partie du bundle de votre jeu. Il suffit de cocher la case Generate build report lors de la création du bundle du jeu.

L’outil de build produit un fichier nommé report.html à côté du bundle du jeu. Ouvrez ce fichier dans un navigateur web pour examiner le rapport :

La section Overview fournit une vue d’ensemble de la répartition de la taille du projet par type de ressource.
Resources affiche une liste détaillée de ressources que vous pouvez trier par taille, taux de compression, chiffrement, type et nom de répertoire. Utilisez le champ « search » pour filtrer les entrées de ressources affichées.
La section Structure affiche les tailles en fonction de l’organisation des ressources dans l’arborescence des fichiers du projet. Les entrées sont colorées du vert (léger) au bleu (lourd) selon la taille relative du fichier et du contenu du répertoire.
En plus des outils intégrés, il existe un large choix d’outils de traçage et de profilage gratuits et de qualité. En voici une sélection :
Notez que les profileurs écrits uniquement en Lua ajoutent un surcoût assez important à chaque hook qu’ils installent. Pour cette raison, il convient d’interpréter avec prudence les mesures de temps obtenues avec un tel outil. Les mesures fondées sur le comptage sont toutefois suffisamment précises.

Cet outil vous permet d’inspecter une application Defold en cours d’exécution et de voir comment elle utilise OpenGL. Vous pouvez tracer les appels de fonctions OpenGL, définir des points d’arrêt sur les fonctions OpenGL, examiner les ressources de l’application (textures, programmes, shaders, etc.), consulter le contenu des tampons et vérifier d’autres aspects de l’état d’OpenGL.

Cet ensemble d’outils de profilage capture en temps réel les données d’utilisation du CPU, de la mémoire et du réseau de votre jeu. Vous pouvez tracer les méthodes par échantillonnage pendant l’exécution du code, capturer des vidages du tas, afficher les allocations de mémoire et inspecter les détails des fichiers transmis sur le réseau. Pour utiliser cet outil, vous devez définir android:debuggable="true" dans AndroidManifest.xml.

Remarque : depuis Android Studio 4.1, il est également possible d’exécuter les outils de profilage sans démarrer Android Studio.
Cet ensemble d’outils vous permet d’inspecter, de modifier et de rejouer les appels d’une application à un pilote graphique. Pour l’utiliser, vous devez définir android:debuggable="true" dans AndroidManifest.xml.
