Networking Mimarileri
Temelde iki veya daha fazla oyuncu, makineler arasında iletişim kurmak için birbirine bağlanır. İletişim derken, makineler arasında ileri geri mesaj göndermek gibi veri alışverişini kastediyorum veya makinelerden biri yalnızca verileri gönderirken diğeri yalnızca onu alır.
Bizim amacımız ise oyuncuların verilerini oyundaki tüm oyuncular arasında paylaşmanın ve ardından her oyuncuyu diğer oyuncularla ilgili güncellemeye devam etmenin bir yolunu bulmaktır. Bunu başarmak için yaygın olarak kullanılan birkaç farklı teknik vardır, ancak en yaygın iki yaklaşım peer-to-peer ve client-server mimarileridir. Her iki teknik de avantajlar ve dezavantajlar dahil olmak üzere farklı fırsatlar sunar. Genel olarak, ikisi de birbirinden daha iyi değildir, ancak farklı durumlar ve kullanım durumları, biri veya diğeri için daha uygun olabilir.
Peer-to-peer networking
İsmi her ne kadar yalnızca iki eşin (“nodes”) dahil olduğu bir mimariyi ima etse de, aslında eşler arası bir ağ sistemi, iki veya daha fazla node’un, bağlantıyı veya bilgi alışverişini düzenleyen merkezi bir sistem olmadan doğrudan birbirine bağlandığı sistemdir.
Tipik bir p2p’da, her bir eş, diğerleriyle aynı işlevi görür; yani, hepsi aynı verileri kullanır ve ürettikleri verileri paylaşarak başkalarının senkronize kalmasını sağlar. P2p bir oyun söz konusu olduğunda, bu mimariyi basit bir Tic-tac-toe oyunuyla örneklendirebiliriz.
Her iki oyuncu da aralarında bir bağlantı kurduktan sonra, oyunu başlatan kişi oyun tahtasında bir hücreyi işaretleyerek bir hamle yapar. Bu bilgi, artık rakibi tarafından verilen kararın farkında olan ve böylece kendi oyun dünyasını güncelleyebilen diğer oyuncuya kablo üzerinden iletilir. İkinci oyuncu, ilk oyuncunun yaptığı hamlenin sonunda oluşan tahta bilgisini aldığında kendi hamlesini yapabilir. Ardından ikinci oyuncunun hamlesi ile güncellenen tahta bilgisi ilk oyuncuya gönderilir. Süreç, eşlerden birinin bağlantısı kesilene veya oyun sona erene kadar devam eder.
P2p ağa bağlı oyunların bazı avantajları aşağıdaki gibidir:
Hızlı veri aktarımı: Burada veriler doğrudan hedefe gider. Diğer mimarilerde, veriler önce bazı merkezi düğüme gidebilir, ardından merkezi düğüm (veya server) diğer eşle iletişime geçerek gerekli güncellemeleri gönderebilir.
Daha basit kurulum: Oyununuzun, genellikle kendi girdisi (input) yöneten, girdisini diğer bağlı eşlere gönderen ve çıktılarını (output) kendi sistemi için girdi olarak işleyen bir oyun olduğunu varsayalım. Bu, özellikle sıra tabanlı oyunlarda, örneğin Tic-tac-toe gibi çoğu tahta oyununda kullanışlı olabilir.
Daha fazla güvenilirlik: Burada, genellikle çevrimdışı olan bir eş, diğer eşlerin hiçbirini etkilemeyecektir. Bununla birlikte, iki oyunculu bir oyunun basit durumunda, oyunculardan biri oyuna devam edemezse, oyun büyük olasılıkla oynanabilir olmayacaktır. Yine de, söz konusu oyunun düzinelerce veya yüzlerce bağlantılı eşe sahip olduğunu hayal edin. Birkaçı internet bağlantısını aniden kaybederse, diğerleri oynamaya devam edebilir. Ayrıca, tüm düğümleri birbirine bağlayan bir server varsa ve server kapanırsa, diğer oyunculardan hiçbiri birbiriyle nasıl iletişim kuracağını bilemez.
Öte yandan, p2p mimarinin daha belirgin dezavantajlarından bazıları aşağıdaki gibidir:
Gelen verilere güvenilemez: Burada, gönderenin veriyi değiştirip değiştirmediğini kesin olarak bilemezsiniz. Bir server’a girilen veriler için de aynı sorun geçerlidir, ancak veriler doğrulandıktan sonra diğer tüm eşlere yayınlanır ise, bu açık giderilir.
Hataya tolerans çok düşük olabilir: Yeterli sayıda oyuncu oyun dünyasını paylaşırsa, bir veya daha fazla kilitlenme, oyunu diğer oyuncular için oynanamaz hale getirmez. Şimdi aniden oyundan çıkan herhangi bir oyuncunun geri kalan oyuncuları olumsuz etkilediği birçok durumu göz önüne alırsak, bir server’ın çökmeden nasıl kolayca kurtulabileceğini anlarız.
Diğer eşlere yayın yaparken veri çoğaltma: Oyununuzun basit bir 2D side scroller olduğunu ve diğer birçok oyuncunun bu oyun dünyasını sizinle paylaştığını hayal edin. Oyunculardan biri sağa her hareket ettiğinde, o oyuncudan yeni (x, y) koordinatlarını alırsınız ve kendi oyun dünyanızı güncelleyebilirsiniz. Şimdi, oyuncunuzu birkaç piksel sağa hareket ettirdiğinizi hayal edin; bu verileri sistemdeki diğer tüm düğümlere(oyunculara) göndermeniz gerekir.
Genel olarak, p2p çok güçlü bir ağ mimarisidir ve hala sektördeki birçok oyun tarafından yaygın olarak kullanılmaktadır.
Client-server networking
P2p networking’e çok benzer. Aralarındaki en bariz fark ise, her düğüm(node) eşit olması yerine nodelardan birinin özel olmasıdır. Yani, her node (client) server adı verilen bir ana merkezi düğüme bağlanır.
P2p ağı, bir partide sohbet eden bir grup arkadaş olarak düşünebilirsiniz. Hepsi sohbete dahil olan diğer tüm arkadaşlara erişebilir ve onlarla doğrudan konuşabilirler. Öte yandan, bir client- server ağı, bir restoranda akşam yemeği yiyen bir grup arkadaş olarak görülebilir. Restoranın bir müşterisi (client) menüden belirli bir ürünü sipariş etmek isterse, o grupta istenen ürünlere erişimi olan ve ürünleri servis yapabilen tek kişi olan garsonla (server) konuşmalıdır.
Kısacası, server bir veya daha fazla cliente veri ve hizmet sağlamaktan sorumludur. Oyun geliştirmede en yaygın senaryo, iki veya daha fazla clientin aynı servera bağlanmasıdır; server oyunun yanı sıra oyuncuları da takip edecektir. Bu nedenle, iki oyuncu yalnızca aralarında bilgi alışverişinde bulunacaksa, iletişim ilk oyuncudan servera ve serverdan ikinci oyuncuya gider ve sona erer.
P2p bölümünde incelediğimiz bir Tic-tac-toe oyununa dahil olan iki oyuncunun örneğini takip ederek, bir client-server modelinde de olay akışının ne kadar benzer olduğunu görebiliriz. Yine temel fark, oyuncuların birbirlerinden habersiz olmaları ve yalnızca sunucunun onlara ne söylediğini bilmeleridir.
Yalnızca iki oyuncuyu birbirine bağlamak için bir server kullanarak p2p modeli çok kolay bir şekilde taklit edebilirsiniz, ancak çoğu zaman server p2p dan çok daha aktif bir şekilde kullanılır. Ağa bağlı bir oyunda servera bağlanmanın iki yolu vardır: yetkili(authoritative) ve yetkili olmayan(non-authoritative). Diğer bir deyişle, oyunun mantığını kesinlikle serverda uygulayabilirsiniz veya clientlerin oyun mantığını, giriş doğrulamasını vb. işlemesini sağlayabilirsiniz. Günümüzde, client-server mimarisini kullanan çoğu oyun aslında ikisinin(yetkili ve yetkili olmayan sunucular) bir karışımını kullanıyor. Bununla birlikte sunucunun amacı, her bir clientden girdi almak ve bu girdiyi bağlı clientler havuzuna dağıtmaktır.
Bir client-server oyunundaki zorluklardan biri, yığının her iki ucunu da(client server) programlamanız gerekeceği olduğunu fark edeceksiniz. Clientleriniz kullanıcıdan girdi almaktan, servera iletmekten ve serverdan aldıkları her türlü veriyi işlemekten başka bir şey yapmasalar bile bunu yapmanız gerekecektir; oyun serverınız her clientden aldığı girdiyi diğer clientlere iletmekten başka bir şey yapmasa bile, yine de bir oyun clienti ve bir oyun servera yazmanız gerekir. Bu ağ modelini p2pdan ayıran şeyin budur.
Client-Server networking oyunların bazı faydaları şunlardır:
Endişelerin parçalara ayrılması: Hedefimiz iyi, bakımı yapılabilir yazılımdır. Her bir parçanın bir “şey” yaptığı ve iyi yapıldığı ayrı bileşenler olduğunu düşünelim. Ayrı ayrı özel bileşenler yazmak (clienti ayrı, serverı ayrı düşünmek), her seferinde tek bir görevi gerçekleştirmeye odaklanmanızı sağlayarak oyununuzu tasarlamayı, kodlamayı, test etmeyi ve sürdürmeyi kolaylaştırır.
Merkezileştirme: Bu, lehine olduğu kadar aleyhine de olan bir avantajdır. Tüm iletişimi tek bir merkezden sağlamak, iletişimi yönetmeyi, gerekli kuralları uygulamayı, erişimi kontrol etmeyi vb. kolaylaştırır.
Client için daha az iş: Kullanıcıdan ve diğer eşlerden girdi almaktan, tüm girdileri doğrulamaktan, diğer eşler arasında veri paylaşmaktan, oyunu oluşturmaktan vb. sorumlu bir cliente(eş) sahip olmak yerine client, yalnızca bunlardan birkaçını yapmaya odaklanır ve serverın bu işin bir kısmını yapmasına izin verir. Bu, özellikle mobil oyunlardan ve iş parçacıklarının genel oyuncu deneyimini ne kadar etkileyebileceğinden bahsettiğimizde anlaşılır. Örneğin, aynı oyun dünyasında 10 oyuncunun yer aldığı bir oyun hayal edin. P2p bir kurulumda, bir oyuncu her eylemde bulunduğunda, bu eylemi diğer dokuz oyuncuya göndermesi gerekir (başka bir deyişle, daha fazla mobil veriye indirgenen dokuz ağ çağrısı olması gerekirdi). Öte yandan, bir client-server ağda, bir oyuncunun eylemini yalnızca eşlerinden birine, yani daha sonra bu verileri kalan dokuz oyuncuya göndermekle sorumlu olacak servera göndermesi gerekir.
Sunucu yetkili olsun veya olmasın, client-server mimarilerinin ortak dezavantajları aşağıdaki gibidir:
İletişimin yayılması daha uzun sürer: Akla gelebilecek en iyi senaryoda, ilk oyuncudan ikinci oyuncuya gönderilen her mesajın iletilmesi, p2p bağlantıya kıyasla iki kat daha uzun sürer. Yani, mesaj önce ilk oyuncudan servera ve sonra serverdan ikinci oyuncuya gönderilir. Bu senaryoda karşılaşılan gecikme sorununu çözmek için bugün kullanılan birçok teknik vardır.(Daha sonra incelenecek.)
Daha hareketli parçalar nedeniyle daha fazla karmaşıklık: Ne kadar çok kod yazmanız gerekiyorsa (bir oyun için iki ayrı modül oluşturduğunuzda, daha fazla kod yazarsınız), modelinizin o kadar büyük olması gerekir. Kodunuz çoğu client ve server arasında yeniden kullanılabilir olsa da (özellikle OOP gibi programlama tekniklerini kullanıyorsanız), günün sonunda daha yüksek bir karmaşıklık düzeyini yönetmeniz gerekir.
Tek hata noktası ve ağ tıkanıklığı: Şimdiye kadar çoğunlukla aynı oyuna sadece bir avuç oyuncunun katıldığı durumu tartıştık. Bununla birlikte, daha yaygın olan durum, bir avuç oyuncu grubunun aynı anda farklı oyunlar oynamasıdır.
İki oyunculu Tic-tac-toe oyununun aynı örneğini kullanarak, tekli oyunlarda binlerce oyuncunun yüz yüze olduğunu hayal edin. P2p bir ağda, birkaç oyuncu doğrudan eşleştiğinde, bu oyundan zevk alan başka bir oyuncu yokmuş gibi olur. Bu iki oyuncunun oyunlarına devam etmesini engelleyen tek şey, birbirleriyle olan bağlantısıdır.
Öte yandan, aynı binlerce oyuncu, aralarında bir server aracılığıyla birbirine bağlanırsa ve aralarında mesajlaşırsa, mesajlar arasında ciddi gecikmeler fark edebilir çünkü server, diğer tüm oyunculardan gelen ve diğer tüm mesajları işlemekle çok meşguldür. Daha da kötüsü, bu iki oyuncunun server aracılığıyla birbirleriyle bağlantılarını sürdürme konusunda endişelenmeleri gerekiyor, aynı zamanda serverın kendileriyle rakipleri arasındaki bağlantısının aktif kalacağını umuyorlar.
Sonuç olarak, client-server ağında karşılaşılan zorlukların çoğu iyi anlaşılmıştır ve çok oyunculu oyun geliştirmeniz sırasında karşılaşmanız muhtemel sorunların çoğu zaten başka biri tarafından (Mirror, Photon, MLAPI vs.) çözülmüş olacaktır.
Kaynakça: Multiplayer Game Development with HTML5 By Rodrigo Silveira