Çok oyunculu atlama gibi eylemler nasıl senkronize edilir?


11

Yeni başlayan bir oyun geliştiricisiyim ve çok oyunculu oyunları araştırıyorum. Her zaman biraz gecikme olduğunu gözlemledim, oyuncular her zaman geçmiş eylemlerden güncellemeler aldılar. Ancak gecikmeyi ele almak için ölü hesaplaşma gibi teknikler vardır. Hareketi tahmin edebilir ve hareketleri pürüzsüz hale getirebilirim. Ancak, atlama, yürümeyi durdurma vb.Gibi eylemleri nasıl senkronize edebilirim?

Diyelim ki A müşterisi hareket ediyordu, 100m / sn hız ile 10.2 saatte 100m'deydi ve bu bilgiyi gönderdi. B müşterisi bu bilgileri bir süre sonra alacaktır, 10.4 olsun. B müşterisinde, tahmin kullanabilir ve A istemcisini 120 metreye yerleştirebilirim. Ama ne olursa, müşteri 10.3'te 110m'de bir sıçrama yaptı. Bunu tahmin edemiyorum ve tahmin kullandığımdan beri müşteriye A sıçramalarını geçmişte gösteremiyorum.

Hiç atlama eylemi göndermeyerek bu sorunla başa çıkabilirim. Ama ya oyunumda oyuncuların düşüp ölebilecekleri boşluklar varsa. Yani, atlama eylemlerini senkronize etmezsem, diğer oyuncular bir oyuncunun koştuğunu gözlemleyecek, sonra boşluğa düşecek ve daha sonra ekranda görsel etkileşimi yok edecek şekilde görünecek.

Atlama sadece bir örnektir, tahminin işe yaramayacağı birçok senaryo olabilir. Peki, onlarla nasıl başa çıkılır. Böyle bir örnek Awesomenauts gibi Multiplayer Online savaş arenası oyunları olabilir.


Çok Oyunculu hakkında fazla bir şey bilmiyorum, bu yüzden doğru bir cevap veremeyeceğim. Ama aldığımdan, ideal kurulum, müşterilerinizin az çok aptalca olacağı ve sadece klavye, fare, gamepad veya sunucuya herhangi bir girdi göndereceği ve sunucunun tüm hareketi ve dünya güncelleme şeylerini yapması ve pozisyonları ve diğer tüm ilgili verileri istemcilere geri gönderir, bu da sonucu görüntüler. Tahmin ve benzeri şeyleri ortadan kaldırıyor.
Christian

@Christian hey! Yanıtınız için teşekkürler. Bu yaklaşımı biliyorum ama gecikme yüksekse oyunun sarsılmasını sağlayabilir ve ayrıca AppWarp'ın BaaS gerçek zamanlı sistemini kullanırım, bu yüzden tüm mantığım sadece istemci tarafındadır.
Suyash Mohan

Her iki yönteminizi de birleştirmek yetkili sunucudur. İstemciler ve sunucu hem simüle eder, istemciler girdilerini gönderir, sunucu yetkili durumunu geri gönderir. İstemciler durumlarını yetkili duruma uyacak şekilde ayarlar. Durumlar eşleştiğinde, müşteriler yerel olarak simüle edilmiş gibi çalışırlar (gecikme yok).
MichaelHouse

Geçenlerde bu öğretici serisi gecikme yönetimi hakkında iyi ipuçları vermek için buldum, ilgi alanlarınızla alakalı gibi görünüyor: bağlantı
Kris Welsh

Yanıtlar:


8

Ölü hesaplaşma bu durumda en iyi fikir olmayabilir; varlık enterpolasyonu yapmalısınız (geçmişte diğer oyuncuları etkili bir şekilde oluşturmak, size her zaman gerçek, geçerli pozisyonlar verir). Burada çok daha ayrıntılı bir şekilde yazdım . Geçmişte oyuncuları biraz görüp görmemenin kabul edilebilir olup olmaması, ne yapmaya çalıştığınızın ayrıntılarına bağlıdır.


4
İlk ağ bağlantılı çok oyunculu oyunumu yazarken bu yaklaşımı kullandım. Aslında @ ggambett's'i referans olarak kullandım. Benim için iyi çalıştı.
NoobsArePeople2

1

Kaynak motor hakkında oldukça ayrıntılı bir yazı var. İlgili kaynak kodun bir kısmı Kaynak SDK'nın bir parçası olarak da kullanılabilir.

https://developer.valvesoftware.com/wiki/Source_Multiplayer_Networking

Bir sunucu-istemci modelinde ağ gecikmesini ele almak ve denemek için bir dizi teknik kullanır. Ana nokta, yerel istemcinin giriş ve diğer olayları yerel olarak sunucu yokmuş gibi işlemesi ve daha sonra sunucunun istemcinin daha sonra yanlış yaptığını söyleme olasılığı ile ilgilenmesidir.

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.