Bir oyun istemcisinin arkasında, her saniye yüzlerce olayı işleyen bir C++ oyun sunucusu vardır. Metin2 gibi MMO'lar tam olarak böyle çalışır: performans için C++ ile yazılmış bir çekirdek, ağ üzerinden istemcilerle konuşur. Bu yazıda, kendi sunucum Runa2'nin de dayandığı mimariye üst seviyeden bir bakış sunuyorum — kod yazmadan önce resmi anlamak için.
Neden C++?
Bir oyun sunucusu, binlerce oyuncunun hareketini, savaşını ve eşyasını milisaniyeler içinde işlemek zorundadır. C++, belleği ve CPU'yu doğrudan kontrol etmesiyle bu düşük gecikmeyi mümkün kılar. Metin2 çekirdeği bu yüzden C++ (ve düşük seviye için C) ile yazılmıştır.
Ana döngü: sunucunun kalbi
Her oyun sunucusunun merkezinde bir ana döngü vardır. Bu döngü durmadan üç şeyi yapar: gelen paketleri okur, dünyayı günceller ve yanıtları gönderir.
// Basitlestirilmis ana dongu (game loop)
while (server_is_running) {
process_network_events(); // gelen paketleri oku ve coz
update_game_world(delta); // NPC, savas, hareket, sureler
flush_outgoing_packets(); // istemcilere yaniti gonder
}
Bu döngü saniyede defalarca döner; ne kadar verimli olursa sunucu o kadar çok oyuncu kaldırır.
Ağ katmanı
İstemciler sunucuyla TCP soketleri üzerinden konuşur. Sunucu, her oyuncunun bağlantısını dinler, gelen baytları anlamlı paketlere çözer (hareket, saldırı, sohbet…) ve uygun yanıtı geri yazar. Metin2'de bu iş, libthecore gibi temel kütüphaneler üzerine kuruludur.
Oyun mantığı ve dünya yönetimi
Çekirdek; karakterleri, NPC'leri, haritaları ve savaş hesaplarını bellekte tutar. Bir saldırı geldiğinde hasar hesaplanır, sağlık güncellenir, sonuç ilgili oyunculara yayınlanır. Veritabanı (MySQL) ise kalıcı veriyi (karakter, item) saklar; db çekirdeği oyun ile veritabanı arasında köprü kurar.
Performans ilkeleri
- Bloklamayan G/Ç — ağ işlemleri ana döngüyü kilitlememeli.
- Bellek yönetimi — sık ayrılan nesneler için havuzlar kullan; sızıntılar uzun süreli sunucuyu öldürür.
- Kanallara bölme — yükü birden çok kanal (ch1, ch2…) çekirdeğine dağıt.
Sık Sorulan Sorular
Oyun sunucusu yazmak için ileri C++ şart mı?
Mevcut bir çekirdeği değiştirmek için orta seviye C++ ve sabır yeterli. Sıfırdan yazmak ise ağ, eşzamanlılık ve bellek konularında derin bilgi ister.
Neden tek bir dev sunucu yerine kanallar var?
Yükü bölmek için. Her kanal ayrı bir çekirdektir; biri yoğunken oyuncular diğerine dağılır ve performans korunur.
Sunucu çökerse veri kaybolur mu?
Düzenli veritabanı yazımı ve yedeklerle kalıcı veri korunur; bu yüzden db çekirdeği ve yedekleme kritiktir.
Oyun sunucusu mimarisi mi konuşmak istiyorsun? Metin2 çekirdeği, denge ve altyapı konularında yardımcı olabilirim — benimle iletişime geç.