Birçok küçük paket iyi. Aslında, TCP ek yükü konusunda endişeleriniz varsa, bufferstream
1500 karaktere kadar (veya TCP MTU'larınız ne olursa olsun, dinamik olarak talep etmek en iyisi) toplayan bir etiket ekleyin ve sorunu tek bir yerde ele alın. Bunu yaptığınızda, aksi takdirde yaratacağınız her ekstra paket için ~ 40 bayt yükü size kalır.
Bununla birlikte, daha az veri göndermek ve orada daha büyük nesneler oluşturmak daha iyidir. Tabii ki göndermek, göndermekten "UID:10|1|2|3
daha küçük UID:10;x:1UID:10;y:2UID:10;z:3
. Aslında, bu noktada tekerleği yeniden icat etmemelisiniz, protobuf gibi bir kütüphaneyi 10 bayt veya daha az bir diziye indirgeyen bir kitaplık kullanmalısınız .
Unutmamanız gereken tek şey Flush
, akışınıza ilgili konumlara bir komut eklemektir, çünkü akışınıza veri eklemeyi durdurur durdurmaz, herhangi bir şey göndermeden önce sonsuz bekleyebilir. Müşteriniz bu verileri beklerken gerçekten sorunludur ve istemciniz bir sonraki komutu gönderene kadar sunucunuz yeni bir şey göndermez.
Paket kaybı, burada marjinal olarak etkileyebileceğiniz bir şeydir. Gönderdiğiniz her bayt bozulmuş olabilir ve TCP otomatik olarak bir yeniden iletim ister. Daha küçük paketler, her bir paketin bozulması için daha düşük bir şans anlamına gelir, ancak ek yüke katıldıkları için, daha fazla bayt gönderirsiniz, kaybedilen bir paketin olasılığını daha da artırırsınız. Bir paket kaybolduğunda, TCP, eksik paket yeniden gönderilip alınana kadar sonraki tüm verileri arabelleğe alır. Bu büyük bir gecikmeye (ping) neden olur. Paket kaybı nedeniyle bant genişliğindeki toplam kayıp ihmal edilebilir olsa da, oyunlar için daha yüksek ping istenmez.
Alt satır: Mümkün olduğunca az veri gönderin, büyük paketler gönderin ve bunu yapmak için kendi düşük düzeyli yöntemlerinizi yazmayın, ancak bufferstream
ağır kaldırmayı işlemek için iyi bilinen kütüphanelere ve protobuf gibi yöntemlere güvenin.