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ı?