Bir sunucu / istemci mimarisi kullanırsam (oyunculardan biri hem sunucu hem de istemci gibi davranıyorsa) ve istemcilerden biri doğrudan yöneticiye eklemesi veya yalnızca istek göndermesi durumunda bir grup eylem oluşturduysa sunucuya hangi sırayla her müşteriye bu grubu eklemesini emreder?
Bu durumda, daha önce bahsettiğiniz üç seçeneğiniz var. Hangi seçeneği alacağınız seçimi, yalnızca en iyi yargıç olabileceğiniz çeşitli faktörlere bağlıdır:
1: İstemci eylem grubunu doğurur ve bunları doğrudan ekler ve ardından sunucuya gönderir. Sunucu herhangi bir kontrol yapmadan kabul eder
* Bu yaklaşımın faydaları, müşteri açısından, kendi eylemlerinin ağ gecikmesinden bağımsız olarak anında bir geri bildirim vermesidir. Dezavantajı, istemcinin iletilerinin sunucu tarafından gerçek olarak kabul edilmesidir (olmayabilir) *
2: İstemci, sunucuya bir istek gönderir; bu da isteği, isteği oluşturan istemci de dahil olmak üzere herkese yayınlar.
Bu yaklaşımın faydaları, sunucunun artık yasa dışı etkinlikle ilgili çoğu sorunu hafifleten oyunda gerçekleşen her şeyin kontrolünde olmasıdır (burada yasadışı, istemcinin bir duvarı kırpmasından, artık yasadışı olan bir hamleyi gerçekleştirmeye kadar değişebilir. belirli bir hamle yaptığında müşterinin sahip olmadığı daha fazla bilgi)
3: İstemci eylem grubunu oluşturur, doğrudan ekler ve ardından sunucuya gönderir. Sunucu isteği işler, yasadışı olmadıklarından emin olmak için eylemler üzerinde kendi denetimlerini yapar ve ardından hamleyi müşteri de dahil olmak üzere tüm oyunculara yayınlar.
Bu, 1 ve 2'nin en iyisini, biraz daha fazla bant genişliği gereksinimi pahasına alır. Faydaları, kendi hamleleri için istemciye anında geri bildirimdir ve istemcinin yaptığı hamleler yasa dışı ise, sunucu uygun eylemleri gerçekleştirir (istemciyi zorla düzeltir).
Paket kayıpları ve benzerleri ne olacak? Oyun belirleyicidir, ancak bir istemcide gerçekleştirilen eylemler dizisindeki herhangi bir tutarsızlığın dünyanın tutarsız durumlarına yol açabileceğini düşünüyorum. Bu tür bir soruna karşı nasıl korunurum?
Paket kaybı ve aşırı gecikme, düzeltilmesi zor bir sorundur . Oyunun türüne (örneğin ölü hesaplaşma) bağlı olarak problemle başa çıkmak için farklı çözümler (hiçbiri mükemmel değildir) kullanılır. Oyunun fizik senkronize etmek zorunda olmadığını varsayacağım.
Yapmanız gereken ilk şeylerden biri, tüm hareketlerinizi zaman damgası yapmaktır. Sisteminiz daha sonra bunları dikkate almalı ve hareketleri uygun şekilde oynamalıdır (belki de sunucu bu sorumluluğa sahiptir ve daha sonra yasadışı hareketleri reddetmelidir). Bu sistemi uygularken 0 gecikme olduğunu varsayın (yerel olarak test edin).
0 gecikme elbette, yerel ağlarda bile iyi bir varsayım değildir, bu yüzden şimdi tüm hareketler zamana saygı duyuyor, hangi saate güveniyorsunuz? Zaman senkronizasyonu konusu devreye giriyor. Çevrimiçi birçok makale / makale bu sorunu çözmenizde size rehberlik edecektir.
Aynı anda çok fazla eylem eklersem, bu bağlantı için sorunlara neden olmaz mı? Bunu hafifletmenin bir yolu var mý?
İlk önce bariz şeyler. Asla dizeleri veya serileştirilmiş nesneleri göndermeyin. Oyunun kendisi güncellendiği kadar hızlı mesaj göndermeyin. Bunları parçalar halinde gönderin (örneğin saniyede 10 kez). Sunucu / istemcinin hataları arada bir düzeltmesi gereken bir hata (özellikle yuvarlama hatası) olacaktır (bu nedenle her saniye sunucu her şeyi [her şey = oyununuzdaki şeyleri doğru tutmak için önemli olan tüm veriler gönderir) durum] müşterinin durumunu düzeltmek için takıldığı ve / veya dikkate aldığı).DÜZENLEME: Meslektaşlarımdan biri UDP (eğer yapmanız gereken, çok fazla veri varsa) kullanıyorsanız ağ siparişi olmadığını söyledi. Saniyede 10'dan fazla paket göndermek, paketlerin sıra dışı gelen değişikliklerini artırır. Bu iddiaya atıf yapıp yapamayacağımı göreceğim. Bozuk paketlerin kendilerine gelince, bunları atabilir veya mevcut durumu düzeltmek için geçmişteki değişiklikleri işlemek üzere tasarlanmış olan sisteminizin ileti / taşıma sırasına ekleyebilirsiniz.
Çok az yer kaplayan bir şeye dayanan bir mesajlaşma sisteminiz olmalıdır. Yalnızca iki değeri olan bir şey göndermeniz gerekiyorsa, yalnızca bir bit gönderin. Yalnızca 256 hamle yapabileceğinizi biliyorsanız, imzasız bir karakter gönderin. Mesajları mümkün olduğunca sıkı bir şekilde paketlemek için çeşitli bit döndürme hileleri vardır.
Mesajlaşma sisteminiz büyük olasılıkla gelen bir mesajdan hareketleri kolayca çıkarmanızı sağlamak için çok sayıda numara kullanacaktır (burada ne demek istediğimi anlamadıysanız RakNet'e ve buradaki örneklere göz atmanızı öneririm).
Ben zaten sen olamayacağını biliyoruz eminim düzeltmek yüksekliği gecikme ve paket kaybı ile ortaya çıkan sorunlar ama onun etkileri daha az belirgin yapabilirsiniz. İyi şanslar!
EDIT: Patrick Hughes yukarıdaki bağlantı ile yorum bu cevabı eksik ve en iyi OP sorusuna özgü hale getirir. Bağlantılı konuları okumanızı şiddetle tavsiye ederim