FiveM'de güvenilir ağ olayı taşması: betiği bulun ve düzeltin

Oyuncular Reliable network event overflow ile atıldı mı? Bir betik çok fazla olay verisi gönderir. Kaynağı bulun, yükleri küçültün, latent olayları ve durum çantalarını kullanın.

Oyuncu sunucudan atılıyor veya tüm sunucu zaman aşımına başlıyor, bunun gibi bir iletiyle:

text
Reliable network event overflow

FiveM her bağlantı için güvenilir ağ olaylarının sınırlı kuyruğunu tutar. Bir betik bunu bağlantının gönderebileceğinden daha hızlı doldurduğunda, oyuncu bırakılır. Neden neredeyse her zaman bir kaynaktır. Burası onu bulma ve düzeltme yoludur.

Ne olur

Her TriggerClientEvent ve TriggerServerEvent güvenilir bir iletidir: ulaşmalı, sırada. Birçok gönderirseniz veya çok büyük olanları, o oyuncu için sıra büyür. Taşarsa, bağlantı kesintiye uğrar.

Olağan desenler:

  • Bir olayda gönderilen büyük tablo: araçlar, öğeler, oyuncular veya tam bir yapılandırma tam listesi.
  • Her işarette veya her birkaç milisaniyede olay tetikleyen döngü.
  • Herkese gönderilen (-1) olay saniyede birçok kez.
  • Veriler değişmediğinde aynı veriyi tekrar tekrar gönderen betik.
lua
-- bad: sends everything, to everyone, every 100 ms
CreateThread(function()
    while true do
        Wait(100)
        TriggerClientEvent('myscript:update', -1, GetAllData())
    end
end)

Kaynağı bulun

Hata iletisi betiği adlandırmaz, bu nedenle ölçüm yapmanız gerekir.

  1. Sunucu konsoluna bakın tekmelerin zamanı civarında. Birçok özdeş olay adı veya sorunlardan hemen önce başlayan kaynağı bir ipucudur.
  2. Profilcisini kullanın. Yerleşik profiler kısa bir oturum kaydeder ve görüntüleyicisinde açmanıza izin verir. Sunucu konsolunda:
text
profiler record 500
profiler view

Sürümler arasında değişebildiği için sunucu yapınız için tam komutları kontrol edin. Kayıt hangi kaynakların ve olayların zaman aldığını gösterir ve ağır olanı bulmanıza yardımcı olur.

  1. Kaynakları tek tek durdurun test sunucusunda. Bir kaynağı durdurduktan sonra tekmeleri durdurursanız, onu buldum.
  2. Kodu ara döngü içinde TriggerClientEvent ve TriggerServerEvent için ve -1 ile gönderilen olaylar için.

İpucu: sorun genellikle yeni bir betik ekledikten veya betik güncellemesinden sonra başlar. Önce ne değiştiğini kontrol edin.

Düzeltme 1: daha küçük yükleri gönderin

Bütün veri setini değil, sadece değişenini gönderin.

lua
-- bad: the whole table
TriggerClientEvent('shop:sync', src, allShops)

-- better: only the changed entry
TriggerClientEvent('shop:updateOne', src, shopId, shops[shopId])

İstemcinin ihtiyaç duymadığı alanları çıkarın, bütün nesneler yerine kimlikleri gönderin ve istemci detay gerektiğinde talep etsin.

Düzeltme 2: daha az sıklıkla gönderin

Bir şey olduğunda olayları tetikleyin, zamanlayıcıda değil. Zamanlayıcı gerekiyorsa, yavaşlayın ve hiçbir şey değişmezse atlayın.

lua
local last = nil

CreateThread(function()
    while true do
        Wait(2000)
        local data = GetData()
        if data ~= last then
            last = data
            TriggerClientEvent('myscript:update', -1, data)
        end
    end
end)

İhtiyacı olan oyunculara -1'e değil, gönderin, yalnızca bazı oyuncular umursamaz ise.

Düzeltme 3: büyük veri için latent olayları

Büyük yapılandırma veya görüntü gibi çok fazla veri göndermeniz gereken zaman, latent olay kullanın. Normal sırayı doldurmak yerine seçtiğiniz bir hızda, saniye başına bayt sayısında arka planda veriyi gönderir.

lua
-- server -> client, 50 KB/s
TriggerLatentClientEvent('myscript:bigData', src, 50000, bigTable)
lua
-- client -> server
TriggerLatentServerEvent('myscript:bigData', 50000, bigTable)

Olay daha sonra ulaşır, bu nedenle yalnızca acil olmayan veriler için kullanın. Oyuncunun bağlantısını satmayan bir hız seçin.

Düzeltme 4: paylaşılan durum için durum çantaları

Veri bir varlık veya oyuncu durumu ise (bayrak, değer, durum), durum çantası genellikle olaylardan daha iyidir. FiveM değişiklikleri çoğaltır ve yalnızca değişeni gönderir.

lua
-- server
Player(src).state:set('isCuffed', true, true)

-- client, anywhere
local cuffed = LocalPlayer.state.isCuffed

Durum çantaları büyük tablolar için küçük değerler, değildir. Nasıl çalıştıklarını bkz. FiveM state bags explained ve Client and server events in FiveM tabanları.

Betiği düzenleyen edemezseniz

Betik ödenen veya korumalı bir kaynaksa, kodunu değiştiremezsiniz. Sorunu yazara profiler sonucu ve tekmelerin zamanı ile bildirin. Hangi etkinlik çok büyük olduğunu bilirler. O zamana kadar, kaynağı durdurmak veya yapılandırması varsa yenileme hızını düşürmek, tek çözümdür.

Kontrol listesi

Belirtisi Çözüm
Reliable network event overflow tekme Çok fazla veri gönderen betiği bulun
Betik eklendikten sonra başlanan tekmeleri O kaynağı durdurun ve yeniden test edin
Bir olayda büyük tablo Yalnızca değişen veriyi veya kimlikleri gönderin
Hızlı döngüde olay Değişiklikte gönder, zamanlayıcıyı yavaşlat
Olay sürekli -1 gönderilir Buna ihtiyacı olan oyunculara gönderin
Acil olmayan büyük yük TriggerLatentClientEvent veya TriggerLatentServerEvent
Varlık veya oyuncu durumu Durum çantalarını kullanın

Kısa yanıtlar

Güvenilir ağ olayı taşmasına ne sebep olur?

Bir kaynağı bağlantının sağlayabileceğinden hızlı veya daha fazla olay verisi gönderir. Bir olayda gönderilen büyük tablolar veya her birkaç milisaniyede olayları tetikleyen döngü, olağan nedenlerdir.

Güvenilir ağ olayı taşması çok fazla oyuncudan kaynaklanır mı?

Doğrudan değil. Daha fazla oyuncu, bir betik herkese gönderdikçe trafiği çoğalttığı için olasılığı artırır. Neden hala çok fazla veri gönderen bir kaynaktır.

Latent olay nedir?

Latent olay verilerini seçtiğiniz bir hızda arka planda gönderir, bu nedenle normal olay kuyruğunu tıkamaz. Acil olmayan büyük yükleri için kullanın.

Bu sorunu yaşatmayan scriptler

Mic PhoneTablete dönüşen katlanabilir bir telefon; oyuncunun gerçek telefonuna da taşınır.Scripti gör →CCTV Security CamerasYerleştirilebilir kameralar, canlı çoklu görüntü tableti ve basılı delil fotoğrafları.Scripti gör →Shop CreatorBir dakikadan kısa sürede dükkân kurun — sahipler, çalışanlar, kasalar ve soygunlar dahil.Scripti gör →

Okumaya devam edin