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:
Reliable network event overflowFiveM 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.
-- 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.
- Sunucu konsoluna bakın tekmelerin zamanı civarında. Birçok özdeş olay adı veya sorunlardan hemen önce başlayan kaynağı bir ipucudur.
- Profilcisini kullanın. Yerleşik profiler kısa bir oturum kaydeder ve görüntüleyicisinde açmanıza izin verir. Sunucu konsolunda:
profiler record 500
profiler viewSü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.
- Kaynakları tek tek durdurun test sunucusunda. Bir kaynağı durdurduktan sonra tekmeleri durdurursanız, onu buldum.
- Kodu ara döngü içinde
TriggerClientEventveTriggerServerEventiçin ve-1ile 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.
-- 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.
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.
-- server -> client, 50 KB/s
TriggerLatentClientEvent('myscript:bigData', src, 50000, bigTable)-- 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.
-- server
Player(src).state:set('isCuffed', true, true)
-- client, anywhere
local cuffed = LocalPlayer.state.isCuffedDurum ç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 →