2XKO Çevrimiçi Oyunları Nasıl Ele Alıyor?

Çevrimiçi oyunları çevrimdışı oyunlar kadar adil, hızlı ve keyifli kılmak için başvurduğumuz yollar.

Selam millet! Ben Tony Cannon, 2XKO'nun kıdemli yazılım mühendisi lideriyim. Bu yazıda mümkün olan en iyi çevrimiçi oyun deneyimini sunabilmek adına yaptıklarımızı göstermek için sizi oyunun perde arkasına davet ediyoruz.

Çok fazla teknik detaya gireceğimiz için isteyenler bu özete göz atabilir:

  • Oyunları olabildiğince güvenli ve gecikmesiz kılmayı önemsiyoruz. Bu amacımıza ulaşabilmek için istemci-sunucu mimarisi, gerileme (rollback) ağ kodu ve Fair Play modu ismini verdiğimiz bir sistem dahil olmak üzere birçok farklı sistemden yararlanıyoruz.
  • Hile korumasını ciddiye alıyoruz. Rakiplerinizin hile yapmayan gerçek insanlar olduğundan emin olmamıza yardımcı olan Riot Vanguard'dan faydalanıyoruz.
  • Oyun dışı sistemlerimizi çalıştırmak için birçok yeni araçtan faydalanıyoruz.
    • Oyun Doğrulama Sunucusu ismini verdiğimiz bir sistem sayesinde her oyunun bir kopyasını bulutta yürütüyoruz. Bu da hile koruma, beceri derecesi ve izleme sistemlerimizi pekiştiriyor.
    • Eşleştirme artık lobiler arasında oyun arayabiliyor. Yani lobiniz kalabalık olmasa bile hızlıca rakip bulabileceksiniz.

Pekâlâ. Hadi başlayalım.

Önceliğimiz Çevrimiçi Oynanış

2XKO'nun geliştirme aşamasının en başından beri çevrimiçi karşılaşmalara çok önem verdik. Kurduğumuz teknolojinin temelini oluştururken önceliğimiz GGPO'dan faydalanıp tüm oynanış testlerini çevrimiçi gerçekleştirmekti. Bu esnada oyun her ne kadar kullanıcıdan kullanıcıya çalışsa da Riot'un Las Vegas veri merkezinde inşa edip kullandığımız paket proxy sayesinde tüm günlük oynanış testleri gerçek internette çalışıyordu. Tasarım aşamasında bunu halletmemiz çok önemliydi. Çevrimiçi oyunların da çevrimdışı oyunlar kadar iyi hissettirdiğinden emin olmak için karakterlerin hareketlerini, saldırılarını, animasyonlarını ve efektlerini öncelikle çevrimiçi için inşa edip test ettik.

İstemci-Sunucu Mimarisi

Dört oyunculu karşılaşmaları mümkün kılıp performanstaki tutarlılığı ve ölçeklenebilirliği sağlamak için geliştirme sürecinin ilerleyen noktalarında kullanıcıdan kullanıcıya çalışan yapımızı istemci-sunucu mimarisine taşıdık. Dört kişilik bir oyunda her oyuncu, kullanıcıdan kullanıcıya topolojiye kıyasla istemci-sunucuda gönderdikleri ve aldıkları veri miktarının üçte birini gönderiyorlar ve alıyorlar. Bu da bant genişliği gereksinimleriyle paket kaybı ihtimalini azaltıyor ve çok iyi olmayan bağlantılarda bile daha sorunsuz bir performans sağlıyor. İstemci-sunucu mimarisini kullanmamızın daha birçok sebebi var.

Güvenlik ve IP Koruması

İstemci-sunucu mimarisini kullanarak her şeyden önce IP adresinizi oyundaki diğer oyuncularla paylaşmamış oluyoruz. Bu durum kullanıcıdan kullanıcıya yapının en büyük tehlikelerinden biriydi. Bu yapıda sırf başka bir oyuncuya karşı oynamak bile o oyuncuya ağınızı paketlerle doldurabileceği bir saldırı vektörü sağlıyor. Bu da bağlantınızın kopmasına ve oyunu kaybetmenize sebep olabiliyor. Daha da kötüsü bir oyuncunun IP adresini paylaşmak o oyuncuyu kişisel veri saldırılarına karşı savunmasız hale getirebiliyor. Oyuncu güvenliğini çok ciddiye alıyoruz. İstemci-sunucu mimarisine taşınmak, IP'nizi korumanın en etkili yolunu bize sunmuş oldu. 

Zaman ve Girdi Yetkisi

Sunucu; girdi, durum ve zaman yetkilerine sahip olarak sistemde başka bir önemli rolü daha üstleniyor. Bir geliştirici olarak gerilemeyi çalıştırdığınızda net kodunuzun kalitesini etkileyen en büyük unsur olan "farkı" dengelemek için kullandığınız algoritmanın sağlamlığı oluyor. Yani oyuncuların gerileme yükünü paylaştığından emin olmamız gerekiyor. Bir oyuncu üç kareli bir gerilemeyle karşılaşıyorsa herkes üç kareli bir gerilemeyle karşılaşmalı. Biri beş kare görürken diğeri bir kare görüyorsa bahsettiğimiz fark dengede değil demektir. 

Çok fazla detaya girmeden farkı dengelemenin oyuncuların her birinin oyun saatini senkronize etmek anlamına geldiğini söyleyebiliriz. Kullanıcıdan kullanıcıya yapıdaki iki oyunculu bir oyunda bile bu zor. İki oyuncunun aynı bilgi üzerinden oyunu oynadığından nasıl emin olabiliriz? (Meraklısına not: Bu durum aslında İki General problemiyle alakalı ve pek de muhtemel değil.) Dört oyunculu bir oyunda bunu sağlamak daha da zor! 

Zaman yetkisinin sunucuda olması bu anlama geliyor. Oyundaki tüm oyuncuların saatini takip eden merkezi bir yetki sayesinde farkın herkes için dengelenmesi konusunda çok daha iyi bir iş çıkarabiliyoruz.

Fair Play Modu

2XKO'nun çevrimiçi deneyimini iyileştirmek için Fair Play modu isminde başka bir özellik üstünde daha çalışıyoruz. Hepimiz Wi-Fi kullanan, mobil internetine bağlanan veya sistem gereksinimlerinin biraz altında olan bilgisayarlarla oyunu oynayan oyuncularla eşleşmişizdir. Peki bu durumlarda ne oluyor? Oyun donuyor ve takılıyor, daha da kötüsü devasa gerilemelerle karşılaşıyorsunuz ve karakterleriniz her yere ışınlanmaya başlıyor. Kullanıcıdan kullanıcı yapıda elinizden en çok bu geliyor. Yani oyundaki her oyuncu için zamanlı girdilere sahip değilseniz gerileme bile durumu kurtaramıyor. Kötü niyetli oyuncuları hesaba katarsak işimiz daha da zorlaşıyor. Bu oyuncular kumandalarına gecikme tuşu ekleyip istedikleri zaman paket kaybına yol açabiliyorlar veya PC'de Windows başlık çubuğuna tıklayıp basılı tutarak oyunlarının saatini durdurabiliyorlar. Bu iki durum da oyunlarınızda büyük gecikmelere sebep olup kombolarınızın olmayacak yerlerde kesilmesine yol açıyor. 

2XKO sunucusu Fair Play modu etkinken her oyuncunun girdisine ulaşmadan önce kısa bir bekleme süresi ekliyor. Bir girdi gecikirse oyuncunun bir önceki girdisi kopyalanıyor ve oyun devam ediyor. Bu çok önemli bir işlev. Yani rakibiniz ağına ne yaparsa yapsın oynanış deneyiminiz etkilenmiyor. Bu durumda kullandıkları gecikme tuşunu veya Wi-Fi kopmasını muhtemelen fark etmezsiniz bile. Öte yandan bunun dezavantajları olduğunu da söylemeden geçemeyiz. İnternet bağlantınız birkaç saniyeliğine bile aksasa kendinizi karşı takımdan büyük bir kombo yerken bulabilirsiniz.

Fair Play henüz deneme aşamasında. Her şeyin doğru işlediğinden emin olmak için daha çok düzenleme yapmamız gerekiyor. Bu modun gecikmelere sebep olarak avantaj sağlamaya çalışan hilecileri cezalandırırken diğer oyunculara sorun teşkil etmediğinden emin olmak istiyoruz. Modu tam olarak uygulamaya koyduğumuzda geribildirimlerinizi almak için sizi haberdar edeceğiz!

Küresel Altyapı ve Koruma

Tabii ki ağ iyileştirmelerimizin tamamını desteklemek için güçlü bir küresel altyapıya sahip olmamız gerekiyor. Yani her şeyi bir arada tutmak için Riot'un ağ altyapısının gücünün tamamından faydalanacağız. Paketlerin internet gecikmelerinden daha hızlı bir şekilde sunuculara aktarılmasını sağlamak için 2XKO'nun ağ trafiğinin merkezinde Riot Direct yer alacak. Sunucular bizzat Genel DDoS Hizmeti tarafından korunacak. Yani kötü niyetli oyuncular özel lobinizde ev sahipliği yaptığınız bir turnuvanın büyük finalini elinizden alamayacak. Riot'un Geçici Oyun Platformu'ndan faydalanarak oyunun çıktığı bölgelerdeki oyuncuların pingi düşük karşılaşmalara erişebilmesi için dünyanın dört bir yanında sunucular kuruyoruz. Dünyanın her yerinde oyuncuların erişebileceği sunucular açmak istiyoruz. Tabii ki bunu başarabilmek için biraz daha zamana ihtiyacımız var. Bu aşamada sabrınız için çok teşekkür ederiz.

Riot Vanguard Hile Koruması

Rekabetin adil olması aynı zamanda bütünlüğe bağlı olduğu için kurduğumuz sağlam ağı aynı sağlamlıkta bir hile korumasıyla daha da güçlendiriyoruz. Hile koruması için Vanguard'dan faydalanarak hayatı hile yazılımı ve bot kullanıcıları için daha zor bir hale getiriyoruz. Vanguard, LoL'deki bot kullanımını %99'dan fazla düşürerek oldukça etkili oldu. Bu koruma sayesinde rakiplerinizin otomatik savuşturma veya ıska cezası gibi hileler kullanmayan gerçek insanlar olduğundan emin olabiliyoruz. Öte yandan rekabetçi bütünlük bir daha üstünde durmamak üzere tek seferde çözebileceğimiz bir konu değil. Bu konu hakkındaki çalışmalarımız sürekli devam ediyor. Oyunun rekabetçi bütünlüğünü izlemeye ve gerekli durumlarda yaklaşımlarımızı değiştirmeye devam edeceğiz.

Sabit Girdi Gecikmesi ve Kare Hızı

Çevrimiçi mi çevrimdışı mı, PC'de mi konsolda mı oynadığınıza bakmaksızın 2XKO'nun oynanışının olabildiğince tutarlı hissettirmesi için girdi gecikmesi ve kare hızı alt sistemlerimizi de düzenliyoruz. 

Sabit Girdi Gecikmesi

Tüm girdileri geciktirmek için kullandığımız ilk yöntem üç sabit kare eklemek. Bu yöntem gerileme uzunluğunu en aza indirmek için dövüş oyunlarında sıkça kullanılıyor. 2XKO'da bu gecikmeyi hem çevrimiçinde hem de çevrimdışında uyguluyoruz. Yani çevrimdışı alıştırmalarda inşa ettiğiniz kombo zamanlamanız ve kas hafızanız doğrudan çevrimiçi oyunlara da yansımalı. Üç karelik girdileri uygulamaya yıllar önce karar verdik. Bir ıskayı cezalandırılma zamanlamasından oyundaki en hızlı vuruş yapan harekete kadar oyundaki her şeyi üç karelik girdi gecikmesini hesaba katarak inşa ettik. Böylece oyun gecikmelere rağmen bile iyi hissettiriyor. 

Kare Hızı

Kullandığımız bir diğer yöntem ise kare hızına ayırdığımız vakit. Bir kareyi ne kadar hızlı ve tutarlı olarak canlandırdığımızı, işlediğimizi ve görüntülediğimizi kare hızı etkiliyor. Tutarlı olmayan kare hızlarında görüntünün takıldığını ve zamanlamayı iyi ayarlamanıza rağmen tek karelik kombolarınızın bazen çalışmadığını görebilirsiniz. Kare hızına dair çalışmalarımızın odağında hem girdi gecikmesini hem de konsol ve PC'nin arasındaki farkı en aza indirmek vardı. Şu an PC'de, PS5'te ve Xbox'ta bir düğmeye bastığınızda girdinizin ekrana yansıması neredeyse aynı anda oluyor. Yani 2XKO çevrimiçinde, çevrimdışında, evinizdeki PC'de ve canlı bir etkinlikteki konsolda aynı hissettirecek.

Oyun Doğrulama Sunucusu

Oyun sunucusunun durum yetkisine sahip olduğundan bahsetmiştim ama bunun ne anlama geldiğini açıklamamıştım. Bunun asıl faydası hile ve ikincil hesap karşıtı bir rol üstlenmesi. 2XKO'daki rekabetçi karşılaşmaların tamamı sunucuda oyunun başka bir kopyasını oynatıyor. Yani 2'ye karşı 2 bir oyunda oyunun beşinci bir kopyası gerçek zamanlı olarak bulutta oynuyor. Buna Oyun Doğrulama Sunucusu diyoruz. 

Bu beşinci kopya bize epey fayda sağlıyor. Öncelikle bir sunucuya sahip olmanın doğası gereği, oyunu terk eden veya internetinin fişini çeken oyuncuları tespit edip doğru şekilde cezalandırabiliyoruz. Oyun Doğrulama Sunucusu bunu bir adım ileriye taşıyor: Bir oyuncunun oyun kopyası kendi yaptığı değişikliklerden dolayı diğer oyunculardan farklı bir hale geldiğinde bir sağlama yaparak oyun durumunu Oyun Doğrulama Sunucusu'yla kıyaslayıp bu oyuncuyu tespit edebiliyoruz. Böylece değiştirilen oyun durumu aracılığıyla beraberliği zorlamanın önüne geçiyoruz. 

Oyun Doğrulama Sunucusu aynı zamanda karşılaşmaların sonuçlarını veri akışımıza ekleyebiliyor. Mesela her oyunun detaylı istatistiklerini Riot'un merkezi derecelendirme hizmetlerine aktarıyoruz. Derecelendirme hizmeti, oyun sonu istatistiklerimizi Microsoft'un True Skill 2 algoritmasından geçirerek yalnızca birkaç oyunda oyuncuların beceri düzeyini bulabilmemize yardım ediyor. Bu da tek taraflı oyunlarda daha az zaman kaybetmeniz anlamına geliyor. Bu sistemin aynı zamanda ikincil hesap kullanımını da büyük ölçüde azaltacağını umuyoruz.

Lobiler ve İzleme

Temel oynanışın ötesindeki oyun dışı birçok sistem üstünde çalışmaya da bolca vakit ayırdık. Bunlardan en önemlisi lobi sistemimiz. Dövüş oyunları evde bir arkadaş grubuyla birlikte veya bir turnuva ya da haftalık bir buluşma için yerel bir salonda toplanarak oynandığında en iyi halini alıyor. 2XKO lobileri de bu sosyal sistemleri çevrimiçine yansıtmak için tasarlandı.

Devam Eden Karşılaşmalar

Oynanan karşılaşmaları izleyebilmek benim en sevdiğim özelliklerden biri. Diğer oyuncuları izleyebilmek çevrimdışı oynanışın en önemli artılarından biri. Bu sayede karakterleriniz için yeni teknikler öğrenebiliyorsunuz, diğer oyuncuların kullandığı araçları gözlemleyebiliyorsunuz, arkadaşlarınıza tezahürat yapabiliyorsunuz veya elenmenize sebep olan rakibinizin rakibini tutabiliyorsunuz. Tüm bu muhteşem duyguları çevrimiçine de yansıtmak istedik.

2XKO lobisindeki bir oyuncu, devam etmekte olan bir karşılaşmanın yaşandığı bir makineye yaklaştığında üstünde açılan pencere sayesinde birkaç saniye içinde karşılaşmayı eşzamanlı olarak izleyebilecek. Şampiyon seçiminden oyun başlangıcına, kazananın belli olmasına ramak kalan ve bitmesi bir vuruşa bakan son tura kadar oyuncuların yaşadığı her şeyi gerçek zamanlı olarak görebileceksiniz. Bu esnada uzun süren senkronizasyonlar veya oynatma gecikmeleri de olmayacak. Yani en başından beri oradaymışsınız gibi aksiyona dahil olabileceksiniz.

Sunucu Taraflı İzleme Nasıl Çalışıyor?

Bu izleme sistemini çalıştırmak için bir hayli deneme yapmamız gerekti. 2XKO gibi gerileme ağ kodundan faydalanan dövüş oyunları oldukça deterministik olduğu için rasgeleliğe yer olmaz. Yani bir karşılaşmanın durumunu en baştan oynatabilmeniz için elinizde girdilerin olması yeterli. Yani bir oyuncu bir makineye doğru gidip karşılaşmayı birinci turdan itibaren izlemeye başladığında bu oyuncuya girdileri sırasıyla sunuyoruz ve her şey yolunda gidiyor. Peki ya zaten oyunun ortasındaysak? Bu durumda bütün girdileri sunup izleyiciden güncel olana kadar oyunu ilerletmesini bekleyebiliriz. Tabii ki bu seçenek zaman alıyor. Bu arada Alpha Lab 1'den önceki ilk 2XKO sürümlerinde lobiler tam olarak böyle çalışıyordu. Ama bu sistem pek iyi hissettirmiyor. Ekranın güncel durumu yakalaması için 5 ila 20 saniye beklemek oyuncuları bu sistemden uzak tutuyordu.

Oyun Doğrulama Sunucusu'nu kullanmaya başladığımızda daha akıllı bir sistem kurma fırsatı elde ettik. Oyun Doğrulama Sunucusu'nun sunucuda oyun durumunu gerçek zamanlı olarak doğrulayan bir sistem olduğunu hatırlatalım. Artık oyuncular bir karşılaşmayı ortasından izlemeye başladığında tüm girdileri göndermiyoruz. Bunun yerine Oyun Doğrulama Sunucusu'ndan oyunun mevcut durumunun anlık görüntüsünü göndermesini istiyoruz ve bu noktadan itibaren girdileri gönderiyoruz. Bellek konusunda daha verimli olan bu anlık görüntü, sistemin sadece deterministik kısımlarının kaydını sağlamış oluyor. Bu görüntü yaklaşık 50 KB boyutunda olduğu için oyunculara çok hızlı ulaşabiliyor. Üç dakikalık bir girdiyi ilerletmek yerine 50 KB boyutundaki kaydı yüklüyoruz ve oyuncu anında güncel duruma ulaşabiliyor. Sihir gibi, en azından benim için.

Sunucu taraflı oyun simülasyonu olmadan bu özelliği kuramazdık. Lobi izlemenin prototip sürümlerinde oyundaki ilk oyuncunun anlık bir görüntüsünü alıp izleyiciye gönderiyorduk. Bu da bir sürü sorunu beraberinde getiriyordu. Öncelikle bu anlık görüntüyü alıp sıkıştırmak cihazlar için külfetli. Bu durum, lobiye her izleyici katıldığında düşük özelliklere sahip cihazlardan oynayan oyuncuların FPS'inin teklemesine yol açıyordu. İşte bu asla kabul etmeyeceğimiz bir durum. Birisi yanlış bir anda oyununuzu izlemeye başladı diye hareketinizi isabet ettiremediğinizi bir düşünsenize... Üstelik bu durum güvenlik açıklarına da sebep oluyordu. Kötü niyetli kişilerin arabellek aşımı saldırısı içeren bir anlık görüntü oluşturarak veya başka bir yöntemle bir diğer oyuncunun cihazını tehlikeye atabileceği bir saldırı vektörü açmak istemedik. İzleme verilerinin tamamını sunucudaki güvenilir bir kaynağa aktararak tüm bu sorunların üstesinden gelebildik.

Lobiler Arası Eşleştirme

Son olarak lobiler arası eşleştirme özelliğimizden bahsetmek istiyorum. 2XKO lobilerinde farklı yöntemlerle karşılaşma bulabilirsiniz: Oyunculara bireysel olarak meydan okuyabilirsiniz, bir makineye oturup başka bir oyuncunun yanınıza oturmasını bekleyebilirsiniz, oyun salonlarında geçen eski günlerdeki gibi "jetonla" sıraya girebilirsiniz veya eşleştirme sistemden size bir rakip bulmasını isteyebilirsiniz. 

Sistem lobi doluyken iyi çalışıyor fakat istisnai durumlar da var. Ya lobinizdeki herkes halinden gayet memnunsa ve karşılaşma arayan tek kişi sizseniz? 

Alpha Lab 1'de bir lobide oynamak oldukça harikaydı. Liderlik tabloları, galibiyet serileri ve izlemeye gelen oyuncular çok iyi işliyordu fakat bunlar bahsettiğimiz istisnai durumlarda eşleştirme sürelerinin uzamasına sebep olabiliyordu. Ana menüye koyacağımız bir "Karşılaşma Bul" düğmesi, tek isteği olabildiğince hızlı bir şekilde çevrimiçi bir karşılaşmada yer almak olan oyunculara hızlıca bir karşılaşma bulabilirdi. Bu sistem sadece mevcut lobideki oyuncular yerine oyundaki bütün oyunculara bakardı. 

Kapalı Beta'da eşleştirme sistemini sadece mevcut lobi yerine çevrimiçi olan tüm lobilerde karşılaşma arayacak şekilde düzenledik. Yapılan eşleştirme mevcut lobinizdeyse bu karşılaşmanın rezervasyonunu lobideki bir makine için yapıyor ve oyuncuları oraya gönderiyoruz. Bulunan karşılaşma başka bir lobideki bir oyuncuya karşıysa yine benzer bir yol izliyoruz. Ayrı lobilerde bulunan her oyuncu bir makinede bir rezervasyon elde ediyor ve yanına oturması için rakibin hologram bir kopyasını işliyoruz. Karşılaşma sona erdiğinde iki oyuncu da kendi lobilerine geri dönüyor. Endişelenmeyin, galibiyet seriniz kaybolmuyor. 

Bir sunucunun lobilerindeki tüm oyuncular aynı lobiler arası eşleştirme sisteminde sıraya girdiği için bir lobideyken karşılaşma bulma hızınız, lobisiz bir sistemde ana menüden karşılaşma bulmanızla aynı olmalı. Eşleştirme sistemi belli bir süre içinde size en iyi eşleştirmeyi sunmak için tasarlandı. Herkesin çevrimiçi olduğu oyunun en çok rağbet gördüğü saatlerde dengeli bir eşleştirme için birkaç saniye yeterli. Öte yandan sabaha karşı 3'te çok fazla oyuncu çevrimiçi değilken eşleştirmelerinizdeki beceri düzeyi farkı herkesin çevrimiçi olduğu saatlere kıyasla fazla olabilir. Tabii ki sistem yine de size uygun bir eşleşme bulmaya çalışacak. Bu saatlerdeki uzun süren eşleştirmeler 2XKO'ya özel değil. Çevrimiçi oyunların tamamında oyuncu sayısının az olduğu saatlerde eşleştirme bu şekilde işliyor. Eşleştirme hızıyla beceri düzeyi uyumu arasında hangisini önceliklendireceğimizi düzenlemek bizim elimizde. Bu deneyime dair geribildirimlerinizi duymaktan mutluluk duyarız. Erken Erişim'de bu konuyu tamamen halletmek istiyoruz.

Gelecek Planlarımız

Bu yazıda çok fazla konudan bahsettik, buraya kadar okuduysanız teşekkür ederiz. Söz konusu dövüş oyunlarından keyif almak olduğunda çevrimiçi oynamanın asla gölgede kalmaması gerektiğine inanıyoruz. Doğrulama sunucusundan gerileme ayarlamalarına, anında izlemeden lobiler arası eşleştirmeye kadar tasarladığımız özelliklerin tamamı çevrimiçi karşılaşmaları çevrimdışı karşılaşmalar kadar adil, hızlı ve eğlenceli kılmak için. Erken Erişim'de ve gelecekte sistemlerimizi ayarlamaya, denemeye ve geribildirimlerinize kulak vermeye her zaman devam edeceğimizi de belirtelim. Düşüncelerinizi bizimle paylaşmayı unutmayın. Lütfen hataları bildirmeye ve önerilerinizi göndermeye devam edin.

Okuduğunuz için teşekkürler.

Tony Cannon