[En iyi uygulama] Kaynak performansınızı artırın

Bayram Mentes

Standart Üye
Katılım
2 Tem 2019
Mesajlar
40
Tepki puanı
40
Yaş
31

İtibar Puanı:

Son zamanlarda, FiveM'e eklenen ve yavaş kaynakların tüm oyuncular için bir uyarı olarak gösterileceği bir özellik var. Bu kılavuzda, uyarının görünmesini önlemek için gerçekleştirebileceğiniz bazı temel adımları ele alacağız. Kılavuz, esas olarak, kendilerini cesur hisseden geliştiricileri veya sunucu sahiplerini hedeflemektedir.
: Yum:

Kaynağınız yavaş çalışıyor mu ve bu kılavuzdaki her şeyi denediniz mi? Lütfen bu kılavuzu en iyi uygulamalarla daha da genişletmek ve komut dosyanızın sahip olabileceği sorunları tespit etmek için buraya bir yazı gönderin. Diğer öneriler çok takdir edilmektedir!
Arka fon!
perf

Performans sorunlarını çözmeden önce, uyarı iletisini görmemiş olan kişiler için yavaş kaynak uyarısının ne, ne zaman ve nasıl ortaya çıktığını bilmek çok yararlı olacaktır:
Mesaj, yaşadığınız tüm sorunları ayıklamak için kesinlikle ihtiyaç duyacağınız 3 kritik veri noktasından oluşur. Mesaj şu şekilde formatlanır:
[resource] is taking [time] ms (or -[fps] FPS @ 60 Hz)

[resource] kaynağın yavaş olduğu kaynak adıdır, doğrudan resource/sunucunuzdaki klasör adı ile ilişkilendirilir .
[time] , kaynağın tamamını yürütmek için geçen milisaniye cinsinden süredir. Önemli Bu bir olduğuna dikkat etmek sürekli şudur, ölçüm değil tek seferlik bir şey (yani yükleme olarak). Saat ortalama 64 tiktir, eğer 64 örneğin ortalaması 5 ms'den büyükse, uyarı mesajı gösterilecektir.
[fps] , bu kaynak çalıştırılarak düşülmekte olan toplam FPS miktarıdır. Bunun 60 FPS bazında olduğunu unutmayın.
Performansı arttırmak
Sıklık
En açık ama yine de birçok komut dosyası bunu yapar, kodun çalıştırıldığı sıklıktır. Genellikle senaryoyu kullanırken görüyorum Citizen.Wait(0), bu döngü içindeki tüm kodları çalıştırırken içerisindeki herhangi bir kod anlamına gelir , bu durumda eğer orada pahalı bir mantık olursa performans için kötüdür. Bana göre bu, 1 nolu uyarı mesajının neden ortaya çıkmasına neden oluyor. Yani burada başparmak kuralı:
  • Yalnızca her onay işaretini çalıştırmanız gereken kodu çalıştırın, örneğin adlarında “ThisFrame” içeren herhangi bir yerel. (Her kene kaçması gereken obiviously daha fazla yerliler vardır).
  • Yürütülecek bir kod parçası için makul bir aralık düşünün, örneğin bir oyuncunun öldüğünü kontrol etmek için saniyede 60 kez kontrol etmeniz gerekmez, bunun yerine saniyede 1 veya 2 defa kullanmayı düşünün.
  • Her karede çalıştırılması gerekmeyen kodları ayırın. Örneğin, her onay işaretinin çalıştırdığı kodu etkilemek için (pahalı kodu çalıştırmadan) global bir değişken (ler) kullanabilirsiniz.
Örnek:
Intial code -> 119ms'de çalışır
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)

Geliştirilmiş kod -> 7ms'de çalışır
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)

örnekler normalden 100.000x daha hızlı çalışılıyor
yerliler
Yerliler herhangi bir komut dosyasının özüdür, ancak yerlilerin aramak için saf LUA kodundan daha pahalı olduğunu unutmayın . Özellikle, çok sayıda yerlinin çalıştırılacağı sıcak bir yolunuz olduğunda, bu yerlilerin yürütme zamanını artıracak ve çerçeve zamanını bir miktar artıracak. Öyleyse işte kurallar:
  • (Çok) yerlisini bazı kodlara koymayı denemeden önce iki kez düşünün, çünkü bunlar yavaş olacaktır
    : Maskot:
    , mümkünse alternatifleri kullanın.
  • Bir sıcak kod yolunda geçici olmasını istemek yerine, yerel bir sonucun önbelleğini alın. Bir şeyi önbelleğe almanızın yaygın bir göstergesi, aynı yerelde aynı yerelde iki veya daha fazla kez kullandığınızda ortaya çıkar.
Örnek
Intial code -> 346ms'de çalışır
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)

Biraz daha iyi bir çözüm -> 255ms'de çalışır
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)

Daha da iyi bir çözüm -> 216 msn'de çalışır
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)

örnekler normalden 50.000x daha hızlı çalışılıyor
Ancak buradaki soru; Gerçekten her tike zırh koymak ister miyiz ? Daha uzun bir gecikme yeterli olabilir!
Bunu aklının arkasında tutmaya çalış!
KURU
KURU kal! Başka bir deyişle, kendini tekrar etme. Bu sadece iyi bir programlama uygulaması değil, aynı zamanda performans kazanmak için de kullanışlı. Bunun oldukça sağduyulu olduğundan şüpheleniyorum, ancak hala bununla ilgili sorunları varmış gibi görünen kaynaklar var.
: Disappointed_relieved:

DRY'nin tutulması performans için de geçerlidir, çünkü zaten hesapladığımız şeyi hesaplamak istemiyoruz, bunun yerine tekrar hesaplamak yerine önceki hesaplamanın sonucunu almak istiyoruz, basit şeyler!
: Slight_smile:

Örnek
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)

Bu konuda daha iyi bir yol olacaktır:
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)

Sonuç
Umarım bu kılavuz, kaynağınızın neden performans sorunları olduğu konusunda size bazı bilgiler verecektir. Yine de, eğer hala performans sorunları yaşıyorsanız, lütfen bana bildirin, minnettar olurum!
İyi şanslar!
 

Users Who Are Viewing This Konu (Users: 0, Guests: 1)