Bant genişliğini düşük tutmak için MMO teknikleri, algoritmaları ve kaynakları?


9

Mevcut MMO'ların, sıkıştırma ve istemcideki işleme kadar eylem ve hareket verilerini nasıl ele aldığına dair herhangi bir kaynak ve belge var mı? Hareket tahmin algoritmaları için herhangi bir kaynak var mı?

Özellikle wsad hareketi olan ve gecikmeyi düşük tutmaya odaklananlarla ilgileniyorum Ayrıca farklı MMO türleri için paket hızı ve boyutu nedir (ağ açısından)?

Oynatıcı ulaşamazsa veya daha sonra bunları görürse paket hızını ölçeklendirmenin veya bazı paketleri açıkça devre dışı bırakmanın bir yolu var mı?

Yanıtlar:


9

Eh, şu anda biraz eski olan bu kitap var ve gerçekten hiç okumadım, ama saygın bir yayıncıdan. Ben de buldum bu bir daha yeni, ama daha önce hiç duymamıştım. Her ikisi de MMO (veya en azından çevrimiçi) oyun geliştirme konularını kapsadığını iddia ediyor; Bununla birlikte, müşteri tarafı tahmini, eşzamanlı oyuncu tabanınızın ölçeğinden bağımsız olarak aşağı yukarı aynıdır ve Google'ın bu konuda çok fazla bilgisi vardır .

Pratik bir perspektiften, bir indie / hobi geliştiricisinin, "muazzam" kabul edilecek kadar yüksek bir teorik zirve eşzamanlılığı elde etmek için yeterince oyuncu toplayacak kadar popüler olacak bir oyunu bir araya getirmesinin oldukça zor olduğunu anlamak önemlidir . Ancak teknikler hala araştırma için eğitici olabilir.

Yapabileceğiniz şeylerin iki ana sınıflandırması vardır:

  • İhtiyacı olan en az sayıda istemciye yalnızca çok az miktarda veri gönderme konusunda agresif olun.
  • Oyunculara çok fazla toplanmaya teşvik etmeyen bir oyun tasarlayın ve "ihtiyacı olan müşteri setini" genel olarak küçük tutmanıza yardımcı olun.

İkincisi gerçekten bir oyun tasarımı ve sosyal manipülasyon problemi - özellikle zor çünkü çok oyunculu oyunlar doğal olarak sosyal, bu onların çekiciliğinin bir parçası, bu yüzden oyuncu kümelerini çok fazla caydırmak istemiyorsunuz. Öte yandan, dünyadaki herkesin yumurtlama kampı yaptığı bir oyunda, oyunda en iyi ganimeti bırakan adamın ölçeği zor olacaktır.

İlk seçenek için kademeli mesajlaşma yapmayı düşünebilirsiniz - diğer oyuncular hakkında her zaman bilmeniz gereken bazı şeyler vardır, örneğin pozisyonlar. Ancak sağlık gibi diğer şeyler, mevcut oyuncunun henüz göremediği nesneler için önemli olmayabilir, bu yüzden o oyuncuya gönderdiğiniz şeyi etrafındaki diğer tüm varlıkların göreceli mesafesine dayanarak kapatırsınız - bu aslında kısır Sorunuzun son bitinde belirttiğiniz gibi gönderdiğiniz verileri filtrelemenin yanı sıra.

Çok büyük ölçekli çok oyunculu mimariler, üzerinde hemen harekete geçilmesi gerekmeyen raporları da tamponlayacaktır. Sunucuya gönderilen karakter kaydetme mesajları, yalnızca kritik noktalarda tam güncelleştirmelerle deltalarda yapılabilir ve bu güncelleştirmeler, karakter verilerini sabit tutan sunucuya gönderilmeleri için bir kısıtlama sunucusunda arabelleğe alınabilir, periyodik moda - oyuncu tabanınız ölçeklendirilirken, ağ trafiğinin yanı sıra disk IO'sunu optimize etme konusunda endişelenmeniz gerekir. Karakter veritabanınızın çökmesine neden olmak istemezsiniz.

Paket hızı ve boyutu, MMO olmayan oyunlar için olduğu gibi oyundan oyuna büyük ölçüde farklılık gösterir. Gerçekten çok ihtiyaca özel bir şey ve genelleştirilmiş standartlar yok.


1
İlk kitabın devamı da var (Devasa Çok Oyunculu Oyun Geliştirme 2). Bence çok kullanışlı bir kitap serisi değil (çoğu oyun geliştirici kitapta olduğu gibi kesinlikle bir MMO-x-saatte baştan sona yapma kitabı değil), ancak bazı teorik problemleri tartışıyor bu soruda sordu. Ve belki de zaten MMO'ları kısmen gelişmiş biri için daha yararlı olacaktır.
Ricket

5

Yukarıdaki yanıta ek olarak, TCP_NODELAY ve pencere ölçeklemenin nasıl çalıştığını okuyun. TCP'nin ayrıntılarını anlamak (ve evet, sipariş dışı gelen farklı güncellemeleri işleme olasılığı sizin için eğlenceli değilse, UDP değil TCP kullanmak istiyorsunuz) ve yeniden iletim gecikme kontrolü için kritik öneme sahiptir.


4
Farklı güncellemeler kullanıyorsanız (genellikle oyun içi yapıların ikili farkları) ve sipariş dışı teslimat (güvenilir veya değil) ile herhangi bir şey kullanıyorsanız pişman olacağınızı tekrarlayacağım. Oyunlarda TCP'den hoşlanmayan insanlar genellikle bunun hakkında yeterince şey bilmiyorlar (NODELAY'in ne yaptığını bilmek gibi). UDP, sıra dışı paketlerin kolayca bırakılabileceği ses verileri gibi şeyler için mantıklıdır, bu bir oyunda nadiren görülür.
coderanger

1
"nadiren bir oyunda"? Sunucunun bana her karede yetkili oyun durumları sağlaması şartıyla, geçmişte ne olduğu umurumda değil. UDP paketlerinden monoton olarak artan basit bir kare sayısı bunun için mükemmeldir. Güvenilir bir şekilde iletmek için ne kadar veriye ihtiyacınız var?
ChrisE

2
"Eğer sunucu bana yetkili oyun devletler her kareyi veriyor şartıyla" Tabii, verilen gibi davranırsanız. Her karede tam durumu göstermenin tam tersi olacak "diferansiyel güncellemeler kullanıyorsanız" dedim. Dünyada herhangi bir karmaşıklığa sahip bir MMO'da, sık sık tam güncellemeler göndermek imkansız hale gelecektir.
coderanger

1
Değişen şeylerin tam durumunu göndermiş olsanız bile, şeyleri bir araya getirmenin mümkün olmadığı sıra dışı teslimat sorunları ile sonuçlanırsınız. "X = 1, y = 2" ve sonra "y = 1, z = 2" güncellemelerini düşünün. Eğer bunlar geriye doğru gelirse, "ilk" olanı düşürmek istersiniz, böylece y değeri doğru olur, ancak x'deki değişikliği kaybedersiniz.
coderanger

1
@Adam Bu yüzden TCP spesifikasyonunu okumalı ve pencere ölçeklemenin nasıl çalıştığını ve yeniden iletim ile nasıl etkileşime girdiğini anlamanız gerektiğini söyledim ;-) TCP'yi yeniden yazmak her zaman yanlıştır, vidalama şansı% 100'e yakındır. Güvenilir, sipariş üzerine teslimat istiyorsanız, UDP kullanmamalısınız.
coderanger
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.