Çok oyunculu FPS sunucu tarafı performansı


12

Bu, bant genişliği hakkında olması dışında MMO Performansı ile ilgilidir . Bu cpu yükü ile ilgili.

Node.js ve webGL kullanarak basit bir FPS bir araya getirdim. MIDI Labirentinin BuddyMaze klonu gibi son derece basittir. Çok az şey oluyor, herkes iki boyutta hareket ediyor (yükseklik yok), basit mermileri vuruyor ve duvarlara koşuyor.

Şu anda, her oyuncunun çevrelerde dönerken hızlı bir şekilde ateş ettiği sunucuya birden fazla bağlantı kurarsam, sunucu bir çekirdeği maksimize etmeden ve yavaşlamadan önce oyunda yaklaşık 15-20 oyuncu alabilirim. Ve bu sunucuda 30 fps hızında çalışırken. 10 fps'de yaklaşık 25-30 bağlantı alırım. Bu oldukça kötü, çünkü oyun yakında yapacak çok şey olacak ve bunun mümkün bir çaba olması için daha fazla oyuncuya ihtiyacım olacak.

Kardeşim iş arkadaşının TF2 sunucusu hakkında bazı istatistiklere dikkat çekti. Sunucusu bizimkinden daha düşük özelliklere sahip, ancak TF2, tabii ki çok daha karmaşık bir oyun, saniyede 36 kullanıcı ile, çekirdek başına 36 kullanıcıyla çalışıyor. Ayrıca, şu anda olduğundan daha fazla bant genişliği tüketiyoruz, ancak henüz bu kadar azaltmaya çalışmadık.

Bu nasıl mümkün olabilir? Sunucu performansını bu büyüklüğe yükseltmek için ne tür numaralar var? Bildiğim bazı şeyler şunlardır:

  • Sunucudaki kare hızını düşürme ve istemcideki konumları enterpolasyonlama. Biraz fayda sağladım, ancak TF2 sunucusu bununla bile uğraşmıyor.
  • İstemcide çarpışma algılama gibi pahalı şeyler yapmak ve bunu sunucuda seyrek olarak doğrulamak. Bunu henüz bitirmedim, bu gece yapacağım. Buna rağmen böylesine muazzam bir kazanım beklemiyorum.
  • Hesaplamaları en aza indirmek için oyun alanını bölgelere ayırın (dört ağaç). Bunun için henüz bir fırsatım olmadı.
  • Node.js'nin TF2'nin kullandığı her şeyden çok daha yavaş olduğu ve bu tür yüksek yoğunluklu görevler için uygun olmayabileceği talihsiz olasılığı düşündüm.
  • Hepsi sunucu yapılandırma sihrinde mi?

Peki, sunucuda sadece gerekli olanı yapmakla birlikte yine de kusursuz bir oyun deneyimine sahip olmak için endüstrinin diğer hileleri nelerdir? "Cpu zamanından tasarruf etmek için müşteriye erteleme" ve "müşteriye güvenme" arasında büyük bir çatışma var, bu yüzden çeşitli durumlarda hattın nereye çekildiğini bilmek yardımcı olabilir mi?

Güncelleme

Profilleme, şimdiye kadar bulduğum tek mantra kesinlikle yanılmaz. Hızla kodumun etrafında bazı zamanlama fonksiyonları sarılmış (teşekkürler, FP!) Ve hiç beklemediğimi keşfettim: hemen hemen tüm yürütme süresi için istemcilere veri yayınlama eylemi. Özellikle, yaklaşık% 90'ı. Daha ileri testler, bu sürenin hem müşteri sayısına hem de verilerin boyutuna bağlı olduğunu, ancak daha sonra ikincisine bağlı olduğunu gösterdi. 20 kullanıcı yükünde, tam veri yerine yalnızca "{}" göndererek yayın zamanımı% 90, 24 ms'den 2 ms'nin biraz üzerine düşürdüm. Ancak yalnızca 5 kullanıcıyla yayın 0,5 ms sürüyor. Burada açıkça bir optimizasyon yapmam gerekiyor.

İlk en belirgin gelişme görüş hattı kontrolüdür. Bu, hem verileri önemseyen kişi sayısını hem de ilgili taraflara gönderilen veri miktarını azaltacaktır. Yayınlayabildiğim bu alanda yayın işlemimin maliyetini en aza indirmeye odaklanan başka hileler var mı?


5
Profil kodu gerçekten tüm önerebilirim. Benim tahminim onun düşündüğünüz kadar ince ayarlanmamış ve bu yüzden TF2 daha az donanım üzerinde daha yüksek kene oranı çalışıyor. TF2'nin önerdiğiniz her şeyi yapıyor olabileceğini ve bunun sonucunda performanslarının neden daha yüksek olduğuna katkıda bulunduğunu düşünüyorum.
Nate

1
En son sonuçlarınızı duymak istiyorum, node.js'den daha iyi performans elde edebildiniz mi?
iddqd

Yanıtlar:


5

Sunucunuz tüm oyuncuların durumunu her işarette tüm oyunculara göndermemelidir. Bunun yerine, her müşteriye her 500 ms'de bir "görüş portunuzdaki bu x oyuncuların 500 ms'de bu koordinatlarda olması gerekir" diyen özel hazırlanmış bir mesaj göndermesi gerekir. Çoğu zaman bu iyi çalışır, ancak sunucu yanlış bilgi verdiğini fark ederse, ekstra bir mesaj gönderir.

Bu, ağ trafiğini önemli ölçüde azaltacaktır.

Dikkate alınması gereken başka bir şey, sunucuda oyun keneleri olmamaktır, ancak bunun yerine istemciye yalnızca bir eylem gerçekleştiğinde (yön değiştirdi, ateş edildi) mesaj göndermesini ve ardından bir eylem alındığında sunucuda önceden hesaplanmasını istemektir.


Evet, şu anda görüş hattını ekliyorum. Aslında kazançlar 25 oyuncu için 45 ms'den 35 ms'ye kadar minimaldi. Ancak, yayınlama yerine tek tek gönderme komutlarını kullanmak için fazladan ek yük olabilir. Ve sadece girişte mesaj gönderiyorum. Ama haklısın, sadece girdi alındığında hiç işaretlememenin bir yolu olabilir.
Tesserex

1

Node.js'nin TF2'nin kullandığından çok daha yavaş olduğu ve bu tür yüksek yoğunluklu görevler için uygun olmayabileceği talihsiz olasılığı düşündüm.

Muhtemelen budur. TF2'nin sunucusu C / C ++ kullanılarak yazılmıştır ve bu nedenle node.js'den daha hızlı olacaktır (doğru hatırlamıyorsam Java'da yorumlanan Javascript kullanır)

Google'ın WebGL tabanlı Quake sunucusu için java kullanır ve kaynak kodu burada bulunur: http://code.google.com/p/quake2-gwt-port/ . Nasıl yapıldığını görmek için buna bakmaya değer olabilir. Sunucuda kare hızının olması hakkında konuşurken ne demek istediğinizi de merak ediyorum. Sunucuda herhangi bir şey oluşturmak için bir neden yoktur, sadece istemci tarafından gönderilen komutları işlemek için orada olmalıdır.

Son olarak, "müşteriye güvenme" kuralı, performansı iyileştirme umuduyla pahalı hesaplamaları müşteriye boşaltmaktan daha önemlidir. Özellikle çarpışma tespiti kadar önemli bir şey. Oyununuz Javascript tabanlı olduğunda ve dolayısıyla hacklenmesi oldukça kolay olduğunda (derlenmiş TF2 gibi bir şeye kıyasla) iki katına çıkar.

Bunun çok fazla bir yanıt olmadığını biliyorum, ancak umarım performansınızı artırmanıza yardımcı olabilecek birkaç yöne işaret eder.


7
Kare hızı yerine kene hızı demeliydim. Elbette sunucuda hiçbir şey görüntülenmez. Yani oyun döngüsünde komutları işlediği aralık. Ayrıca birkaç cevap, her birkaç saniyede bir rastgele doğrulama yaptığınız sürece, istemciye çarpışma algılama gibi şeyler verebileceğinizi göstermektedir. Birisi dolandırıcıları oldukça çabuk ayıkladığını söyledi.
Tesserex
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.