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.
umsg ve usermessage kütüphanesi ile Merhaba Dünya örneği.
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ırSınırı aşarsanız, bir hata fırlatır.
net kütüphanesi ile Merhaba Dünya Örneği
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
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
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
Örnek: Bir tabloyu ağa aktarmak için NW kullanma
Merhaba Dünya içeren bir tabloyu ağa aktarma
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 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
veya
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
Örnek: Bir tabloyu ağa aktarmak için NW2 kullanma
Merhaba Dünya içeren bir Tabloyu ağa aktarma
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: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
NW2 Sistemi için BuildNetworkedVarsTable gibi resmi bir fonksiyon yoktur, ancak bunun gibi bir fonksiyon kullanabilirsiniz.
Örnek: BuildNetworked2VarsTable
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_bool, Entity:GetDTBool kullanılarak erişilen32yuvaya sahip bir boolean dizisi.m_GMOD_float, Entity:GetDTFloat kullanılarak erişilen32yuvaya sahip bir float dizisi.m_GMOD_int, Entity:GetDTInt kullanılarak erişilen32yuvaya sahip bir integer dizisi.m_GMOD_Vector, Entity:GetDTVector kullanılarak erişilen32yuvaya sahip bir Vector dizisi.m_GMOD_QAngle, Entity:GetDTAngle kullanılarak erişilen32yuvaya sahip bir Angle dizisi.m_GMOD_EHANDLE, Entity:GetDTEntity kullanılarak erişilen32yuvaya sahip bir Entity dizisi.
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_String0m_GMOD_String1m_GMOD_String2m_GMOD_String3
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.
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
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
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.
Örnek: kullanılan networkstrings yuvalarını alma
Kullanılan yuva miktarını ve son anahtarı döndürme
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.
Ağ Hataları
umsg hataları

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.

Bu hata, doğru anahtarla usermessage.Hook kullanmayı unuttuğunuzda istemci tarafında oluşturulur.
Örnek: umsg örneği
umsg kütüphanesi nasıl doğru kullanılır

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ı

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.
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.
oluşturulacaktır.

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.

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.

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.

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.

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.

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ı

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.

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ı

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

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