1 Eylül 2009 Salı

Basit bir chat uygulaması

Eventmachine ile istemci/sunucu modelinde hazırladığım basit bir sohbet uygulamasına http://github.com/airy/EM-simpechat adresinden ulaşabilirsiniz.

20 Ağustos 2009 Perşembe

Bir Oyunun Anatomisi - II

İnternet üzerinde çalışan çok kullanıcılı bir oyun, birden fazla katman ve öğeden oluşur. Bu katmanlara ve öğelera kısa bir bakış atalım.


İstemci katmanı
İstemci katmanı, kullanıcının bilgisayarında çalışan parçadır. Bu katman, sunucu katmanı ile internet bağlantısı üzerinden haberleşir.

Bu katmanda, yükleyici program, kullanıcı arabirimi ve eklentiler çalışır. Ayrıca oyunda kullanılan modeller, sesler, görseller gibi veriler de burada tutulur.

Yükleyici program, oyun ve oyunla ilgili dosyaları güncellemek ve oyunu yüklemekle görevlidir. Yükleyici programın her zaman ayrı olması gerekmez, oyun istemcisinin bir parçası olarak da tasarlanabilir.

İnternet tarayıcısı bazlı oyunlarda ise tüm bu görevleri üstlenen öğeler bir web sunucusunda tutularak, tarayıcı ile erişim sağlanmaktadır.

Sunucu Katmanı
Sunucu katmanı; kullanıcıların, internet üzerinden uygun araçlarla erişebilecekleri, servis sunucularını içeren katmandır. Bu katmanda bulunan sunucular ve görevleri şunlardır:
  • Kimlik Sunucusu: Kullanıcıların, kullanıcı adı ve şifrelerinin kontrol edildiği sunucudur.
  • Güncelleme Sunucusu: Kullanıcı katmanında bulunan dosyaların güncellemesi için gerekli yamaları servise sunan sunucudur.
  • Web Sunucusu: Kullanıcıların, hesaplarına eriştikleri ve oyunla ilgili web hizmetlerinin verildiği sunucudur.
  • Oyun Sunucusu: Oyun ile ilgili işlemlerin ve hesaplamaların yapıldığı sunucudur. Kimi zaman birbirinden bağımsız (paralel) dünyalar oluşturmak için, kimi zaman ise oyunun kullanıcı yoğunluğu farklı bölgelerini çalıştırmak için birden fazla oyun sunucusu bulunabilir.
  • Sohbet Sunucusu: Kullanıcıların, birbirleri ile haberleşmelerini sağlayan sunucudur.
Veri Katmanı
Veri katmanı; internet üzerinden erişilemeyen, oyun içi ve oyuncu bilgilerini tutan veri tabanlarının bulunduğu katmandır.

Yukarıda, sunucu olarak bahsettiğimiz tüm öğeler, sunucu yazılımlardır. Kullanıcı yoğunluğuna bağlı olarak tümü tek bir makinada bulunabileceği gibi, her biri ayrı makinalarda bulunabilir ve hatta ihtiyaç halinde bir servis (sunucu) birden fazla makinada da çalışabilir.

16 Ağustos 2009 Pazar

Bir Oyunun Anatomisi - I

Bir mmo oyun tasarlarken, birden çok parçayı bir araya getirmemiz gerekiyor. Bu parçaların hepsi programlama ile ilgili değildir. Genel olarak oyuncuların en sık karşılaştıkları parçalar, en az programlama gerektiren parçalardır. Hatta diyebiliriz ki, oyuncunun programlama kısmı ile her karşılaşması bir hata (bug) demektir.

Ben bu parçaları iki grup halinde grupluyorum. İlk grup, oyuncuların gözü önünde olan kısımları içeriyor. İkinci grup ise, oyuncunun görmeyeceği, duymayacağı kısımlar, yani programlama ile ilgili parçalar. Genel olarak ikinci gruptaki parçalar, birinci gruptaki parçaların sunumu ve kullanımı ile ilgilidir.

Birinci gruptaki yer alan parçalar şunlardır;
  • Hikaye
  • Görevler
  • Karakterler
  • Nesneler
  • Etkileşim
  • Müzik
  • Görsel efektler
  • İşitsel efektler
  • Arabirim
  • ...

İkinci grupta ele alacağım programlama ile ilgili maddeler ise şunlardır;
  • İstemci yazılımı
  • Sunucu yazılımı
  • Veri depolama sistemi
  • Yardımcı araçlar
  • Oyun eklentileri (addonlar)
  • ...

Tüm bu başlıkları detaylı olarak incelemeyi düşünmüyorum. Daha çok ikinci gruba yoğunlaşarak, bu grupta yer alan parçaların uygulamada nasıl olacağına odaklanacağım. Uzun süredir, extreme programming teknikleri ile çalışmaktan dolayı, uygulamada ve yazılarımda belirli bir sırayı takip etmeyebilirim. Bu konuda şimdiden affınıza sığınıyorum.

Sözlük

Makaleler içerisinde yer alan teknik teirmler ve türkçe karşılıklarını, toplu halde bu başlık altında bulabilirsiniz.

13 Ağustos 2009 Perşembe

Başlarken

İnternet üzerinde oyun programlama dendiğinde özellikle C++ dilinin sağladığı avantajlar çok ön plana çıkıyor. C++ dilinin çok güçlü bir programlama dili olduğunu yadsıyamayız, tabi ki getirdiği bazı sıkıntıları da.

Bir takım kaptanı olarak benim değerlendirme kriterlerim oldukça farklı. Bunları sizinle paylaşmak ve fikirlerinizi almak istiyorum.

Genellikle oyun projelerinin uzun soluklu projeler olduğunu görüyoruz. Ortalama iki ila üç yıl süren projeler. Elle tutulur bir piyasa başarı sağlamanız halinde, ek paketler vs. ile bu süre daha da uzamakta.

Bu üç yıllık süre içinde nelerle karşılaşılabildiğini bir düşünelim:

firmalar; yönetim, ilgi alanı değiştirebilir, maddi sıkıntıya düşebilir, kapanabilir.

insanlar; evlenebilir, çocuk sahibi olabilir, iş değiştirebilir, taşınabilir, hastalanabilir, sakatlanabilir ve hatta hayatlarını kaybedebilir.

Tüm bu ve benzeri faktörleri, proje risklerini öngörmeye çalışırken göz önünde tutmanız gerekmektedir. Bu kadar uzun soluklu hiç bir proje, başladığı takımla bitmez; özellikle de yazılım sektöründe. Benim tecrübelerimde bu oran 4/10. Yani on kişilik bir takımda sadece 4 kişi işin başlangıcını ve bitişini görebiliyor. Bu oran, ilk bakışta yüksek bir sirkülasyon oranı gibi görünebilir, fakat üç yıl için düşündüğümüzde oldukça makul bir oran.

C++ gibi öğrenmesi ve okunması zor bir dilin, salt taşınabilirlik ve hız avantajı sağladığı için oyun projelerinin olmazsa olmazı gibi görünmesi göz yanıltıcıdır. Düşünün her altı ayda çekirdek kadronuzdan biri ayrılıyor ve yerine projeye tamamen yabancı biri geliyor. Halefinin bıraktığı yerden bayrağı devralması için bu kişinin, mevcut sistemi analiz etmesi, yapılan işleri ve kodları anlaması, hataları bulabilecek seviyede bilgiye sahip olması gerekiyor. Tüm bunları yapabilmek için de efor ve zaman harcamak zorunda. Tabii ki bu zamanın finansmanı da proje bütçesine ve planlamasına yansımakta.

Üç yıl sonra kullanacağımız oyun ekipmanlarının (bilgisayar, konsol, mobil cihazlar vs), şu an kullandıklarımıza göre ciddi kaynak avantajlarının olacağını yadsıyamayız. Yani üç yıl sonra 10-50 GHz frekans aralığında çalışan terabyte ile ölçülen hafızalara sahip cihazlarımızın olması varsayımı oldukça gerçekçi.

Şu anda bize büyük bir avantaj gibi görünen HIZ, projeye yansıyan vakit ve nakit maliyetleri açısından oldukça ciddi bir dezavantaja sahip. Bu noktada, farklı diller problemin çözümünü kolaylaştırabilir.

Pek çok büyük oyun üreticisi firmanın da, probleme bulduğu çözüm bu yönde. Pek çok firma ürünlerinde C++ gibi dillerin yanı sıra Lua gibi öğrenmesi ve okuması kolay betik (script) dillerini de kullanıyorlar.

Daha önce kullandığım tüm dillerin yerine geçen ruby'nin bu alanda da kısa süreler içinde büyük işler çıkarmaya imkan sağlayacağını düşünüyorum. Bu yüzden yeni başlayan projede Ruby dilini mümkün olan her yerde kullanmayı amaçlıyorum.

Tecrübelerimi buradan paylaşmaya devam edeceğim.

Vaktinizi ayırdığınız için teşekkür ederim.