FiveM resmon yüksek ms: yavaş betikleri nasıl bulacağınız ve düzelteceksiniz

Bir kaynak resmon'da yüksek ms gösteriyor? resmon 1'i nasıl okuyacağınız, Wait(0) döngüleri neden bu kadar maliyetli ve uzakta olduğunuzda nasıl uyuyacağınız, ped'i önbelleğe almanız ve ox_lib noktaları ve bölgeleri kullanın.

Kaynak monitörünü açıyorsunuz ve bir betik bunu gösterir:

text
my_script        0.35 ms

Boş bir betik sıfıra yakın olmalıdır. Her çerçevede bir milisaniyenin üçte birini yiyen veya çok daha fazla olan betik oyununuzu kesinti yapar ve daha zayıf bilgisayarları olan oyuncular önce hisseder. Bu kılavuz sorunun hangi kaynağın olduğunu ve onu aşağı getiren değişiklikleri gösterir.

Kaynak monitörünü açın

Oyunun F8 konsolunda yazın:

text
resmon 1

Overlay her istemci kaynağını CPU zamanı (ms) çerçeve başına ve belleği gösterir. Kapatmak için resmon 0 yazın. Bunları kontrol edin:

  • Hareketsiz durun, sessiz bir yerde ve listeyi okuyun. Önemli olan sayılar hiçbir şey yapmadığınız zaman yüksek kalan sayılardır.
  • Kim en üstte olduğunu bakın. Yalnızca kendi işaretinin veya dükkanının yakınında yukarı giden kaynak normaldir. Her yerde yüksek olanı değil.
  • Birkaç saniye izleyin. Betik başladığında tek bir tepe zararsızdır; sabit bir değer sorundur.

ms, istemcide zamandır. Sunucu performansı ayrı bir konudur: bkz. server thread hitch warning.

Neden 1: Wait(0) ile döngü

Yüksek değer için en yaygın neden, her zaman her çerçevede çalışan bir döngüdür:

lua
CreateThread(function()
    while true do
        Wait(0)
        local ped = PlayerPedId()
        local coords = GetEntityCoords(ped)
        local dist = #(coords - vec3(215.0, -810.0, 30.7))
        if dist < 3.0 then
            DrawText3D(215.0, -810.0, 30.7, 'Press E')
        end
    end
end)

Bu yerleşik işlevleri saniyede 60 kez çalıştırır, oyuncu haritanın diğer tarafında olsa bile. Çoğu zaman cevap "yapacak bir şey yok" ve bu maliyet boşa harcanır.

Düzeltme 1: uzakta olduğunuzda uyuyun

Hiçbir şey yakında olmadığında döngüyü daha uzun uyutun ve yalnızca oyuncu yakınındayken her çerçevede çalıştırın:

lua
CreateThread(function()
    local target = vec3(215.0, -810.0, 30.7)
    while true do
        local sleep = 1000
        local coords = GetEntityCoords(PlayerPedId())
        local dist = #(coords - target)

        if dist < 10.0 then
            sleep = 0
            if dist < 3.0 then
                DrawText3D(target.x, target.y, target.z, 'Press E')
            end
        elseif dist < 50.0 then
            sleep = 250
        end

        Wait(sleep)
    end
end)

Döngü uzakta olduğunuzda saniyede bir kez kontrol eder, neredeyse hiçbir maliyeti olmaz ve sadece 10 metrelik alanda çizeceği yerde çerçeve başına çalışır. #(a - b)'i vec3 değerleri ile mesafe için kullanın: eski GetDistanceBetweenCoords yerleşik'den daha hızlıdır.

Düzeltme 2: yeniden kullandığınız değerleri önbelleğe alın

Nadiren değişen bir değeri almak için çerçeve başına yerleşik çağırmak israftır. PlayerPedId() klasik olanıdır. Bir kez saklayın ve yalnızca değişebilirse yenileyin:

lua
local ped = PlayerPedId()

CreateThread(function()
    while true do
        Wait(500)
        ped = PlayerPedId()
    end
end)

ox_lib kullanırsanız, bunu sizin için yapar. cache.ped güncel tutulur, cache.vehicle ve cache.serverId aynı şekilde çalışır:

lua
local coords = GetEntityCoords(cache.ped)

lib.onCache önbelleğe alınan bir değer değiştiğinde tepki vermenizi sağlar, bir döngüde kontrol etmeden.

Düzeltme 3: her çerçevede yerleşik çağırmayı durdurun

Döngünün gövdesini kontrol edin ve her satır için sorun sorun: bu gerçekten her çerçevede çalışması gerekiyor mu? Çıkmazın ne çalışmıyor.

  • Çizim (metin, işaretçiler, sprite) her çerçevede çalışmalı, ama sadece görünür olduğu sürece.
  • Veri okuma (iş, para, envanter) değil: bir etkinlikte okuyun ve değişkende tutun.
  • Arama (GetClosestVehicle, GetGamePool, tüm oyuncuların döngüsü) pahalıdır. Çerçeve başına her değil, saniyede bir veya iki çalıştırın.
  • Döngüde şey oluşturmayın: blip, metin girişi veya tablolar oluşturmak her çerçevede hafızayı doldurur ve çöp toplayıcısını çalıştırır.
lua
-- run once per second
local closest = nil
CreateThread(function()
    while true do
        closest = GetClosestVehicle(GetEntityCoords(cache.ped), 5.0, 0, 70)
        Wait(1000)
    end
end)

Düzeltme 4: döngüler yerine ox_lib noktaları ve bölgeleri kullanın

Çoğu "bu spot yakın mıyım" döngüsü gerekli değildir. ox_lib mesafe işini yapabilir ve sadece önemli olduğunda kodunuzu çalıştırır.

Bir nokta bir yarıçapa girdiğinizde veya çıktığınızda bir işlevi çağırır ve bir çerçeve içinde sadece içerideyken bir:

lua
local point = lib.points.new({
    coords = vec3(215.0, -810.0, 30.7),
    distance = 10.0,
})

function point:onEnter()
    print('entered')
end

function point:onExit()
    print('left')
end

function point:nearby()
    DrawText3D(self.coords.x, self.coords.y, self.coords.z, 'Press E')
    if self.currentDistance < 2.0 and IsControlJustReleased(0, 38) then
        print('used')
    end
end

Bölgeler küre, kutu veya çokgen gibi şekiller için aynı şeyi yapırlar:

lua
local zone = lib.zones.sphere({
    coords = vec3(215.0, -810.0, 30.7),
    radius = 3.0,
    onEnter = function() print('in') end,
    onExit = function() print('out') end,
})

Varlıklar ve noktalar ile etkileşim için, hedef kaynak (example ox_target, örneğin) "E tuşuna bas" döngüsünün yerine geçer. Her birinin tam seçenekleri için ox_lib belgelerine bakın.

Sonucu kontrol edin

resmon 1 tekrar çalıştırın. Düzeltilmiş betik noktalarından uzakta durduğunuzda 0.00 ms yakında oturmalı ve sadece yakınsanız yükselir. Yine de yüksekse, aynı kaynakta ikinci döngüyü arayın: bir Wait(0) genellikle tek olanı değildir.

Dikkat: anahtar basış veya çizim işleyen döngüde uzun uyku ayarlamayın. Uyursanız 500 ms ve oyuncu tuşa basarsa, betik bunu kaçırır. Hiçbir şey yürürlüğe girdiğinde ve bir şey olduğunda Wait(0)'ye düştüğünüzde sadece uyuyun.

Kontrol listesi

Belirtisi Çözüm
Boş olduğunda yüksek ms while true do Wait(0) döngüsünü bulun ve mesafeye dayalı uyku ekleyin
Her çerçevede PlayerPedId() Önbelleğe alın veya ox_lib'den cache.ped kullanın
Döngüde mesafe kontrolleri lib.points.new veya lib.zones ile değiştirin
Her çerçevede varlıkları arama Saniyede bir çalıştırın ve sonucu tutun
Döngüde oyuncu verilerini okuma Çerçeve olayında okuyun ve saklayın
Uyku eklendikten sonra kaçırılan tuş basışları Wait(0) sadece oyuncu yakındayken kullanın

Kısa yanıtlar

Betik için iyi bir resmon değeri nedir?

Boş bir betik 0.00 ile 0.01 ms etrafında oturmalıdır. Onu kullanmadığınız zaman iyi yukarıda kalan herhangi bir şey çok sıkı çalışan bir döngüsüne sahiptir.

Wait(0) ne yapar ve neden maliyetlidir?

Wait(0) döngüyü çerçeve başına bir kez çalıştırır. Saniye başına 60 çerçevede saniyede 60 çalışmadır ve içinde çağırdığınız herhangi bir yerleşik saniyede 60 kez çalışır.

Yüksek ms düzeltmek için ox_lib'e ihtiyacım var mı?

Hayır. Düzeltmeler düz Lua'da çalışır. ox_lib sadece onları kısaltır, cache.ped, lib.points ve lib.zones ile.

Bu sorunu yaşatmayan scriptler

CCTV Security CamerasYerleştirilebilir kameralar, canlı çoklu görüntü tableti ve basılı delil fotoğrafları.Scripti gör →Advanced BoostingTabletten araç boosting: D’den S+ sınıfına kontratlar, ekipler ve canlı sıra.Scripti gör →Arcade MachinesGerçek kabinlerde oynanabilir yedi arcade oyunu; skor tabloları ve bahislerle.Scripti gör →

Okumaya devam edin