Oyun teknolojilerini yakından incelemeye başlıyoruz.
O nedenle, oyunlara sadece “tüketici” olarak değil, geleceğin “potansiyel üreticileri” perspektifinden de bakmaya çalışarak, değer taşıyan içerikler üretmek ve paylaşmak istiyoruz. Bu bakış açısıyla, rekabetçi oyunların teknik altyapısına daha yakından bakıyoruz. AAA bir stüdyonun üretim standartlarında, rekabetçi bir oyun için en önemli ve zorlu görevlerden biri olan “Ölçeklenebilirlik (Scalability)” meselesini gündeme getirmek istedik. Gelin, soru cevap formatında, merak ettiklerinizi bir bir yanıtlayalım.
Ölçeklenebilirlik (Scalability) Nedir?
Bir oyunun aktif oyuncu sayısı veya kısaca “oyuncu veri tabanı” büyüdükçe, oyunun doğru çalışmaya devam etmesine; yani hem oyuncu hem de geliştirici perspektifinden, oyunun beklendiği biçimde ve kararlı şekilde davranmasına “ölçeklenebilirlik” denir. Büyük stüdyoların geliştirdiği rekabetçi oyunların ekiplerinde, “ölçeklenebilirlik” ve “test yükü” başlıklarından sorumlu gruplar vardır; bunlar oyunun ölçeklenebilir olmasını temin etmekle görevlidir; ayrıca sorunları hızlı bir şekilde tespit etmek ve düzeltmek için gereken süre boyunca “takip yapmaktan” da sorumludur.
Dev bir oyuncu veri tabanına ulaşması beklenen rekabetçi oyunlar geliştirilirken, ilk günden itibaren bu beklentiye göre planlama yapılır. Geliştirmenin her aşamasında “yük testi” adı verilen, simülasyon ve senaryolar gerçekleştirilir. Örneğin, daha beta aşamasına bile çıkmamış bir oyun için, aynı anda 2 milyon oyuncunun dünyanın farklı bölgelerinden bir servera bağlandığı test senaryoları oluşturulur ve oyunun, istemcinin ve serverın bu senaryoya nasıl tepki verdiği ölçülür; sonuçlara göre gerekli iyileştirmeler yapılır.
Rekabetçi Oyunların Nasıl Bir Altyapısı Var?
Her oyunun farklı bir altyapısı vardır. Fakat modern prensiplere göre, milyonlarca oyuncunun benzer şartlarda rekabet edebilmesi için, yapı genellikle iki ayağa ayrılır:
A) İşletilebilir Oyun Sunucusu
B) Platform
Oyun sunucusunun temel fonksiyonu, oyunun tüm fizik kuralları, envanteri ve malzemeleri ile çalıştırılması ve gerçekleşen karşılaşmaların her bir karede doğru ve kararlı şekilde işlemesini sağlamaktır. Pek çok modern oyun, oynanan her maçı, ayrı bir “sunucu” mantığıyla işleterek, aynı anda milyonlarca tekil sunucunun aynı anda ve doğru şekilde çalıştırılabilmesi prensibini temel alır. Bu dev operasyonun, yüksek hesaplama gereksinimlerinin optimize edilebilmesi için, elbette pek çok farklı unsur devreye girer; fakat temel olarak, bir CPU çekirdeği başına en fazla maçı “işletebilen” oyun optimizasyonunu sağlamak amaçlanmaktadır.
Platformlar ise, oyunların farklı “hizmetlerini”, mikro yapılar halinde ele alan ve düzenleyen ana unsurdur. Örneğin;
- Seviyeye göre oyuncu eşleştirme
- Ekipman ve özellik seçimleri
- Karakter seçimi
- Ping’e dayalı olarak veri merkezleriyle eşleşmeleri sağlama
- Oyun bittiğinde, oyun sonuçlarının işlenmesi ve saklanması
- Oyun sonucunda elde edilen kazanımların hesaplanması ve profile işlenmesi
- Mağaza satın alımları gibi…
Bu platform hizmetleri, oyun serverları üzerinde bir araya gelerek bütünleşik bir yapıyı, yani kısaca “oyunun kendisini” oluşturur.
Platformlar Nasıl Çalışır?
Her biri kendi işlevsel görevlerini üstlenen bu “mikro platformlar”, yalnızca kendi özellikleri üzerine çalışan “kapsül programlar” olarak düşünülebilir. Örneğin “kişiselleştirme” platformu, sadece oyuncuların hâlihazırda sahip olduğu silah görünümlerini, spreyleri ve konfigürasyonlarını kaydeder ve yönetir.
Bazı özellikler, birbirleriyle iletişim kurmak için birkaç mikro hizmetin daha çalışmasını gerektirebilir.
Örnek:
“SEVİYE DERECELENDİRME PLATFORMU VE EŞLEŞTİRME PLATFORMU BİRBİRİNDEN BİLGİ İSTİYOR.”
Bir grup oyucu, genellikle “ranked” olarak bildiğimiz, dereceli bir oyun oynamak için sıraya girdiğinde, “eşleştirme platformu devreye girer” ve önce “seviye derecelendirme platformundan” bu partideki oyuncular hakkında bilgi ister:
“Bu partideki oyuncular, rekabetçi bir maç oynamak için izin verilen sıra dağılımı içinde mi?”
Eğer öyleyse, eşleştirme platformuna veri aktararak, bu partiyi rekabet kuyruğuna eklemesini isteyecektir.
Eskiden, yani MOBA olarak bildiğimiz rekabetçi oyunların ilk dönemlerinde, “oyun”; her şeyi tek yerde ve aynı anda yapmaya çalışan dev ve yekpare bir sistemdi. Pek çok geliştirici, MOBA klonlarını tasarlarken bu mantığı kullanıyordu. Bu nedenle, pek çok oyunda bir servis çöktüğünde, oyunun neredeyse tamamı bundan etkileniyor ve milyonlarca oyuncu, kendileri / bölgeleri ile hiç ilgisi olmayan bir hatadan ötürü oyunu oynamaktan mahrum kalıyordu. “Monolitik mimari” denen bu yöntem, geliştirme açısından çok daha hızlı ve basit bir yöntemdi; ama oyun büyüdükçe, katlanılması ve yönetilmesi imkânsız bir bedelle birlikte geliyordu.
Monolitik mimarilerde alt sistemleri bağımsız platformlar olarak ölçeklendirmek için yeterli esneklik yoktur. Alt sistemler, ana yapıdan bağımsız platformlar olarak oluşturulamaz, test edilemez ve dağıtılamaz. O dönemde Riot Games gibi dev oyun şirketlerinin, League of Legends’ın ilk dönemlerinde edindiği benzersiz tecrübeler, “bağımsız platform” yapısının gerekliliğini ortaya koyarak, oyun geliştiricilerin “mikro platformlar” modelini benimsemesini sağladı. Bugün monolitik bir mimariyi tercih eden bazı Battle Royale oyunlarla, VALORANT gibi esnek ve parçalı bir mimariye sahip oyunlar arasındaki teknik farkı, oyuncu olarak dahi çok açık şekilde görebiliyoruz.
Oyunların Doğru Çalışıp Çalışmadığı Nasıl Test Edilir?
Oyuncuların ve oyunun doğal gereksinimleri gereği, bazı mikro hizmetler daha çok çalıştırılır ve yükü dağıtmak için diğerlerinden daha fazla sayıda istek gerektirir. Örneğin, oyuncuların birlikte oynamasını sağlayan “parti oluşturma” hizmeti, çok sayıda farklı senaryo yaşandığı için, pek çok durumda mağaza ilgili hizmetten daha fazla kullanılır.
Bu hizmetlerin doğru şekilde çalıştığının test edilebilmesi için, karmaşık senaryolar oluşturulur ve “test yükü” denen veri akışlarıyla, kapsamlı testler yürütülür. Oyuncuların eylemleri, hizmetler arasında karmaşık çağrı zincirleri gerektirebileceğinden, her bir hizmeti, tek başına test etmek, platformun bir bütün olarak çeşitli oyuncu isteklerinin oluşturduğu yükün üstesinden gelebileceğini kanıtlamak için yeterli değildir. Platformun gerçek oyuncuların yükünü kaldırabileceğinden emin olmanın tek yolu, onu gerçek oyuncu istekleriyle bütünsel olarak test etmektir.
Milyonlarca oyuncunun katıldığı beta testleri, geliştiriciler için maliyetli olduğu için, günümüzde bu süreçler yoğun olarak “test simülasyonları” aracılığıyla yürütülüyor; yani gerçek oyuncuların davranışlarını taklit eden sanal oyuncuların eylem ve verileriyle.
Bu konuya ilgi duyan okuyucularımız için, bir sonraki yazımızda şu soruları yanıtlayacağız:
- Yük Testleri Nasıl Yapılır?
- Testlerden Elde Edilen Sonuçlarla Geliştirme Nasıl Sürdürülür?
- Sanal Oyuncuların Davranışları, Sanal Server’lar Üzerinde Nasıl Test Edilir?
- Oyunların Doğru Çalıştığından ve Doğru Ölçeklendirme Yapıldığından Nasıl Emin Olunur?
- Rekabetçi Oyunlarında Veri Tabanı Nasıl Ölçeklendirilir?