Diğer cevaplarda yer alan makaleye ek olarak, Arianne Projesi'nin deneyiminden biraz bahsedebilirim .
Eşitleme nasıl yapılır?
Eylem ve algı kavramı etrafında bir “„ Marauroa “ çerçevesi oluşturduk: Müşterilerden kullanıcı girişi yapan sunucuya gönderilir (sola doğru yürü, canavarlara saldır # 47, 'merhaba'). Ve algılayıcılar sunucudan istemcilere, etraflarındaki dünyanın durumunu anlatan müşterilere gönderilir. Bu algılamalar her dönüşe gönderilir. Oyuna bağlı olarak 30ms'den 300ms'ye kadar dönüş süreleri kullanıyoruz.
İki tür algılamaya sahibiz : Giriş sırasında ve oyuncu yeni bir alana (bölge) girdiğinde tam bir algı gönderilir. Bundan sonra, sadece değiştirilmiş nesnelerin değiştirilmiş özniteliklerini (örneğin konumu) ve elbette yeni ve kaldırılmış nesneleri içeren farklı algılar gönderilir.
Gecikme problemleri etrafında nasıl çalışılır?
“Sunucu her zaman haklıdır” inancına büyük önem veriyoruz. Müşteri düzgün yürüme, çarpışma kontrolleri vb. Gibi bazı öngörülerde bulunur. Ancak bir müşteri ve sunucu bir konuda anlaşamazlarsa, sunucu kazanır. Alt proje Stendhal (2B RPG), varsayılan olarak 300ms'lik bir dönüş süresi kullanır (çok fazla düzeltme işlemi yapılmış istemci tarafında). Bu Stendhal'ı gecikmeye karşı çok dirençli kılar.
Not: Diğer bazı oyunlar, ağ gecikmesinin etkisini en aza indirgemek için müşterinin bir kısmına kadar uzanmasına güvenir. WoW'da genellikle “Warsong Gulch” adlı savaş alanlarından birinde istismar edildi. Bayraklı bir oyuncunun seçebileceği iki yol vardır: Ortada bir tünelden geçerken ve diğeri de tepeden yukarı çıkarken. Bu yüzden hile yapan bir oyuncu tünele doğru koşar ve sonra kendisi için gecikmeye neden olur. Sunucu ve diğer müşteriler ona doğru çalıştığını görmeye devam edecek. Ancak, bir süre sonra bu müşteri sunucuya tepeye doğru gittiğini söyleyebilir. WoW, iletilen son koordinatlar ile mevcut olanlar arasındaki mesafenin zaman dilimine uyduğunu kontrol eder ve bunu kabul eder.
TCP ve UDP Kullanımı
İlk sürümlerde, TCP ek yükünü azaltmak için UDP kullandık. Kayıp paketleri kendi başımıza ele aldık. Bu projenin ilk günlerinde mükemmel çalıştı. Ancak sunucu birkaç yıl önce bazı ev DSL bağlantılarından gerçek bir veri merkezine taşındığında, çok büyük sorunlarımız oldu. UDP, (veya en az 5 yıl önce), güvenlik duvarı donanımının CPU gücünden aşırı derecede talep görüyor: Kural, her bir UDP paketine uygulanmalıdır. Ancak, TCP için kural sadece ilk 3 paket için uygulanır. Bundan sonra bağlantı kurulur. Aşağıdaki tüm paketler, bağlantı izleme tablosunda oldukları veya SYN bayrağı bulunmadıkları için normal kural kümesini atlayacaktır.
İletişimi ve müşteriyi tersine mühendislikten nasıl koruyabilirim?
Arianne tamamen açık bir kaynaktır, buna müşteri, sunucu, grafik, müzik de dahildir. Ve tabii ki protokol dokümantasyonumuzu ve hatta hata ayıklama için kullanılan bir analizörü de içeriyor .
İletişimi, üçüncü taraflarca SSL kullanarak yetkisiz koklamalara karşı korumak kolaydır.
Bununla birlikte, tersine mühendislikten korumak mümkün değildir. Bunu karıştırdığınızdan ve hata ayıklama önleme teknikleri kullandığınızdan emin olun. Ancak sonunda, kullanıcılara verdiğiniz yazılımın tersine mühendislik edilmesini önleyemezsiniz. Geliştiricilerin hata ayıklama tekniklerine çok çaba sarf etmesine rağmen, Skype'ın nasıl tersine çevrildiğine dair ilginç bir sunum var: http://recon.cx/en/f/vskype-part1.pdf
Not: Tersine mühendisliğin yasa dışı olduğu veya lisansa veya Paragraf'a tersine mühendislikten izin vermeyen bir paragraf koymasına izin veren bazı ülkeler vardır. Ancak, uyumlu veri depolama formatları veya aktarım protokolleri, lisanstaki paragraflar veya geçersiz olanlara izin vermeye çalışan ToS paragrafları veya bağlamında geliştirme bağlamında açıkça tersine mühendislik sağlayan diğer ülkeler (içinde yaşadığım gibi) vardır. (Bu bölümdeki her şey bildiğim kadarıyla ben avukat değilim)
Hangi şeyler yerel olarak hesaplanmalı ve sunucuda hangi şeyler bulunmalıdır?
Sunucudaki oyun mantığı ile ilgili her şeyi hesaplıyoruz. Müşteri, oyunun sorunsuz bir şekilde oynanabilmesi için bazı olayları önceden tahmin edecektir. Ancak sonunda sunucu her zaman haklıdır.
Öngörülen olaylar, örneğin bir çarpışma gerçekleştiğinde hareketi durdurmak içindir. Stendhal, elemanları konumlandırmak için bir ızgara kullanır. Ve sunucu bakış açısından, her varlığın sol üst köşesi tam olarak bir karedir. Ancak müşteri bunları döşemeler arasında rahatça hareket ettirir. Ayrıca sözde 3d efekti çizecek. Dolayısıyla, müşteride 1x1 tabanı olan bir varlık daha yüksek olabilir.
Yük sorunları nasıl dengelenir?
Bakımı kolaylaştırmak için bunu olabildiğince basit tutmaya çalışın.
Statik içeriğin yük dengelemesi, http sunucu kümeleri ve içerik dağıtım ağları alanında iyi bilinmektedir.
Oyun hizmetlerinin yük dengelemesi için oldukça basit bir kavram, sunucuları bölgelere / bölgelere bölmektir. Öyleyse AC bölgesi bir sunucuda ve DF bölgesi başka bir yerdedir. Bu, özellikle bir kümedeki bölgelerden başka bir kümedeki bölgelere bakamıyorsanız kolaydır. Bir müşterinin yalnızca oynatıcının bulunduğu bölgeden sorumlu bir bölge sunucusuna bağlanabilmesi için bazı denetimler koymanız gerekir.
Oyuncuları bir sunucudan diğerine transfer etmenin en kolay yolu, onları veritabanına yazmak, müşteriye diğer bölge sunucusuna bağlanmasını ve geçerli olandan bağlantısını kesmektir. İstemci daha sonra veritabanından yükleyeceği yeni bölge sunucusuna bağlanacaktır. (Zaten / store'dan veritabanı koduna kadar yüke ihtiyacınız olduğundan, aktarma sunucuları arasında doğrudan iletişim daha sonra gerçekleştirilebilir).
Bazı ek küresel hizmetlere aşağıdakiler aracılığıyla ihtiyaç duyulur: Oturum açıldığında istemcilere doğru bölge sunucusuna bağlanmaları söylenmelidir. Ve dünya çapında bir sohbet sistemi isteyebilirsiniz.
Bu konuda MMO'larda yük dengelemesi nasıl sağlanır?