Aller au contenu principal

La boucle de jeu

Dans une application de bureau classique, le programme démarre à la première ligne et s'arrête à la dernière. Un jeu vidéo fonctionne différemment : c'est une boucle de simulation infinie tournant soixante fois par seconde, dessinant des images, actualisant la physique et surveillant les entrées du joueur. Comprendre cette cadence est essentiel pour concevoir des mods fluides sans le moindre à-coup.

Le rythme des soixante images par seconde

À 60 images par seconde, le moteur ne dispose que de 16,6 millisecondes pour boucler un tour complet :

  1. Lire les entrées : Clavier, souris et manettes.
  2. Mettre à jour les scripts : Exécuter toutes les fibres actives, y compris le Tick de ton mod.
  3. Mettre à jour la physique : Calculer les animations ragdoll, les suspensions des véhicules, les trajectoires de balles et les collisions.
  4. Calculer le rendu : Dessiner la géométrie, la lumière, les ombres et l'interface sur ton moniteur.

Si ton script prend 20 millisecondes pour fouiller une liste géante ou effectuer un calcul lourd, l'image saute. Répète cela à chaque passage, et le jeu s'effondre de 60 à 30 FPS avec des micro-gels constants.

Comment ScriptHookVDotNet exécute ton script

SHVDN ne lance pas ton script sur un thread en arrière-plan au hasard. Il l'exécute dans une fibre dédiée durant l'étape 2 (mise à jour des scripts).

Quand ton gestionnaire OnTick se lance, le moteur du jeu est littéralement suspendu, attendant que tu aies fini ton travail pour reprendre la main. Dès que l'accolade fermante de ta méthode est atteinte, SHVDN rend le contrôle au moteur. Le jeu calcule la physique, dessine l'écran, et revient à ton script au tour suivant.

private void OnTick(object sender, EventArgs e)
{
// Effectuer une passe rapide et sortir immédiatement
Ped player = Game.Player.Character;
if (player == null || !player.Exists())
{
return;
}

// Vérification légère
if (player.IsInVehicle())
{
// Une action ponctuelle
}
}

La règle d'or : ne jamais endormir le thread

En développement .NET classique, si tu veux attendre trois secondes, tu pourrais être tenté d'appeler System.Threading.Thread.Sleep(3000). Dans un script GTA V, cela bloque la fibre principale. Le jeu entier se fige pendant trois secondes : le son coupe, l'image gèle, et Windows propose de forcer la fermeture du programme.

Si tu as besoin d'un délai, mesure le temps écoulé avec Game.GameTime :

private int _prochaineVerification;

private void OnTick(object sender, EventArgs e)
{
if (Game.GameTime < _prochaineVerification)
{
return; // Pas encore l'heure, laisser tourner le moteur
}

_prochaineVerification = Game.GameTime + 3000;
// Exécuter l'action toutes les 3 secondes sans bloquer une seule image
}

Dans la leçon suivante, nous étudions les coordonnées : comment Los Santos se repère dans l'espace 3D.