C / C ++ çok oyunculu oyun için ağ mesajlarını serileştirmek ve serileştirmeyi kaldırmanın en iyi yolları nelerdir?


11

Şu anda JSON kullanıyoruz ve istemci ile sunucu arasındaki bazı mesaj türleri için ikili biçime geçmek istiyoruz.

Yapıları sokete okumalı mıyım? Proticol tamponları / tasarruf mu kullanıyorsunuz?

Veri dizilerini nasıl temsil etmeliyim?

Arayüz, verileri paketlemek / paketinden çıkarmak için neye benzemelidir?

Yanıtlar:


12

Varsayarsak ...

  1. bir tampon bayta dönüştürmekten bahsediyorsunuz
  2. UDP kullanıyorsunuz ve performans endişe verici

Yapıyı tanımlamak için paketinizdeki alanı boşa harcamayın. IE, paket türünü belirtmek için en azından bir bayt gönderir, daha sonra alınan her paketin, bu paket türü için önceden tanımlanmış yapıyı izlediğini varsayalım

Yapıları sokete okumalı mıyım? Proticol tamponları / tasarruf mu kullanıyorsunuz?

  • Evet, tüm yapıya İHTİYACINIZ OLSA, tüm yapıyı okuyun
  • Hayır, paket yapısını kendiniz yapın, Bu kesinlikle bu yöntemleri kullanarak serileştirmeden daha küçük olacaktır; paketin tam olarak hangi verileri içermesi gerektiğini bilmelisiniz

Veri dizilerini nasıl temsil etmeliyim?

  • Veri dizisi olarak. Alma sırasında dizi öğelerinin Sayımını göndermekten kaçınmak için veri sonuna kadar arabelleği okumaya devam edin

Arayüz, verileri paketlemek / paketinden çıkarmak için neye benzemelidir?

  • Temel türleri baytlara dönüştürmek için bir dizi yöntemi kolayca kurabilirsiniz, oradan özel türleri dönüştürmek için bu yöntemler üzerine inşa edebilirsiniz. Bunun nasıl yapılacağıyla ilgili ayrıntılar, emin olduğum neredeyse her yerde bulunabilir (kişisel olarak C # kullanıyorum)

Son bir şey, paket boyutu olan , özellikle bir anlık için bir endişe boyut = PacketSize x kişiler connectedPlayers x; Böylece paket başına 60 x 10 x 16 = 9.600 bayt olabilir. Sonra bunu saniyede 20 kez gönderin: = 192.000 bps = 187 KBps. Bu, yüksek bir bant genişliği yükleme hızı olduğu açıktır. Böylece, mümkün olduğunda paket boyutuna katkıda bulunan faktörlerin her birini en aza indirme ihtiyacı.

Bu makale bana çok yardımcı oldu: Valve Multiplayer Networking


Çeşitli nesne seri okuma ve burada soruları ağ ederken keşfetti başka bir makale birkaç hafta önce oldu bu bir Unreal motoru yapar açıklamaktadır. Valve kaynağı için iyi bir karşılaştırma noktası.
Martin Foot

1
Dizi yönteminiz genel durumda çalışmaz - 'veri sonu' nerede? Mesajlarınız sınırlandırılmış olsa bile, bu yapı başına 1'den fazla diziye sahip olamayacağınız anlamına gelir. Bunu düzeltmek için, orijinal poster sabit uzunluklu dizilere yapışabilir veya yapı başına (yapının sonunda) yalnızca 1 dizi olduğundan emin olabilir veya dizinin başında bir sayım değeri gönderebilir.
Kylotan

Sadece bir ipucu daha: Endianess'i tedavi etmeyi unutmayın, böyle bir şeyin var olduğunu bilmiyorsanız bu çok can sıkıcı olabilir.

İyi bir nokta @Kylotan, bazı durumlarda bu ekstra verilerin önlenemeyeceğini kabul edin; ancak kendimi tek bir pakete birden çok dizi eklediğimi
görürsem,

1

Bu sorun Google ve Facebook tarafından çözüldü:

  1. Google'ın Protokol Tamponları - Google, C ++ 'ın büyük bir kullanıcısıdır:

    Protokol Tamponları, yapılandırılmış verileri verimli ancak genişletilebilir bir formatta kodlamanın bir yoludur. Google, neredeyse tüm dahili RPC protokolleri ve dosya biçimleri için Protokol Tamponlarını kullanır.

  2. Apache Thrift (daha önce Facebook'tan):

    Thrift, ölçeklendirilebilir diller arası hizmet geliştirme için bir yazılım çerçevesidir. C ++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C #, Kakao, JavaScript, Node.js, Smalltalk ve OCaml arasında verimli ve sorunsuz çalışan hizmetler oluşturmak için bir yazılım yığını ile kod oluşturma motorunu birleştirir.


Google'ın Protokol arabellekleri daha büyük ölçekli, gerçek zamanlı oyunlar için çok yavaş. Ancak, prototipleme ve daha küçük oyuncu numaraları için versiyonlama nedeniyle oldukça güzel buldum. Her zamanki gibi, profiliniz gerçek hikayeyi anlatacaktır.
Patrick Hughes

Google için yeterince iyi ve Google oldukça iyi ölçekleniyor ve onları kullandığımda iyi çalıştılar. Bu yüzden onlara tavsiye ettim.
ücretli bir inek

Google, gerçek zamanlı performans gerektirmez. Google, her ikisi de Protokol Tamponları tarafından iyi bir şekilde sunulan güvenilirlik ve çalışma süresi gerektirir. Tüm bu geri dönüş sürümünün ve kaynak plakası kod üretiminin karmaşıklığı ek yük getirir ve 50-100 msn aralıklarla 1000 güncelleme gönderip aldığınızda eklenir. Eldeki verilere özgü kodlanmış bir serileştiriciye karşı birkaç sürüm içeren bir Protokol arabelleği oluşturun. @ indeed005 bunun özünü var.
Patrick Hughes

+1, çünkü bu biçimler çoğu gerçek zamanlı veya yüksek bant genişlikli oyun için biraz fazla büyük ve yavaş olsa da (keyfi olarak karmaşık paketleri yeniden oluşturmanıza olanak tanıyan ek bilgiler içerdiğinden), bazı oyunlar, örn. sıra tabanlı olanlar. Her kaynağı optimize etmek gerekli değilse, bu biçimler size çok zaman kazandırabilir ve JSON'dan kesinlikle daha verimlidir.
Kylotan
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.