Aller au contenu
Rechercher dans
  • Plus d’options…
Rechercher les résultats qui contiennent…
Rechercher les résultats dans…
Kanda Sorata

intermédiaire [Tutoriel] Optimiser ses ressources FiveM

Messages recommandés

Kanda Sorata

Optimiser ses ressources FiveM

 

 

Une mise a jour de FiveM a ajouté un moyen de détecter les pertes de performances des scripts grâce à un encadré qui s'affiche pour tous les joueurs sur le serveur, et qui précise la ressource et le nombre de FPS perdus à cause de la mauvaise performance du script. Ce guide est destiné aux personnes courageuses, notamment les développeurs, mais aussi les administrateurs des serveur afin d'apprendre à optimiser ses ressources.

Théorie!

perf

Avant de corriger les problèmes de performances, il serait utile de savoir quoi, quand et comment la pop-up apparaît. Pour les personnes qui n'auraient pas encore aperçu cette pop-up :

Le message est détaillé en 3 parties critique qui vous seront nécessaire afin de découvrir les problèmes que vous avez.

Le message est formaté de cette façon :

[resource] is taking [time] ms (or -[fps] FPS @ 60 Hz)

[resource] est le nom de votre ressource qui provoque ce problème de performance, il correspond au nom de votre ressource dans le dossier resource/ de votre serveur.

[time] est le temps (en milisecondes) que prends votre ressource entière à s’exécuter. Il est important de noter que c'est une moyenne du temps d’exécution sur 64 ticks. La moyenne est calculée en permanence et si celle-ci dépasse 5ms, le message s'affiche.

[fps] est le nombre total de fps qui perdu en utilisant la ressource. Ce nombre est défini sur une base de 64 FPS.

Améliorer la performance

La fréquence

L'un des plus évident, mais pourtant toujours autant de script le font, est la fréquence à la quelle le code est exécuter. Il y a souvent dans les scripts ceci Citizen.Wait(0), ça signifie que le code à l'intérieur s'exécute à chaque tick, ce qui est problématique en terme de performances. Ceci est la première raison pour laquelle la pop-up apparaît. Voici donc quelques règles bêtes :

  • N'exécutez que du code qui a besoin d'être exécuter chaque frame, par exemple les natives qui contiennent "ThisFrame" dans leur nom.(Il y a bien évidemment d'autre natives sans le nom qui ont besoin d'être exécuter chaque frame).
  • Réfléchissez à un interval d'exécution raisonnable pour votre code, par exemple vous n'avez pas besoin de vérifier 60 fois par seconde si un joueur est mort, préférez plutôt à vérifier une à deux fois par seconde pour ce genre de choses.
  • Séparez les morceaux de code qui n'ont pas besoin d'être exécuter à chaque frame, vous pouvez à la place utiliser une variable globale pour influencer le code qui est exécuter à chaque frame sans exécuter du code gourmand.

Example:

Code initial -> S’exécute en 119ms

Citizen.CreateThread(function()
    while(true) do
        if IsPedDeadOrDying(PlayerPedId()) then
            ShowHudComponentThisFrame(9) -- street name
        end

        if IsPedInAnyVehicle(PlayerPedId(), true) then
            ShowHudComponentThisFrame(6) --vehicle name
        end
      Citizen.Wait(0)
    end
end)

Code amélioré -> S'exécute en 7ms

local isDead = false
local inVehicle = false

Citizen.CreateThread(function()
    while(true) do
        if isDead then
            ShowHudComponentThisFrame(9) -- street name
        end

        if inVehicle then
            ShowHudComponentThisFrame(6) --vehicle name
        end
        
        Citizen.Wait(0)
    end
end)

Citizen.CreateThread(function()
    while(true) do
        isDead = IsPedDeadOrDying(PlayerPedId())
        inVehicle = IsPedInAnyVehicle(PlayerPedId(), true)
        Citizen.Wait(500)
    end
end)
les exemples sont multipliés par 100 par rapport à la normal

Les natives

Les natives sont la base de tout script, mais n'oubliez pas que les natives sont plus gourmandes que le pure code en LUA, surtout lorsque vous avez beaucoup de natives à exécuter, cela va augmenter le temps d'exécution des natives, et augmenter le temps de chaque frame. Donc voici quelques règles à nouveau :

  • Réfléchissez avant d'ajouter de multiples natives dans du code déjà gourmand, car cela va ralentir votre code, utilisez des alternatives si possible.
  • Pensez bien à mettre en cache votre native si vous comptez l'utiliser plusieurs fois dans un code assez gourmand.

 

Example

Code initial -> S'exécute en 346ms

Citizen.CreateThread(function()
  while true do
    local armor = GetPedArmour(PlayerPedId())

    armor = armor + 1
    if armor > 100 then
    armor = 0
    end

    SetPedArmour(PlayerPedId(), armor)

    Citizen.Wait(0)
  end
end)

Une meilleur solution -> S'exécute en 255ms

Citizen.CreateThread(function()
  local armor = GetPedArmour(PlayerPedId())

  while true do

    armor = armor + 1
    if armor > 100 then
        armor = 0
    end
  
    SetPedArmour(PlayerPedId(), armor)
    Citizen.Wait(0)
  end
end)

Une bien meilleure solution-> S'exécute en 216 ms

Citizen.CreateThread(function()
  local player = PlayerPedId()
  local armor = GetPedArmour(player)

  while true do
    armor = armor + 1
    if armor > 100 then
    armor = 0
    end

    SetPedArmour(player, armor)

    Citizen.Wait(0)
  end
end)
les exemples sont multipliés par 50 par rapport à la normal

 

Mais la question ici est : Voulons nous vraiment mettre l'armure au personnage à chaque tick ? Un plus grand délais serait largement suffisant. Essayez de garder ça dans le coin de votre tête!

Gardez tout ça bien au chaud, c'est une bonne leçon de programmation, et cela vous permet pour sûr de gagner en performances sur votre serveur. C'est du bon sens, mais il y a toujours des ressources qui semblent avoir des problèmes avec ça.

Example

local pedindex = {}

function SetWeaponDrops()
    local handle, ped = FindFirstPed()
    local finished = false
    repeat 
        if not IsEntityDead(ped) then
                pedindex[ped] = {}
        end
        finished, ped = FindNextPed(handle)
    until not finished
    EndFindPed(handle)

    for peds,_ in pairs(pedindex) do
        if peds ~= nil then
            SetPedDropsWeaponsWhenDead(peds, false) 
        end
    end
end

Citizen.CreateThread(function()
    while true do
        Citizen.Wait(0)
        SetWeaponDrops()
    end
end)

Un meilleur moyen de réaliser ce code:

function SetWeaponDrops()
    local handle, ped = FindFirstPed()
    local finished = false 

    repeat 
        if not IsEntityDead(ped) then
            SetPedDropsWeaponsWhenDead(ped, false) 
        end
        finished, ped = FindNextPed(handle)
    until not finished

    EndFindPed(handle)
end

Citizen.CreateThread(function()
    while true do
        SetWeaponDrops()
        Citizen.Wait(500)
    end
end)

Conclusion

Evidemment, ce guide va vous donner quelques astuces et réponses à pourquoi vos ressources ont des problèmes de performances. N'hésitez pas à faire part de vos ressentis, et si vous avez toujours des problèmes de performances, n'hésitez pas à demander de l'aide dans la section appropriée.

Bon courage à vous !

Lien original du tutoriel

 

Partager ce message


Lien à poster
Partager sur d’autres sites
Anthony

Très bon tutoriel merci ! :)

Partager ce message


Lien à poster
Partager sur d’autres sites
Emilio

J'aimerais bien dire bon tuto... mais je comprend rien... depuis que mon developpeur m'a laché pour rien, juste parce que c'était un profiteur, je n'ai plus aucun dev... donc je doit tout faire seul... et l'optimisation est dans mes besoins urgent sauf que j'arrive pas a comprendre comment faire, ou trouver les boucles... enfin toute ces choses... vous pourriez m'aider... svp :(

Partager ce message


Lien à poster
Partager sur d’autres sites
Lorenzo gotti

Bonjour les natives qui sont cité si dessus elle vienne de quel script svp et pour opti ses mieux que je vérifie script par script voir si ses possible et si à besoin d'être opti 

Partager ce message


Lien à poster
Partager sur d’autres sites
Kanda Sorata

Bonjour, elles ne viennent d'aucun script, les natives sont propre à GTA, donc à FiveM et peuvent être utilisées dans n'importe quel script sans dépendance (en fonction de si la native est utilisable côté serveur et/ou client), et oui, le mieux c'est de vérifier script par script pour être sur de ne rien loupé 😉

Partager ce message


Lien à poster
Partager sur d’autres sites
Lorenzo gotti

Merci de info bien j'ai plus que à me coller à sa je vais faire une back up juste pour être sûr que si je me loupe tout ne soit pas cassez merci de la rapidité et l'efficacité de votre aide.

Partager ce message


Lien à poster
Partager sur d’autres sites
𝒟ℋ𝒵

Bonsoir j'ai un problème enfin une question, je dois optimiser mes script si je passe sous onesync et si oui comment faire car honnetement je comprend rien au tuto au dessus merci d'avance :/

Partager ce message


Lien à poster
Partager sur d’autres sites

Créer un compte ou se connecter pour commenter

Vous devez être membre afin de pouvoir déposer un commentaire

Créer un compte

Créez un compte sur notre communauté. C’est facile !

Créer un nouveau compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant

×
×
  • Créer...

Information importante

En utilisant ce site, vous acceptez les présents règlements Conditions d’utilisation, Politique de confidentialité,Règles.