Passer au contenu principal
Version: bleeding-edge 🩸

Profiling

nanos world intègre des outils pour profiler en temps réel le serveur comme le client du jeu. Les outils de profilage sont indispensables pour optimiser de gros serveurs, repérer les goulots d'étranglement Lua, analyser les pics de frame, déboguer les problèmes réseau ou améliorer les performances globales.

Tracy Profiler​

Vue d'ensemble des frames dans Tracy

nanos world includes built-in integration with the Tracy Profiler, allowing you to profile both the server and the game client in real-time.

Tracy est un profileur temps réel à la nanoseconde près, très utilisé dans le développement de jeux et les applications hautes performances. Il propose une frise chronologique interactive pour voir exactement ce que fait votre application à chaque frame.

Contrairement aux profileurs classiques, Tracy permet d'analyser les performances en direct, pendant que le jeu ou le serveur tourne. Il affiche une chronologie détaillée de l'exécution de votre application, notamment :

  • Les appels Lua
  • Les callbacks d'événements
  • Les callbacks de Timer
  • Les systèmes internes
  • Le traitement réseau
  • Les temps de frame
  • L'activité des threads
  • La contention des verrous
  • Les temps de chargement

Vue détaillée de Tracy au survol

Télécharger Tracy​

First, download the Tracy Profiler application from the official releases page. It must be version 0.14, the same version built into nanos world, otherwise it refuses to connect:

Télécharger Tracy Profilerhttps://github.com/wolfpld/tracy/releases

Une fois téléchargée, lancez l'application Tracy.

Connecting with Tracy​

Tracy is built into every server and game client. It stays idle and records nothing until a profiler connects, and it only accepts connections from the same machine.

  1. Start the server or the game normally
  2. Open the Tracy Profiler application on the same machine
  3. Enter 127.0.0.1 as the address
  4. Cliquez sur Connect

Tracy begins capturing from the moment it connects, so anything that happened before (like the startup) is not in the capture.

tip

If the server and the game run on the same machine, the first one to start uses port 8086 and the second one 8087. Connect to 127.0.0.1:8087 to reach the second one.

Profiling a Remote Server​

As Tracy only accepts local connections, forward its port through SSH and connect to 127.0.0.1 on your own machine:

ssh -L 8086:127.0.0.1:8086 user@your-server

Profiling Your Scripts​

Every Lua callback already shows up in Tracy with the file and line it comes from. To see what happens inside a callback, use the profiling functions of the Debug class, which work on both server and client:

Server.Subscribe("Tick", function(delta_time)
-- Measures the function as a zone named "[my-package] NPC AI", also in the native profiling
Debug.ProfileZone("NPC AI", function()
UpdateNPCs(delta_time)
end)

-- Records a value in a graph
Debug.ProfilePlot("NPCs Alive", #npcs)
end)

-- Marks an event in the timeline
Debug.ProfileMessage("Round Started")

The zone always closes when the function returns, even when it errors. Its function takes no parameters and returns nothing, so use a closure to reach your values. They cost almost nothing while Tracy is not connected and the native profiling is off, so they can stay in your code. Use Debug.IsProfilerConnected() to skip computing values that only feed a graph.

attention

Use fixed names for zones and graphs. Each different name stays stored until the game or server closes, so a name built per entity (like "NPC " .. id) fills the list quickly, and new names are ignored after 256.

Profilage natif​

Nous avons aussi intégré une commande de profilage native qui permet de capturer des données de profilage sans Tracy. Elle affiche le temps d'exécution de certaines parties prédéfinies du code dans la console du serveur ou du client (ou dans l'interface de profilage du client).

Console du serveur affichant les informations de profilage

Profilage du serveur​

Pour activer le profilage du serveur, lancez simplement le serveur avec la commande --profiling ou définissez profiling = true dans le fichier Config.toml du serveur.

Des logs PROFIL s'afficheront dans la console du serveur, avec le temps d'exécution de différents systèmes et callbacks Lua.

Profilage du client​

Pour activer le profilage du client, activez-le dans les paramètres du jeu, onglet Debug :

Paramètres du jeu - onglet Debug

display frame times​

Une fois activée, cette option affiche une interface de débogage avec :

  • fps (images par seconde, avec entre parenthèses les fps affichés par la génération d'images DLSS)
  • frametime (temps de rendu de chaque frame, en millisecondes)
  • fps 1% low (fps moyens des 1 % de frames les plus lentes)
  • game (temps passé par le thread de jeu)
  • render (temps passé par le thread de rendu)
  • rhi (temps passé par le thread RHI)
  • gpu (temps passé par le GPU)

Interface de débogage des temps de frame

display profiling to screen​

Une fois activée, cette option affiche l'interface de profilage avec toutes les opérations et leurs temps d'exécution directement à l'écran, pour suivre les performances en temps réel sans passer par la console :

Interface de débogage du profilage

output profiling to console​

Une fois activée, cette option affiche les informations de profilage dans la console du jeu, exactement comme côté serveur.

profiling entities & events network​

Une fois activée, cette option affiche à l'écran l'utilisation réseau de chaque entité, ainsi que celle des événements de script et des autres synchronisations :

Interface de débogage des statistiques réseau des entités