kaynak
Linkleri görebilmek için
giriş yap veya kayıt ol.
Günlük #1
Google Protocol Buffers (Protobuf) / Flatbuffers
Metin2 tarihinde bir ilk olarak sunucu ve istemci dahil tüm ağ altyapısını tamamıyle Google Protocol Buffers'a geçirdim. Bu işlem ile Metin2'nin 450 den fazla ağ paketlerini teker teker refaktörize edip sıfırdan yazdım. Peki protocol buffers tam olarak nedir? Protocol Buffers Google tarafından üretilmiş bir ağ protokolü oluşturma ve yönetme kütüphanesidir ve ayrıca Google’ın kendi içindeki veri iletişiminde de bolca kullandığı bir veri transfer protokolüdür. Bu kütüphane/protokolü CS:GO, League of Legends, GTA V gibi AAA+ oyunlar ve yapımcısı olan şirketler kullanmaktadır. Metin2 altyapısı 20 senelik bir altyapı olduğu için o zamanlarda tabii ki bu protokol yoktu, herkes manuel olarak paket protokolü yazıyordu. Fakat modern zamanlarda bu işler tamamen değiştiği için değişime ayak uydurmak gerekiyor.
Protokoller / Paketler ne hakkında konuşuyorsun? Protokoller (TCP/UDP) aracılığı ile sunucu ile siz oyuncular arasında bir tünel bağlantısı oluşturulur, bu tünel bağlantısı içinde örneğin oyunda yazacağınız bir chat istemci (client) tarafından 'encode' (şifrelenir/sıkıştırılır) edilir ve ardından sunucuya protokolünüze bağlı olarak 'paket' gönderilir. Ardından sunucu bu paketi 'decode' (deşifre) ederek sizin tam olarak oyunda ne yapmaya çalıştığınızı anlar. Bu paketler eski 20 yıllık Metin2 altyapısında manuel olarak el ile yazılmış ve statik ve dinamik paketlerin yazılması veya yönetilmesi çok meşakatli iş ve en küçük yaptığınız hatada komple sunucuyu elinize almanız hiç kaçınılmaz değil. Google Protobuf ile Metin2 TC'ye özel olarak bir bağlantı protokolü oluşturduk. Bu kendi özel protokollerimiz sayesinde altyapıda var olan paket (örneğin, rasgele olarak oyundan atma gibi) sorunlarının TAMAMINI düzeltmiş ve gelecekte ekleyeceğimiz sistemlerde oluşabilecek herhangi bir sorunu da tamamen çözmüş olduk ve olmasını da engelledik.
Protobuf'ın özellikleri sadece işimizi kolaylaştırmakla, oluşabilecek sorunları da engellemekle de kalmıyor ek olarak siz ve sunucu arasında oluşacak olan paket trafiğini de sıkıştırıyor ve sunucudan gelecek paketleri ek olarak opsiyonlayabiliyor, örneğin eski sistemin bir paketinde karakter oyuna girdiği zaman fix olarak 24 (24 byte) karakterlik bir paket gönderiyor istemciye, Protobuf ile karakter adının uzunluğu ne kadarsa o kadar büyüklükte 'delimited' (parçalı) dinamik bir paket gönderiyor. Bu şekilde sunucu ve istemci arasındaki trafik çok önemli ölçüde azalmış oluyor, performans genel olarak artıyor ve daha keyifli oyununuzu oynamanıza olanak sağlıyor. Başka bir örnek olarak eski sistemde bir adet itemin envanterinize sunucu tarafından gönderildiğini düşünün, bunu da bir adet artı basma itemi olarak düşünelim, artı basma itemlerinde efsun, taş olmamasına rağmen sunucu yine bu paketleri size gönderiyor, buna bağlı olarak gereksiz trafik haliyle çok fazla oluyor. Yeni altyapımızda Google'ın teknolojisi sayesinde bu artı basma itemi envanterinize geldiğinde sadece boş bir item datası otomatik olarak gönderilecek. Eğer bu envanterinize gelen itemin efsunu varsa efsunları teker teker, taşları varsa yine teker teker spesifik, seçilmiş olarak gönderilecek.
Yeni Refaktörize Edilmiş / Modernleştirilmiş Kaynak Kodları
Metin2 bahsettiğim üzere 20 yıl önce yazılmış bir oyun olduğu için, şuanki mevcut yazılım güncellemelerinden faydalanamıyorduk. Şimdi düşünün 20 yıl önce Nokia 3310 telefon kullanıyorduk ama bugün sadece ekranı 2K olan, 4 çekirdekli bir iPhone kullanıyoruz. Bundan 40-45 yıl önce Nokia 3310'in işlemcisi gücünde bir işlemciye sahip olan uzay aracı ile insanlık Aya ayak bastı. (Apollo Roketi yazılımı C ve işlemcisi) Hal böyle olunca yapımına başlanan Metin2, 2000'lerde, o zamanın 'son sürüm' olarak nitelendirdiği yazılım dili ve yazılım dilinin özellikleri ile 512mb RAM'in 8gb ram gibi olduğu dönemlerde bu oyunu yazdı... Fakat artık 20 sene önce o zamanın güncellemeriyle ve özellikleriyle yazılmış bir sistemin (C/C++) mevcut modern işlemcilerde ve grafik kartlarında kullanmak bile ayrı bir meşakat, ayrı bir zulüm çünkü 20 sene içinde C++'ye (Metin2'nin çoğu kısımlarının yazıldığı yazılım dili) on binlerce özellikler geldi ve yüzlerce güncelleme ve revizyon aldı.
Metin2 TC'nin altyapısının tamamını kendim C++20 ISO standartlarına göre tekrardan yazdım, standarda uymayan tüm daha önceden yazılmış sistem altyapılarını standarda uygun olarak revize ettim. Bu işlem testler ile beraber yaklaşık olarak 1,5-2 ay kadar sürdü, fakat şu an TC'nin altyapısı günümüz şartlarının teknolojilerini ve yazılım dilinin özelliklerinin ve potansiyellerinin tamamını kullanıyor.
Ayrıca Metin2 TC sunucu çekirdek sistemleri yine Metin2 tarihinde bir ilk olarak 6 ay önce 64 bit mimarisine geçirdim. 20 sene önce 64 bit yeni yeni çıkan bir işlemci mimarisi olduğu için tabii ki de Metin2 32 bit mimarisi için özel olarak yazılmıştı, fakat günümüz modern şartlarında 64 bit desteklemeyen işlemci kalmadığı ve işlemcilerin bile artık doğal olarak 64 bit mimarisine uygun şekilde üretildiği için, 32 bit olan bir yazılım 64 bit mimarisi olan bir sistemde ister istemez %10 kadar bir performans düşüşü yaşıyordu, artık Metin2 sunucu çekirdek sistemlerinin tümü doğal (native) olarak 64 bit işlemci mimarisine özel olarak çalışıyor ve gelecekte kullanacağımız aşırı güçlü sunucularımızın performansının tümünü etkin olarak kullanabileceğiz.
Son düzenleme: