Ağ Seçenekleri, Sınırları ve Hataları

Bu sayfa, mevcut Ağ Seçeneklerini ve nasıl çalıştıklarını, tüm Ağ Sınırlarını ve bulunan tüm Ağ Hatalarını ve bunların nasıl çözüleceğini listeler

Gezgin

Bu, sayfada daha kolay gezinebilmeniz için bu Sayfanın tüm bölümlerini içeren bir listedir.

Ağ Seçenekleri

umsg (ESKİ)

umsg kütüphanesi, sunucudan istemciye bilgi göndermenin en yaygın yolu olan, artık kullanılmayan sunucu taraflı bir ağ kütüphanesidir. İstemcilerin bir umsg alabilmesi için, istemci ve sunucu için paylaşılan usermessage kütüphanesini kullanması gerekir.

Bu kütüphane, istemciye metin gibi bir mesaj göndermek ve ardından görüntülemek için bazı fonksiyonlarda kullanılıyordu ve hala PrintMessage, Player:PrintMessage ve Player:ChatPrint gibi bazı eski fonksiyonlarda kullanılmaktadır. Ayrıca NW Sistemi tarafından NW Değişkenlerini ağa aktarmak için de kullanılır.

Motor tarafından bir istemciye gönderilen umsg, net arabelleği taşmış olsa / herhangi bir net mesajı alıp gönderemese bile alınabilir.

umsg ve usermessage kütüphanesi ile Merhaba Dünya örneği.

if SERVER then local filter = RecipientFilter() filter:AddAllPlayers() umsg.Start( "Example" ) umsg.String( "Hello World" ) umsg.End() else usermessage.Hook( "Example", function( msg ) print( msg:ReadString() ) end) end

net

net kütüphanesi, istemci ve sunucu arasında veri göndermenin yollarından biridir. Net kütüphanesinin en büyük avantajlarından biri, verileri geriye doğru - istemciden sunucuya - gönderme yeteneğidir.

Bu kütüphane genellikle değerlerin yalnızca belirli bir istemciye ağ üzerinden aktarılmasında veya String'ler (net.WriteString) veya Int'ler (net.WriteInt) gibi daha büyük değerlerin ağa aktarılmasında kullanılır.
Bu kütüphane hakkında daha fazla bilgiyi buradan okuyabilirsiniz: Net_Library_Usage ve Net_Library_Example

OnRequestFullUpdate Game_Events ilk kez çağrıldığında, net mesajları güvenilir bir şekilde alınacaktır
AutoRefresh Sistemi, değişiklikleri ağa aktarmak için net kütüphanesini kullanır. Bu nedenle, 65536 bayt ile sınırlıdır.
Sınırı aşarsanız, bir hata fırlatır.

net kütüphanesi ile Merhaba Dünya Örneği

if SERVER then util.AddNetworkString( "Example" ) net.Start( "Example" ) net.WriteString( "Hello World" ) net.Broadcast() else net.Receive( "Example", function() print( net.ReadString() ) end) end

NW

NW sistemi, bir varlık üzerindeki bir değerin Entity:SetNWString gibi SetNW fonksiyonları ile tüm istemcilere ağ üzerinden aktarılmasına olanak tanır ve değer, Entity:GetNWString gibi GetNW fonksiyonları kullanılarak döndürülebilir.
Ayrıca, SetGlobalString gibi SetGlobal* fonksiyonlarını kullanarak genel değerler ayarlamaya olanak tanır ve değer, GetGlobalString gibi GetGlobal* fonksiyonları kullanılarak döndürülebilir

değer, istemci tarafından değiştirilmediği sürece tüm istemcilerde aynı olacaktır.
Tüm SetNW* ve SetGlobal* fonksiyonları, ayarlandıktan sonra her 10 saniyede bir değeri ağa aktarır.
(Bu nedenle, çok sayıda NW değişkeni kullanırsanız büyük miktarda ağ trafiğine neden olabilir.)
Tüm NW değerleri, GM:InitPostEntity kancası çağrıldığında istemci tarafında erişilebilir olacaktır

SetGlobal* dahili olarak Entity(0):SetNW* gibi çalışır ve bu nedenle, SetGlobal* fonksiyonları ile ayarlanan değerlere Entity(0):GetNW* ile erişilebilir

NW sistemi ile Merhaba Dünya Örneği

if SERVER then Entity( 1 ):SetNWString( "Example", "Hello World" ) else Entity( 1 ):SetNWVarProxy( "Example", function(_, _, _, value ) print( value ) end) end

NW sistemi ile bir tabloyu ağa aktarmak isterseniz, onu bir string'e dönüştürmek için util.TableToJSON kullanabilir ve ardından onu Entity:SetNWString veya SetGlobalString ile gönderip Entity:GetNWString veya GetGlobalString ile döndürebilirsiniz

util.TableToJSON tarafından döndürülen string 255 karakterden büyük olmamalıdır. 511 karaktere kadar kullanmak için NW2 sistemini kullanabilirsiniz.

Örnek: Bir tabloyu ağa aktarmak için NW kullanma

Merhaba Dünya içeren bir tabloyu ağa aktarma

if SERVER then local table = { "Hello World" } SetGlobalString( "Example", util.TableToJSON( table ) ) else PrintTable( util.JSONToTable( GetGlobalString( "Example" ) ) ) end
Çıktı:
1 = Hello World

NW2

NW2 sistemi, NW sisteminin halefidir, ancak resmi olarak tamamlanmamıştır. Varlık üzerindeki değerlerin, varlığın PVS (Potansiyel Görünürlük Seti) içindeki tüm istemcilere, Entity:SetNW2String gibi SetNW2* fonksiyonları ile verilen değerle ağ üzerinden aktarılmasına olanak tanır ve değer, Entity:GetNW2String gibi GetNW2* fonksiyonları kullanılarak döndürülebilir.

Değer, yalnızca varlık istemcinin PVS (Potansiyel Görünürlük Seti) içindeyse veya PVS'ine girerse istemci tarafında güncellenir.
Değer, yalnızca mevcut değerle aynı değilse ağa aktarılır ve SetNW*'den farklı olarak değer, her 10 saniyede bir değil, yalnızca bir kez ağa aktarılır.
Tüm NW2 değerleri, GM:InitPostEntity kancası çağrıldığında istemci tarafında erişilebilir olacaktır

SetGlobal2* dahili olarak Entity(0):SetNW2* gibi çalışır ve bu nedenle, SetGlobal2* fonksiyonlarıyla ayarlanan değerlere Entity(0):GetNW2* ile erişilebilir

Bir Oyuncu üzerinde ayarlanan tüm NW2Vars değişkenleri, sv_playerforcedupdate nedeniyle her 10 saniyede bir güncellenir

Ayrıca, SetGlobal2String gibi SetGlobal2* fonksiyonlarını kullanarak genel değerler ayarlamaya olanak tanır ve değer, GetGlobal2String gibi GetGlobal2* fonksiyonları kullanılarak döndürülebilir. Tüm SetGlobal2* fonksiyonları, değeri istemci tarafında günceller ve PVS'yi yok sayar.

NW2 sistemi ile Merhaba Dünya Örneği

if SERVER then Entity( 1 ):SetNW2String( "Example", "Hello World" ) else Entity( 1 ):SetNW2VarProxy( "Example", function( _, _, _, value ) print( value ) end) end

veya

if SERVER then Entity( 1 ):SetNW2String( "Example", "Hello World" ) else hook.Add( "EntityNetworkedVarChanged", "Example", function( _, _, _, value ) print( value ) end) end

NW2 sistemi ile bir tabloyu ağa aktarmak isterseniz, onu bir string'e dönüştürmek için util.TableToJSON kullanabilir ve ardından onu Entity:SetNW2String veya SetGlobal2String ile gönderip Entity:GetNW2String veya GetGlobal2String ile döndürebilirsiniz

util.TableToJSON tarafından döndürülen string 511 karakterden büyük olmamalıdır.

Örnek: Bir tabloyu ağa aktarmak için NW2 kullanma

Merhaba Dünya içeren bir Tabloyu ağa aktarma

if SERVER then local table = { "Hello World" } SetGlobal2String( "Example", util.TableToJSON( table ) ) else PrintTable( util.JSONToTable( GetGlobal2String( "Example" ) ) ) end
Çıktı:
1 = Hello World

NW2 Sistemi hakkında bazı ek bilgiler

Eğer Entity:SetPreventTransmit true olarak ayarlanırsa, istemcinin PVS'sinden çıkar ve NW2Vars ağa aktarılmaz.
Varlık, tekrar false olarak ayarlanana kadar hiçbir koşulda istemcinin PVS'sine tekrar girmez.

Bir NW2Var, entmessage (Varlık Mesajı) olarak ağa aktarılır.

Entity:NetworkVar dahili olarak NW2 Sistemini kullanıyor gibi görünüyor, bu nedenle aynı limitleri paylaşıyorlar.

Entity:UpdateTransmitState, Entity:NetworkVar'ı etkiler ancak SetNW2* ile ayarlanan NW2Vars'ı etkilemez

Varlığı her istemcinin PVS'sine zorlamak için EFL_IN_SKYBOX Motor Bayrağını kullanabilirsiniz. (Bu, istemciler için çalışmaz. İstemcileri PVS'ye eklemek isterseniz, AddOriginToPVS kullanmanız gerekir)

Örnek: Bir Varlığı zorla ağa aktarma

Varlığı PVS'ye girmeye zorlama

local ent = Entity( 93 ) -- PVS'nizin dışındaki bir Prop if SERVER then ent:SetNW2String( "Hello", "World" ) ent:AddEFlags( EFL_IN_SKYBOX ) else hook.Add( "EntityNetworkedVarChanged", "Example", print ) end
Çıktı:
Entity [93][prop_physics] Hello nil World

NW2 Sistemi için BuildNetworkedVarsTable gibi resmi bir fonksiyon yoktur, ancak bunun gibi bir fonksiyon kullanabilirsiniz.

Örnek: BuildNetworked2VarsTable

-- Bu en hızlı yol değildir ve daha fazla varlık mevcut olduğunda yavaşlayabilir, ancak bu fonksiyonu çok sık çağırmamalısınız. function BuildNetworked2VarsTable() local vars = {} for _, ent in ipairs(ents.GetAll()) do for key, tbl in pairs(ent:GetNW2VarTable()) do if !tbl.value then continue end -- GetNW2VarTable nil değerli anahtarlar döndürebilir. if !vars[ent] then -- bunu yapıyoruz, çünkü sadece NW2 Değişkenlerine sahip varlıkları eklemek istiyoruz. vars[ent] = {} end vars[ent][key] = tbl.value -- NW2 Değişkenini ekler. end end return vars end

DataTable

DataTable ya da kısaca DT, oyunun derleme zamanında tanımlanan ve bu nedenle oyuna sabit kodlanmış veri tablosu alanlarıdır.
Bu DataTable sistemi, kaynak motorundaki tüm motor varlıkları tarafından kullanılan ana ağ sistemidir.
Alanları ağa aktarmak için NW2 gibi PVS (Potansiyel Görünürlük Seti) kullanır.
Birçok Data Table alanına Entity:GetSaveTable ve Entity:GetInternalVariable kullanılarak erişilebilir ve Entity:SetSaveValue kullanılarak değiştirilebilir
Entity:NetworkVar'ın çalışması için, Gmod birkaç Dizi alanı tanımlamıştır:

m_GMOD_String alanları, her biri 511 karakter uzunluğunda olan ve Entity:GetDTString kullanılarak erişilen 4 alana bölünmüştür.

  • m_GMOD_String0
  • m_GMOD_String1
  • m_GMOD_String2
  • m_GMOD_String3
Tüm m_GMOD_String alanlarına, CBaseEntity DATADESC tanımında eksik göründükleri için bahsedilen Entity:GetSaveTable ve Entity:GetInternalVariable fonksiyonları kullanılarak erişilemez.

Ağ Sınırları

umsg sınırları

umsg kütüphanesinin mesaj başına 256 bayt sınırı vardır.
Baytlar aşağıdaki gibi kullanılır:

2 Bayt Dahili olarak kullanılır
x Bayt umsg Adı için kullanılır (her karakter için 1 Bayt.)
kalan Baytlar gerçek umsg tarafından kullanılır.

Veri göndermek için umsg arabelleği sınırlı değildir. Bu nedenle, belleğiniz bitene kadar istediğiniz kadar umsg gönderebilirsiniz.
Belleğiniz biterse, oyununuz basitçe çöker.

Varsayılan olarak, tek bir tick'te bir istemciye 1024 bayt umsg ağ üzerinden gönderebilirsiniz.
Bir şeyi hızlandırmak için veya sadece daha fazla kapasiteye ihtiyaç duyarsanız,
sv_usermessage_maxsize (varsayılan 1024 bayt) ConVar'ını gereken bayt miktarına yükseltebilirsiniz.


net sınırları

net kütüphanesinin mesaj başına 64kb (65535 bayt - 3 bayt dahili olarak kullanılır) sınırı vardır. Kütüphanenin taşmadan önce yaklaşık 256kb (2048kbit) sınırı olan dahili bir arabelleği vardır ve taşarsa, net mesajını alan istemcilerin bağlantısının kesilmesine neden olur. Bu yüzden arabelleği DOLDURMAYIN.
Ayrıca istemci tarafında, çok fazla net mesajı kuyruğa alınırsa ve tüm net mesajlarının toplam boyutu 256kb'ı (2048bit) aşarsa taşacak güvenilir bir akışa sahiptir.

Örnek: net mesaj sınırı

Maksimum boyutu kullanan bir net mesajı oluşturma

local string = "" for k=1, 65532 do string = string .. "a" end net.Start( "test" ) net.WriteString( string ) net.Broadcast()
Çıktı:
65536 524288

net bant genişliği

Biraz açıklama zamanı.
Her net kanalının toplam 8 alt kanalı vardır, her iletimde tek bir tane kullanılır.
Bir alt kanal kullanıldığında, istemci yanıt verene ve sunucuya alt kanalın alındığını bildirene kadar engellenmiş olarak işaretlenir, ardından serbest olarak işaretlenir ve tekrar kullanılabilir.
Kullanılabilir bir alt kanal yoksa, sunucu biri tekrar serbest kalana kadar hiçbir şeyi ağa aktarmaz.
Sunucu -> istemci -> sunucu arasındaki bu gidiş geliş zaman alır ve muhtemelen bant genişliğini sınırlar.
Daha yüksek bir pinge sahip olmak daha fazla alt kanalın kullanılmasına neden olur ve hepsi engellendiğinde bant genişliğini etkilemeye başlar.

Ek olarak, şu anda her iletimde yalnızca 7'ye kadar parça iletilebilir ve tek bir parça şu anda 256 bayt büyüklüğündedir.
Varsayılan olarak, motor 4 parça kullanır, ancak net_maxfragments'ı 1792'ye yükseltmek, motorun tam 7 parçayı kullanmasına neden olur.
Bu küçük parça boyutu ve sayısı, bant genişliğini büyük ölçüde sınırlar.

Bant genişliğini iyileştirmek için ağ limitlerini artırmaya yönelik açık bir istek var: https://github.com/Facepunch/garrysmod-requests/issues/2632

Gmod'un kasıtlı bir bant genişliği sınırı yoktur / bilerek sınırlandırılmamıştır - Rubat.

güvenilir kanal

güvenilir kanal için bant genişliği yaklaşık 120kb/s'dir ancak her istemci için değişebilir.

güvenilmez kanal

güvenilmez kanal için bant genişliği sınırsız gibi görünmektedir ve yalnızca net mesajını göndermek için gereken süreden etkileniyor gibi görünmektedir. Net mesajı çoğu zaman alınmaz çünkü arabellek dolu olur ve net mesajını atlar.

istemci tarafı hataları (güvenilmez kanal)

Yaklaşık 12kb/s civarında bir yerde net arabelleği aşırı yüklenmiş gibi görünüyor ve yerinizde donacaksınız çünkü arabellek aşırı yüklenmişken istemciniz sunucudan herhangi bir net mesajı alamayacak, ancak yine de sunucuya net mesajları gönderebileceksiniz.
Arabellek normal durumuna döner dönmez, arabellek aşırı yüklendiği için geciken tüm güvenilir net mesajlarını almaya başlayacaksınız.

sunucu tarafı hataları (güvenilmez kanal)

Yaklaşık 12kb/s civarında bir yerde net arabelleği aşırı yüklenmiş gibi görünüyor ve sunucu herhangi bir bağlantı sorunu veya paket kaybı olmadan gecikmeye başlayacaktır. Tüm girdiler gecikiyor ve zıplama gibi bazıları düzgün çalışmıyor.
Net arabelleği normal durumuna döndüğünde sunucu normal durumuna dönecektir.


NW sınırları

NW sistemi, 4095 yuvaya sahip olan ve tüm SetGlobal*, SetNW* fonksiyonları ve util.AddNetworkString fonksiyonu tarafından kullanılan bir stringtable kullanır.
Varsayılan olarak 95 yuva kullanılır. Her yeni anahtar bir yuva kullanır, bu nedenle tüm varlıklarda aynı anahtarı kullanırsanız, yalnızca 1 yuva kullanır.
Bir NWVar Adı için maksimum uzunluk 49 karakterdir.

NW Sistemi, Değişkenleri ağa aktarmak için kullanıcı mesajları kullanır. Bu nedenle, bir NWVar'ın maksimum boyutu 255 bayt olabilir.

Örnek: kullanılan networkstrings yuvalarını alma

Kullanılan yuva miktarını ve son anahtarı döndürme

for k = 1, 4096 do if !util.NetworkIDToString( k ) then print( k - 1, util.NetworkIDToString( k - 1 ) ) break end end
Çıktı:
95 ServerName

NW2 sınırları

NW2 sistemi, 4095 yuvaya sahip ayrı bir stringtable kullanır, bu nedenle NW stringtable'dan etkilenmez.
NW2 stringtable, tüm SetNW2* ve SetGlobal2* fonksiyonları tarafından kullanılır. Varsayılan olarak, stringtable tamamen boştur.
Her yeni anahtar bir yuva kullanır, bu nedenle tüm varlıklarda aynı anahtarı kullanırsanız, yalnızca 1 yuva kullanır.
Şu anda, NW2 string tablosunun kullanımını kontrol etmenin bir yolu yoktur.
Bir NW2Var anahtarı için maksimum uzunluk 1023 karakterdir.
(neden bir değerden daha fazla bir anahtar için veri ağa aktarabilirsiniz? (SetNW2String yalnızca 511 karakter ağa aktarabilir.) Güncelleme: Anahtar uzunluğu stringtable/motor tarafından sınırlandırılmıştır ve değer gmod tarafından konulan bir sınırdır)
1023 karakterden küçük ancak 511 karakterden büyük bir string'i ağa aktarmanız gerekiyorsa, Entity:SetNW2String için örneğe bakın


DataTable sınırları

DataTable alanları oyuna sabit kodlanmıştır ve bunlarda yapılacak herhangi bir değişiklik büyük olasılıkla ağ uyumluluğunu bozarak bunları yapmayı daha zahmetli hale getirir.
DataTable'a sahip Motor varlıkları eklemek de büyük olasılıkla ağ uyumluluğunu bozar, bu yüzden genellikle bir net-compat güncellemesi yapılana kadar ertelenirler.

Ağ Optimizasyonu

sv_playerforcedupdate sorunu

Daha büyük bir sunucu çalıştırıyorsanız, oyuncuların her 10 saniyede bir zorla güncellendiğini fark etmiş olabilirsiniz.
Bunun nedeni, bir oyuncuyu tekrar güncellemeden önce beklenecek saniye miktarını tanımlayan sv_playerforcedupdate (varsayılan 10)'dur.
Oyuncuyu bir tick için PVS'ye ekleyip bir sonraki tick'te kaldırarak günceller.
Bu aynı zamanda NW2Vars'ın oyuncular için her 10 saniyede bir güncellenmesinin nedenidir (Eğer senkronize değillerse).
Bu sorun, istemci için büyük miktarda ağ trafiğine neden olabilir ve kısa süreli kare düşüşlerine yol açabilir.

Eğer sv_playerforcedupdate'ı 1000 gibi bir sayıya ayarlayıp sonra tekrar 1'e değiştirirsek,
bu değişiklik yalnızca bir sonraki güncellemeden sonra uygulanır. Bu durumda 1000 saniye sonra
Eğer 0'a ayarlarsanız, tüm oyuncular her karede güncellenir!

Ağdaki ani yükselmelere bir örneği burada görebilirsiniz.

Örnek: tam güncellemelerde oyuncuları ağa aktarma

Bu, bu Sorunu çözmenin yollarından biridir.
Bu çözüm mükemmel değil çünkü sadece Oyuncuyu değil, tüm konumu PVS'ye ekliyoruz.
Bunu bu şekilde yapıyoruz çünkü şu anda PVS'ye tek bir varlık eklemenin bir yolu yok.

-- Bu İstemci tarafı kısmıdır. if CLIENT then local cooldown = 0 -- Bu olay iki kez çağrılır. Bu nedenle, iki kez istememek için bir gecikme ekliyoruz. hook.Add( "InitPostEntity", "RequestFullPlayerUpdate", function() gameevent.Listen( "OnRequestFullUpdate" ) -- Bunu istemci tarafında yapıyoruz çünkü bu olay Güncelleme alındıktan sonra çağrılır. hook.Add( "OnRequestFullUpdate", "RequestFullPlayerUpdate", function( data ) if data.userid != LocalPlayer():UserID() then return end -- Diğer oyuncularla ilgili olayları alabiliriz, bu yüzden onları filtrelememiz gerekiyor. if cooldown > CurTime() then return end net.Start( "RequestFullPlayerUpdate" ) net.SendToServer() cooldown = CurTime() + 5 end) net.Start( "RequestFullPlayerUpdate" ) -- Sadece istemcinin her şeye sahip olduğundan emin olmak için. net.SendToServer() end) return end -- İstemci tarafı kısmı yukarıdadır. Geri kalanı sadece sunucu tarafıdır. -- Bu, PVS'nin içindeki tüm oyuncuları döndürür. local function player_FindInPVS( viewPoint ) local plys = {} for _, ent in ipairs( ents.FindInPVS( viewPoint ) ) do if ent:IsPlayer() then table.insert( plys, ent ) end end return plys end -- Bu, PVS'nin dışındaki tüm oyuncuları döndürür. local function player_FindOutsidePVS( viewPoint ) local plys = {} local pvs_plys = player_FindInPVS( viewPoint ) for _, ply in ipairs( player.GetAll() ) do if !pvs_plys[ ply ] then -- Oyuncunun PVS içinde olup olmadığını kontrol ediyoruz. PVS içinde değilse, onu Tabloya ekliyoruz. table.insert( plys, ply ) end end return plys end local query = {} local query_size = 0 local function RemovePlayer( query, id, ply ) query[ id ] = nil if #query == 0 then query[ ply ] = nil query_size = query_size - 1 if query_size == 0 then hook.Remove( "SetupPlayerVisibility", "Player_Query" ) -- Gerekli değilse kancayı kaldırıyoruz. end end end local function SetupPlayerVisibility( ply ) local left_plys = query[ ply ] if !left_plys then return end -- Oyuncu kalmadıysa atla. local id local next_ply for k, v in pairs( left_plys ) do -- ipairs bozulduğu için pairs kullanmalıyız. id = k next_ply = v break end if next_ply:TestPVS( ply ) then -- Oyuncunun PVS içinde olup olmadığını kontrol ediyoruz. Eğer öyleyse, onu listeden çıkarıyoruz. RemovePlayer( left_plys, id, ply ) return end AddOriginToPVS( next_ply:GetPos() ) RemovePlayer( left_plys, id, ply ) --[[ Çoğu oyuncunun aynı yerde olduğu kalabalık bir sunucumuz varsa, diğer oyuncuların da sorguda olup olmadığını kontrol edebiliriz. Sadece birkaç oyuncunuz varsa veya hepsi haritanın her yerine dağılmışsa aşağıdaki kodu devre dışı bırakabilirsiniz, ancak bunu önermiyorum. Aşağıdaki kod, ağa aktarılmış başka bir oyuncunun PVS'sinde olan oyuncular kaldırıldığı için bir sürü ağ trafiği tasarrufu sağlar. ]] local pvs_plys = {} for _, pvs_ply in ipairs( player_FindInPVS( next_ply ) ) do -- Bu performans tasarrufu sağladığı için tabloyu ters çeviriyoruz. pvs_plys[ pvs_ply ] = true end for key, left_ply in pairs( left_plys ) do if pvs_plys[ left_ply ] then RemovePlayer( left_plys, key, ply ) end end end util.AddNetworkString( "RequestFullPlayerUpdate" ) net.Receive( "RequestFullPlayerUpdate", function( _, ply ) query[ ply ] = player_FindOutsidePVS( ply ) -- PVS'ye eklemek istediğimiz tüm oyuncuları içeren bir tablo ekliyoruz if query_size == 0 then hook.Add( "SetupPlayerVisibility", "Player_Query", SetupPlayerVisibility ) -- İhtiyaç duyulduğunda kancayı ekliyoruz. end query_size = query_size + 1 end )

Ağ Hataları

umsg hataları

realm

Error sending usermessage - too large ([name])

Bu hata, 256 baytlık umsg sınırını aştığınızda sunucu tarafında oluşturulur. Bu hatayı çözmek için umsg'nizin boyutunu azaltın.


realm

Warning: Unhandled usermessage '[name]'

Bu hata, doğru anahtarla usermessage.Hook kullanmayı unuttuğunuzda istemci tarafında oluşturulur.

umsg eskidir ve bunun yerine net kütüphanesini kullanmalısınız.

Örnek: umsg örneği

umsg kütüphanesi nasıl doğru kullanılır

if SERVER then local filter = RecipientFilter() filter:AddAllPlayers() umsg.Start( "Example" ) umsg.String( "Hello World" ) umsg.End() else usermessage.Hook( "Example", function( msg ) print( msg:ReadString() ) end) end

realm

Warning: [number] global queued usermessages!

Bu Uyarı, aynı anda 5000'den fazla umsg gönderildiğinde ortaya çıkar. Bu uyarı hiçbir şeyi etkilemeyeceği için tamamen göz ardı edilebilir. Bu Uyarı, daha az umsg göndererek veya bunları bir zaman aralığına yayarak düzeltilebilir.


net hataları

realm

[addon] Trying to send an overflowed net message!

Bu hata, 64kb (65536 bayt) net sınırını aştığınızda sunucu tarafında oluşturulur. Bu hatayı çözmek için net mesajınızın boyutunu azaltın.


realm Bu hata, 256kb (2048kbit) sınırı olan net güvenilir arabelleğini taşırdığınızda istemci tarafında oluşturulur ve bir istemcinin veya tüm istemcilerin bağlantısının kesilmesine neden olur.
Bu hatayı düzeltmek için, gönderdiğiniz net mesajlarının miktarını veya boyutunu azaltmalısınız, böylece net arabelleğini taşırmazlar.
Net mesajlarını küçük bir süreye yayabilirsiniz, böylece net arabelleğinin tüm net mesajlarını göndermek için yeterli zamanı olur.

Ayrıca, bir İstemciyi atmayacak güvenilmez net mesajları da gönderebilirsiniz, ancak bunun yerine arabelleğe sığmayan tüm güvenilmez net mesajlarını görmezden gelecektir.

Örnek: net arabelleğini taşırma

İstemcinin atılmaması için güvenilmez net mesajları kullanırken güvenilir arabelleği taşırma.

local string = "" for k = 1, 65532 do string = string .. "a" end util.AddNetworkString( "Example" ) for k = 1, 4 do net.Start( "Example", true ) net.WriteString( string ) net.Broadcast() end
Çıktı: İstemciyi atmak yerine, tüm güvenilmez net mesajları alınmayacak ve geliştirici hatası:
Netchannel: failed reading message clc_GMod_ClientToServer from loopback.

oluşturulacaktır.


realm

loopback:send reliable stream overflow

Bu Hata, istemci tarafındaki net güvenilir akışını taşırdığınızda gösterilir. Bu hata oluştuğunda istemci sunucuya herhangi bir net mesajı gönderemez ve bir süre sonra sunucu istemcinin zaman aşımına uğradığını düşündüğü için istemci atılır.
Bunu düzeltmek için, sunucuya göndermek istediğiniz net mesajlarının miktarını azaltın ve bunları küçük bir süreye yayın, böylece akışın her şeyi göndermek için yeterli zamanı olur.


realm

[Addon] Warning! A net message ([name]) is already started! Discarding in favor of the new message! (function origin of the net message)

Bu hata, önceki bir net mesajında bir hata oluştuğunda net kütüphanesi tarafından oluşturulur. Bu, ondan önceki net mesajında oluşturulan hatayı düzelterek giderilebilir.


realm

Netchannel: failed reading message svc_GMod_ServerToClient from loopback.

Bu Uyarı, developer ConVar'ını 1 veya daha yükseğe ayarladığınızda ve güvenilmez bir net mesajı alındığında ve net arabelleğine sığmadığında gösterilir. Bu, gönderilen net mesajlarının miktarını azaltarak ve bunları küçük bir süreye yayarak düzeltilebilir.


realm

Netchannel: failed reading message clc_GMod_ClientToServer from loopback.

Bu Uyarı, developer ConVar'ını 1 veya daha yükseğe ayarladığınızda ve güvenilmez bir net mesajı alındığında ve net arabelleğine sığmadığında gösterilir. Bu, gönderilen net mesajlarının miktarını azaltarak ve bunları küçük bir süreye yayarak düzeltilebilir.


realm

Warning! Trying to net.Broadcast a message '[name]' with no players on server!

Bu Uyarı, developer ConVar'ını 1 veya daha yükseğe ayarladığınızda ve sunucu boşken bir net mesajı yayınlamaya çalıştığınızda gösterilir. Bu Uyarı hiçbir şeyi etkilemeyeceği için tamamen göz ardı edilebilir.


realm

AUTOREFRESH: Not adding [file here] to datatable, its too large! ([file size] vs 65536) Refusing to send autorefreshed Lua file [file here], its too large! ([file size] vs 65536 max)

Bu Hata, 65536'dan fazla karakter içeren bir dosyayı Otomatik Yenilemeye çalıştığınızda ve bir miktar sıkıştırmadan sonra bile hala 65536 bayttan büyük olduğunda oluşturulur. Bu hatayı çözmek için Dosyanızın boyutunu küçültmeniz gerekir.


NW hataları

realm

DLL_MessageEnd: Refusing to send user message NetworkedVar of 256 bytes to client, user message size limit is 255 bytes

Bu Hata, anahtar ve değerin toplam uzunluğunun 255 bayttan büyük olduğu bir NWString'i ağa aktarmaya çalıştığınızda oluşturulur.
Bu Hata, o andan itibaren her 10 saniyede bir meydana gelir, çünkü NW Sistemi tüm NW Değişkenlerini her 10 saniyede bir yeniden ağa aktarır.
Bu hatayı düzeltmek için, NWVar adınızın boyutunu azaltmalısınız.


realm

Too many NWVar names, could not add name [key]

Bu hata, şu anda 4095 yuvada olan NWVar sınırını aştığınızda oluşturulur. Bu hatayı çözmek için NWVar miktarını azaltın veya net kütüphanesini kullanmayı düşünün.


NW2 hataları

realm

Host_Error: SV_PackEntity: SendTable_Encode returned false (ent 1).

Bu hata, aynı anda çok fazla NW2Var'ı ağa aktarmaya çalıştığınızda oluşturulur. Bu hata oluştuğunda, sunucuyu kapatır ve gmod'u yeniden başlatmadan yeni bir oyun başlatmaya çalıştığınızda oyununuz çöker.
Bu hatayı alırsanız, aynı anda ağa aktarmaya çalıştığınız NW2Vars miktarını azaltmalısınız


realm

Warning: Table networkstring is full, can't add [key]

Bu hata, şu anda 4095 yuvada olan NWVar sınırını aştığınızda oluşturulur. Bu hatayı çözmek için NWVar miktarını azaltın veya net kütüphanesini veya SetNW* fonksiyonlarını kullanmayı düşünün.

Tüm sunucular · GmodTR Launcher · Rehber · GMod Wiki · GmodTR nedir? · Sunucu ekle · Discord