Les scripts FiveM peuvent être extrêmement gratifiants, mais lorsque des problèmes de performances surviennent, ils peuvent rapidement devenir un cauchemar. De nombreux développeurs se retrouvent bloqués par le message "slow resource warning" (avertissement de ressources lentes) et il s'agit d'un piège bien trop courant qui peut enliser votre serveur. Nous allons donc vous expliquer comment l'éviter et optimiser vos scripts pour une expérience de jeu plus fluide.
Découvrez notre nouvel outil d'IA pour optimiser les scripts
Optimisez rapidement vos scripts grâce à notre nouvel outil FiveM AI Tool :
Avant de plonger dans le processus d'optimisation, il est essentiel de comprendre ce que le message d'avertissement nous dit réellement. Il fournit trois points de données critiques, présentés comme suit :
[ressource] prend [temps] ms (ou -[fps] FPS @ 60 Hz)
[ressource]
Le nom de la ressource qui fonctionne lentement est directement lié au nom du dossier dans le répertoire resource/ de votre serveur.[heure]
: le temps en millisecondes qu'il a fallu pour exécuter l'ensemble de la ressource. Ce temps est une mesure continue, dont la moyenne est calculée sur 64 ticks. Si le temps moyen des 64 échantillons dépasse 5 ms, le message d'avertissement apparaît.[fps]
: le nombre total d'images par seconde (FPS) déduites par l'exécution de cette ressource. Ce montant est calculé sur une base de 60 images par seconde.
Optimisation de la fréquence
Un problème courant réside dans la fréquence d'exécution du code. Une exécution trop fréquente du code peut entraîner des problèmes de performance. Voici quelques règles générales :
- N'exécutez le code que lorsqu'il doit être exécuté à chaque tic-tac. Certains natifs contenant "ThisFrame" dans leur nom en sont des exemples typiques.
- Fixez un intervalle raisonnable pour l'exécution du code. Toutes les fonctions n'ont pas besoin de vérifier les conditions 60 fois par seconde. Envisagez des intervalles plus longs pour les vérifications moins critiques.
- Séparer tout code qui n'a pas besoin d'être exécuté à chaque image. Utilisez des variables globales pour influencer le code qui s'exécute à chaque tic-tac sans exécuter de code coûteux.
Prenons l'exemple suivant : le code initial s'exécute en 119 ms et la version optimisée en 7 ms :
Code initial 119ms:
Citizen.CreateThread(function()
while(true) do
if IsPedDeadOrDying(PlayerPedId()) then
ShowHudComponentThisFrame(9) -- nom de la rue
end
if IsPedInAnyVehicle(PlayerPedId(), true) then
ShowHudComponentThisFrame(6) -- nom du véhicule
fin
Citizen.Wait(0)
end
end)
Code optimisé 7ms:
local isDead = false
local inVehicle = false
Citizen.CreateThread(function()
while(true) do
if isDead then
ShowHudComponentThisFrame(9) -- nom de la rue
fin
if inVehicle then
ShowHudComponentThisFrame(6) -- nom du véhicule
fin
Citoyen.attend(0)
end
end)
Citizen.CreateThread(function()
while(true) do
isDead = IsPedDeadOrDying(PlayerPedId())
inVehicle = IsPedInAnyVehicle(PlayerPedId(), true)
Citizen.Wait(500)
end
end)
Optimiser l'utilisation des natifs
Les natifs sont au cœur de tout script, mais leur appel peut être coûteux. Le temps d'exécution peut augmenter de manière significative, en particulier dans le cas d'un chemin de code chaud comportant plusieurs natifs. Gardez ces règles à l'esprit :
- Limiter l'utilisation des natifs dans les chemins de code chauds et envisager des alternatives.
- Mettre en cache le résultat d'un natif au lieu de l'appeler plusieurs fois dans le même champ d'application.
Examinez les exemples suivants dans lesquels nous optimisons progressivement le code :
Code initial :
Citizen.CreateThread(function()
while true do
local armor = GetPedArmour(PlayerPedId())
armure = armure + 1
si armure > 100 alors
armure = 0
fin
SetPedArmour(PlayerPedId(), armor)
Citizen.Wait(0)
fin
end)
Code amélioré :
Citizen.CreateThread(function()
local armor = GetPedArmour(PlayerPedId())
while true do
armure = armure + 1
si armure > 100 alors
armure = 0
fin
SetPedArmour(PlayerPedId(), armor)
Citoyen.attend(0)
fin
end)
Code optimisé supplémentaire :
Citizen.CreateThread(function()
local player = PlayerPedId()
local armor = GetPedArmour(player)
while true do
armure = armure + 1
si armure > 100 alors
armure = 0
fin
SetPedArmour(joueur, armure)
Citoyen.attend(0)
fin
fin)
Cependant, demandez-vous si la valeur de l'armure doit vraiment être mise à jour à chaque tic-tac. Envisagez des intervalles plus longs pour ce type d'opérations.
Une meilleure façon de gérer les chutes d'armes
Les scripts qui gèrent les armes déposées par les PNJ posent souvent problème. S'ils sont mal gérés, ils peuvent entraîner une charge de travail inutile pour votre serveur. Considérez l'optimisation suivante :
Code initial :
local pedindex = {}
function SetWeaponDrops()
local handle, ped = FindFirstPed()
local finished = false
repeat
if not IsEntityDead(ped) then
pedindex[ped] = {}
end
finished, ped = FindNextPed(handle)
jusqu'à ce que la recherche ne soit pas terminée
EndFindPed(handle)
for peds,_ in pairs(pedindex) do
if peds ~= nil then
SetPedDropsWeaponsWhenDead(peds, false)
end
fin
fin
Citizen.CreateThread(function()
while true do
Citizen.Wait(0)
SetWeaponDrops()
fin
end)
Code optimisé :
fonction SetWeaponDrops()
local handle, ped = FindFirstPed()
local finished = false
repeat
if not IsEntityDead(ped) then
SetPedDropsWeaponsWhenDead(ped, false)
end
terminé, ped = FindNextPed(handle)
jusqu'à ce que ce ne soit pas terminé
EndFindPed(handle)
fin
Citizen.CreateThread(function()
while true do
SetWeaponDrops()
Citizen.Wait(500)
end
end)
Dans la version optimisée, la fonction SetWeaponDrops()
n'est appelé que toutes les 500 millisecondes au lieu de chaque tic-tac, ce qui améliore considérablement les performances.
FAQ
1. Q : Qu'est-ce que l'optimisation des scripts FiveM ?
R : L'optimisation des scripts de FiveM consiste à affiner vos scripts afin d'améliorer leur efficacité et leurs performances. Elle permet de s'assurer que vos ressources consomment moins d'énergie sur le serveur, ce qui peut conduire à un gameplay plus fluide et à la prise en charge d'un plus grand nombre de joueurs sans problèmes de performance significatifs.
2. Q : Pourquoi est-il important d'optimiser mes Scénarios FiveM?
R : L'optimisation de vos scripts FiveM est essentielle pour maintenir des performances élevées sur le serveur, réduire le décalage, prévenir les pannes de serveur et améliorer l'expérience de jeu dans son ensemble. Les scripts optimisés utilisent moins de ressources, ce qui est crucial lorsqu'on gère un serveur avec de nombreux joueurs actifs ou des scripts complexes.
3. Q : J'ai optimisé mes scripts, mais je rencontre toujours des problèmes de performance. Quelle est l'origine du problème ?
R : Il peut y avoir plusieurs raisons à cela. Il est possible que tous les scripts ne soient pas entièrement optimisés ou qu'il y ait des conflits entre différents scripts. Le matériel de votre serveur peut également être un facteur limitant. Veuillez me faire part de votre problème exact afin d'obtenir un diagnostic plus précis.
4. Q : Quelle est la fonction de Citizen.CreateThread
dans mon script ?
A : Citizen.CreateThread
est une fonction utilisée pour créer un nouveau fil continu dans un script. Cela signifie que tout code placé dans cette fonction s'exécutera dans une boucle infinie, ce qui est idéal pour exécuter de manière répétée des blocs de code spécifiques.
5. Q : Quel est le rôle de la Citoyen.attendez
fonction ?
A : Citoyen.attendez
est une fonction qui interrompt l'exécution du thread en cours pendant une durée déterminée. Cette fonction est utile pour gérer les performances du serveur en empêchant l'exécution immédiate d'opérations gourmandes en ressources.
6. Q : J'ai vu des scripts qui utilisent Citoyen.attend(0)
. Est-ce mauvais pour la performance ?
R : En utilisant Citoyen.attend(0)
signifie que le script se met en pause pendant la durée la plus courte possible, c'est-à-dire qu'il n'y a pas de pause réelle. Cela peut entraîner des problèmes de performance si le code à l'intérieur du thread est lourd ou complexe, car il est exécuté à chaque frame du serveur. Il est généralement préférable d'utiliser un temps d'attente plus élevé si possible.
7. Q : Pourquoi le premier exemple du tutoriel est-il moins efficace que le second ?
R : Le premier exemple itère deux fois de manière inefficace sur tous les peds - d'abord pour les stocker dans un tableau, puis pour appliquer la fonction SetPedDropsWeaponsWhenDead
fonction. Le deuxième exemple est plus efficace car il applique SetPedDropsWeaponsWhenDead
dès qu'une pédale est trouvée, ce qui élimine la nécessité de stocker les pédales et d'itérer sur elles deux fois.
8. Q : Que dois-je faire si je ne suis pas sûr de pouvoir optimiser mes scripts ?
R : Il est toujours préférable de demander l'aide d'un professionnel en cas de doute. Des scripts mal optimisés peuvent être à l'origine de nombreux problèmes, qu'il s'agisse de mauvaises performances du serveur ou de plantages. De nombreuses ressources sont disponibles en ligne, telles que des forums et des tutoriels, et de nombreux professionnels peuvent vous aider.
Conclusion
L'optimisation de vos scripts FiveM implique une bonne compréhension de votre code, la connaissance de sa fréquence d'exécution et une utilisation intelligente des ressources disponibles. Mettez en œuvre ces stratégies et vous constaterez certainement une amélioration considérable des performances de votre serveur.
N'oubliez pas qu'il s'agit d'un processus continu et qu'il se peut que vous ne réussissiez pas du premier coup. Si vous continuez à rencontrer des problèmes de performance, n'hésitez pas à demander de l'aide. Bonne optimisation !