Jump to content
Search In
  • More options...
Find results that contain...
Find results in...
Bienvenue Guest!

Rejoignez la communauté pour avoir accès à l'entièreté du site! Une fois que vous serez enregistré, vous pourrez créer, aider, partager et discuter avec les membres de la communauté et également participer à l'amélioration du site. Alors, qu'attendez vous ? Enregistrez-vous !

Sign in to follow this  
Kanda Sorata

intermédiaire [Tutoriel] Optimiser ses ressources FiveM

Recommended Posts

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

 

Share this post


Link to post
Share on other sites
Anthony

Très bon tutoriel merci ! :)

Share this post


Link to post
Share on other 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 :(

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×
×
  • Create New...

Important Information

En utilisant ce site, vous acceptez les présents règlements Terms of Use, Privacy Policy,Guidelines.