Bloga Dön

Godot Bakım Sürümü Backend Uyumluluğu: Multiplayer Oyunları Güvenli Bir Şekilde Güncellemek

Yayınlanma tarihi 11 Temmuz 2026
Godot Bakım Sürümü Backend Uyumluluğu: Multiplayer Oyunları Güvenli Bir Şekilde Güncellemek

Özet olarak

Bu makale, Godot 4.7.1 RC 2 bakım sürümüyle gelen kritik ağ ve kriptografi güncellemelerinin multiplayer oyun backend uyumluluğu üzerindeki etkilerini ele almaktadır. Özellikle mbedTLS 3.6.7 yükseltmesi ve headless sunuculardaki shader düzeltmelerinin yaratabileceği olası senkronizasyon ve bağlantı hataları detaylandırılmıştır. Geliştiricilerin sürüm geçişlerini sorunsuz atlatabilmesi için GDScript tabanlı güvenli bağlantı mimarileri ve canlı ortam doğrulama pratikleri sunulmaktadır.

Geliştirme sürecinin ortasında oyun motorunu yükseltmek, koşan bir oyuncuya açık kalp ameliyatı yapmaya benzer: Ağ kütüphanesindeki tek bir alt sürüm değişikliği, istemci-sunucu el sıkışmalarının (client-to-server handshake) aniden anlaşılmaz TLS hatalarıyla başarısız olmasına yol açabilir. Bir live-service oyunu yönetirken, yama ve bakım sürümleri kağıt üzerinde basit regresyon düzeltmeleri gibi görünebilir; ancak arka planda, canlı ortamdaki (production) bağlantıları koparan sessiz bağımlılık güncellemeleri getirebilirler. Godot 4.7.1 RC 2, oyun istemcinizin backend altyapınızla nasıl iletişim kuracağını doğrudan etkileyen kritik şifreleme kütüphanesi güncellemeleri ve küçük düzeltmeleri bir arada sunarak bu hassas dengenin mükemmel bir örneğini teşkil ediyor.

Modern live-service oyunları mimari olarak tasarlarken, oyun geliştiricileri genellikle ağ taşıma katmanının (network transport layer) güvenliğini göz ardı ederler. Star Citizen veri ihlali analizimizde ele aldığımız gibi, backend altyapısını güvence altına almamak ve katı şifreleme protokollerini zorunlu kılmamak, oyunları tersine mühendisliğe (reverse-engineering) ve oturum çalmaya (session hijacking) karşı savunmasız bırakır. Ancak backend'inizi güvenceye almak mücadelenin sadece yarısıdır; diğer yarısı ise onu motorun her alt sürüm değişikliğiyle uyumlu tutmaktır.

Karmaşık multiplayer mimariler çalıştıran ekipler için, bir yandan oyun içeriği yayınlarken diğer yandan motor güncellemelerini yönetmek büyük bir mühendislik zorluğudur. Farklı sürümleri çalıştıran istemciler arasında uyumluluğu korumanın bir öncelik olduğu büyük indie backend güncellememize attığımız bakışta, koordinat senkronizasyonu ve sunucu performansı konusundaki kendi deneyimlerimizi ayrıntılarıyla anlattık. Bu makalede, Godot 4.7.1 RC 2'deki ağ odaklı değişiklikleri inceleyecek ve aktif oyuncu kitlenizin bağlantısını kesmeden nasıl sorunsuz bir sürüm yükseltme süreci yürütebileceğinizi adım adım ele alacağız.

Motor Bakım Güncellemelerinin Gizli Tehlikesi

Indie geliştiriciler arasındaki yaygın bir hata, bir yama veya bakım sürümünün (Godot 4.7'den 4.7.1'e geçmek gibi) yalnızca arayüz (UI) hatalarını ve editör çökmelerini düzelttiğini varsaymaktır. Gerçekte ise bu nokta sürümleri, alt seviye bağımlılıkların güncellendiği kritik bakım döngüleridir. Godot 4.7.1 RC 2'de, motorun temel kriptografik kütüphanesi olan mbedTLS 3.6.7 sürümüne güncellendi. Bu güncelleme güvenlik açıklarını kapatıp bellek tahsisini (memory allocation) optimize ederken, aynı zamanda şifreleme paketi (cipher suite) anlaşmasını da değiştiriyor.

Bir Godot istemcisi WebSockets veya HTTP aracılığıyla backend'inize bağlandığında, TLS handshake işlemini gerçekleştirmek için mbedTLS'e güvenir. Eğer mbedTLS'in yeni sürümü eski ve zayıf şifreleme paketlerini (triple-DES veya belirli CBC modları gibi) kullanımdan kaldırırsa ve sunucunuzun load balancer'ı bu eski şifreleri kullanacak şekilde yapılandırılmışsa bağlantı başarısız olacaktır. İstemci el sıkışmayı iptal edecek ve belirsiz bir hata kodu 3 (RESULT_TLS_HANDSHAKE_ERROR) döndürerek neyin yanlış gittiğini tahmin etmeyi size bırakacaktır.

Ayrıca, bu bakım sürümü headless export'lar için bir düzeltme içeriyor: "Export: Fix incorrect per-instance shader parameters when exporting in headless mode". Shader'lar genellikle istemci tarafı görsel öğeler olsa da, Dedicated Server'lar headless modda (--headless) çalışır. Eğer sunucu tarafı mantığınız (server-side logic), server-authoritative görüş hattı (line-of-sight) kontrolleri için viewport doku analizine veya özel shader tabanlı hesaplamalara dayanıyorsa, bu hata düzeltmesi sunucunun oyun durumunu değerlendirme biçimini doğrudan değiştirir. Bu da istemci sürümleri sabitlenmişken sunucu binary dosyası güncellenirse istemci-sunucu senkronizasyon bozukluklarına (desync) neden olabilir.

Derinlemesine İnceleme: Godot 4.7.1 RC 2'deki Temel Değişiklikler

Bu release candidate sürümünün neden kapsamlı bir test döngüsü gerektirdiğini anlamak için belirli kod değişikliklerini analiz etmeliyiz. mbedTLS 3.6.7 (GH-121055) güncellemesi, modern kriptografik standartlara daha sıkı uyum getirerek en önemli ağ değişikliği olarak öne çıkıyor. Bu durum, optimize edilmiş eliptik eğri hesaplamaları sayesinde handshake sürelerinin biraz daha hızlı olmasını sağlar; ancak istemci tarafı doğrulaması, yanlış yapılandırılmış SSL sertifikalarına karşı daha az toleranslı olacaktır.

Godot ayrıca kriptografi için test paketlerini genişletti; özellikle verify/sign ve encrypt/decrypt testlerinin yanı sıra AESContext sınıfı için testler ekledi. Bu dahili test paketleri, yerel kriptografi kullandığınızda (indirilen oyuncu profillerinin şifresini çözmek veya yerel kayıt dosyası imzalarını kontrol etmek gibi), Godot'nun farklı işletim sistemlerinde öngörülebilir şekilde davranmasını sağlar. Bu testler, yerel şifrelemenin belirli platformlarda çökmemesini sağlamaya yardımcı olur ki bu da çevrimdışından çevrimiçine durum geçişleri için hayati önem taşır.

Fizik cephesinde, Godot 4.7.1 RC 2, Jolt geçici arabelleğine (temporary buffer) 2047 MiB'den fazla bellek tahsis edildiğinde meydana gelen bir çökmeyi çözüyor. Pek many multiplayer proje, 64 oyuncuya kadar yoğun ortamları simüle etmek ve server-authoritative fizik işlemleri gerçekleştirmek için Jolt'a güvenir. Eğer büyük bir simülasyon önceki bellek sınırını aşarsa, sunucu binary'si anında çökerdi. Bu düzeltme, yüksek eş zamanlı (high-concurrency) maçlar sırasında Dedicated Server'larınızda bellek kaynaklı çökmeleri önler.

Ayrıca bu release candidate, projeyi sekteye uğratabilecek bir editör çökmesini çözüyor: "Editor: Fix crash in Project Settings when an autoload has been freed". Multiplayer projelerde geliştiriciler; ağ oturumlarını, WebSockets bağlantılarını ve durum replikasyonunu (örneğin bir NetworkManager autoload'u) yönetmek için sıklıkla Autoload Singleton yapılarını kullanırlar. Önceki derlemelerde, bir singleton betiği silindiğinde veya yanlış şekilde yeniden içe aktarıldığında (re-import), Proje Ayarlarını (Project Settings) açmak editörün çökmesine neden oluyordu. Bu düzeltme, netcode yapılarını yeniden düzenlerken (refactoring) iş hattı (pipeline) kesintilerini önler.

Güvenli ve Güncellemelere Karşı Dirençli Bir Godot Backend Bağlantısının Anatomisi

Oyununuzu ağ kütüphanesi güncellemelerine karşı korumak için sağlam istemci tarafı ağ sarmalayıcıları (client-side network wrappers) oluşturmalısınız. Doğrudan arayüz (UI) öğelerinden ham HTTP çağrıları yapmak yerine, özel bir ağ koordinatörü (network coordinator) uygulamalısınız. Bu koordinatör, TLS handshake hatalarını açıkça yakalamalı, bağlantı zaman aşımlarını yönetmeli ve üstel geri çekilme (exponential backoff) yeniden deneme mantığını uygulamalıdır.

Aşağıda, güvenli bir backend yöneticisinin eksiksiz ve tipli (typed) bir GDScript uygulaması yer almaktadır. Bu betik, HTTP isteklerinin nasıl güvenli bir şekilde işleneceğini, JSON yüklerinin nasıl güvenli bir şekilde ayrıştırılacağını ve geçici ağ kesintilerinden ya da handshake anomalilerinden nasıl kurtulunacağını göstermektedir.

extends Node
# A robust network coordinator designed to handle backend API requests in Godot 4.x.
# Handles TLS handshakes, response parsing, and implements exponential backoff with jitter.

signal request_failed(error_message: String)
signal request_succeeded(data: Dictionary)

const MAX_RETRIES = 5
const INITIAL_BACKOFF_SECONDS = 1.0
const BACKOFF_MULTIPLIER = 2.0
const JITTER_RANGE = 0.2

@onready var http_request: HTTPRequest = HTTPRequest.new()

func _ready() -> void:
	add_child(http_request)
	http_request.request_completed.connect(_on_request_completed)

# Sends a secure POST request to the API backend
func send_post_request(url: String, payload: Dictionary) -> void:
	var json_payload = JSON.stringify(payload)
	var headers = [
		"Content-Type: application/json",
		"Accept: application/json"
	]
	
	# Enable multi-threaded requests to avoid blocking the main thread
	http_request.use_threads = true
	
	# Start the request loop with retry logic
	_execute_request_with_retry(url, headers, HTTPClient.METHOD_POST, json_payload, 0)

# Executes the network request and handles potential initialization errors
func _execute_request_with_retry(url: String, headers: Array[String], method: HTTPClient.Method, body: String, attempt: int) -> void:
	var error = http_request.request(url, headers, method, body)
	if error != OK:
		_handle_failure("Failed to initialize HTTP request. Error code: %d" % error, url, headers, method, body, attempt)

# Callback invoked when the HTTPRequest node completes the transaction
func _on_request_completed(result: int, response_code: int, headers: PackedStringArray, response_body: PackedByteArray) -> void:
	match result:
		HTTPRequest.RESULT_SUCCESS:
			if response_code >= 200 and response_code < 300:
				var json = JSON.new()
				var parse_error = json.parse(response_body.get_string_from_utf8())
				if parse_error == OK:
					if typeof(json.data) == TYPE_DICTIONARY:
						request_succeeded.emit(json.data)
					else:
						request_failed.emit("Invalid response data format: expected Dictionary.")
				else:
					request_failed.emit("JSON parsing failed: " + json.get_error_message())
			elif response_code == 401 or response_code == 403:
				request_failed.emit("Authentication error. HTTP Status: %d" % response_code)
			else:
				request_failed.emit("Backend server error. HTTP Status: %d" % response_code)
				
		HTTPRequest.RESULT_CONNECTION_ERROR:
			request_failed.emit("Network connection error. Check server availability.")
		HTTPRequest.RESULT_TLS_HANDSHAKE_ERROR:
			request_failed.emit("TLS handshake failed. Check certificate validation or mbedTLS compatibility.")
		HTTPRequest.RESULT_TIMEOUT:
			request_failed.emit("Request timed out.")
		_:
			request_failed.emit("Unknown network error occurred. Code: %d" % result)

# Evaluates failure and executes backoff delay before retrying
func _handle_failure(reason: String, url: String, headers: Array[String], method: HTTPClient.Method, body: String, attempt: int) -> void:
	if attempt < MAX_RETRIES:
		var backoff = INITIAL_BACKOFF_SECONDS * pow(BACKOFF_MULTIPLIER, attempt)
		var jitter = randf_range(-JITTER_RANGE, JITTER_RANGE) * backoff
		var delay = max(0.1, backoff + jitter)
		
		push_warning("Request failed: %s. Retrying in %.2f seconds (Attempt %d/%d)..." % [reason, delay, attempt + 1, MAX_RETRIES])
		await get_tree().create_timer(delay).timeout
		_execute_request_with_retry(url, headers, method, body, attempt + 1)
	else:
		push_error("Max retries reached. Request permanently failed: %s" % reason)
		request_failed.emit("Max retries reached: %s" % reason)

Bu betik, istemci tarafı ağ kütüphanesi güncellemelerinin getirdiği temel sorunları ele almaktadır. HTTPRequest.RESULT_TLS_HANDSHAKE_ERROR hatasını açıkça eşleştirerek, oyununuz sessizce başarısız olmak yerine anlamlı tanılama (diagnostic) verileri kaydedebilir. Ayrıca, HTTP isteklerini use_threads = true ile çalıştırmak, mbedTLS'teki karmaşık kriptografik doğrulama aşamalarında bile ana oyun iş parçacığınızın (main game thread) yanıt vermeye devam etmesini sağlayarak düşük özellikli cihazlarda kare hızı düşüşlerini (frame drops) önler.

Motor Güncellemeleri Boyunca Uyumluluk Nasıl Sağlanır?

Godot bakım sürümü backend uyumluluğunu korumak, titiz bir güncelleme iş hattı (upgrade pipeline) gerektirir. Godot, 4.7.1 gibi bir yama güncellemesi yayınladığında, istemci güncellemesini oyuncularınıza asla hemen sunmamalısınız. Bunun yerine, istemci tarafı ve sunucu tarafı bileşenlerinizin senkronize kaldığını doğrulamak için yapılandırılmış bir doğrulama sürecini takip edin.

İlk olarak, canlı (production) kurulumunuzu taklit eden bir test (staging) ortamı kurun. Dedicated Server'ınızı staging ortamında headless olarak çalıştıran yeni motor derlemesini dağıtın (deploy). Fizik motorundaki değişikliklerin (Jolt'un geçici arabellek tahsisleri gibi) veya shader derleme yollarının beklenmedik çökmeleri tetiklemediğini doğrulamak için otomatik bot istemciler kullanarak yük altında sunucu performansını test edin.

İkinci olarak, sunucunuzun TLS yapılandırmasını doğrulayın. Godot, modern güvenlik yamalarıyla eşleşmesi için dahili TLS motorlarını güncellediğinden, load balancer'larınızın ve API gateway'lerinizin mbedTLS tarafından gereksinim duyulan şifreleme paketlerini (cipher suites) tam olarak desteklediğinden emin olun. Yerel testler için özel kendinden imzalı sertifikalar (self-signed certificates) kullanıyorsanız, Sertifika Yetkilisi (CA) sertifikalarınızı Godot projesine dahil edin ve bunları Proje Ayarlarında (Project Settings) Network/SSL/SSL Certificates altında belirtin. Bu, istemcinizin sunucu sertifikasını, Windows, Android ve iOS cihazları arasında büyük farklılıklar gösterebilen işletim sistemine özgü kök depolara (root stores) güvenmeden yerel olarak doğrulamasını sağlar.

Son olarak, API düzeyinde sürüm geçitlemesi (version gating) uygulayın. İstemci bağlantı isteklerini beyaz listeye (allow-list) almadan önce, istemcinin ilk handshake sırasında motor sürümünü ve yama seviyesini (örneğin 4.7.1-rc2) iletmesini sağlayın. Eğer sunucu uyumsuz bir istemci sürümü veya staging ortamında doğrulanmamış bir istemci sürümü tespit ederse, kullanıcıyı güncelleme yapmaya yönlendiren net bir mesajla giriş isteğini reddedin. Bu durum, yarı güncellenmiş istemcilerin uyumsuz serileştirme (serialization) biçimleri nedeniyle veri tabanı profillerini bozmasını önler.

Ağ Altyapısı Genel Giderlerini Ortadan Kaldırmak

Bu ağ altyapısını manuel olarak kurmak ve sürdürmek, geliştirme kaynakları üzerinde ciddi bir yüktür. Tipik bir indie oyun için; güvenli load balancer'lar kurmak, mbedTLS uyumlu SSL sertifikaları yapılandırmak, WebSocket bağlantılarını yönetmek ve headless sunucuları ölçeklendirmek; load balancer'ların kurulumunu, database sharding (veri tabanı parçalama) ve SSL sertifikası yönetimini gerektirir ve bu da kolayca 4-6 haftalık bir mühendislik çalışması anlamına gelir. Godot, soket davranışını değiştiren bir bakım sürümü yayınladığında, bağlantıyı yeniden kurmak için sunucu yapılandırmalarında hata ayıklayarak (debugging) saatler harcamanız gerekir.

İşte bu noktada bir Backend-as-a-Service, zaman kazandıran bir alternatif sunar. horizOn ile bu backend servisleri önceden yapılandırılmış ve optimize edilmiş olarak gelir; böylece altyapınızı yönetmek yerine oyununuzu yayınlamaya odaklanabilirsiniz. Platform; TLS sonlandırmasını (TLS termination), WebSocket protokol anlaşmalarını ve güvenli veri tabanı etkileşimlerini otomatik olarak yönetir. Godot, mbedTLS kütüphanesini güncellediğinde, platformun uç ağı (edge network) güvenli bağlantı kurmak üzere otomatik olarak uyum sağlar ve oyun istemcinizi temel ağ yığını (network stack) değişikliklerinden korur.

Karmaşık yeniden deneme döngüleri (retry loops) yazmak ve soket hatalarında hata ayıklamak yerine, horizOn'un birleşik oyun backend SDK'sını entegre edersiniz. İster Godot 4.3 çalıştırıyor olun ister en son teknolojiye sahip 4.7.1 RC 2'yi test ediyor olun, SDK bağlantı durumunu, kimlik doğrulamayı (authentication) ve gerçek zamanlı senkronizasyonu (real-time syncing) yönetir. Bu, backend'inizin tüm bakım döngülerinde tamamen uyumlu kalacağından emin olarak oyun mekaniklerini oluşturmaya odaklanabilmenizi sağlar.

Godot Netcode'unuzu Güncellemek İçin 5 En İyi Pratik

Oyununuzun güncellemeler boyunca sorunsuz çalışmasını sağlamak için bu en iyi pratikleri dağıtım iş akışınıza entegre edin:

  1. Export Şablonlarını Sabitleyin (Pin): Otomatik derleme iş hattınızın (automated build pipeline) "en son" Godot export şablonlarını indirmesine asla izin vermeyin. Yerel editörünüz, istemci derlemeleriniz ve Dedicated Server derlemeleriniz arasında binary eşitliği (parity) sağlamak için Godot editörünün ve export şablonlarının tam commit karmasını (hash) ve derleme sürümünü (örneğin 4.7.1-rc2) sabitleyin.

  2. Ağ Yöneticilerini Ayrıştırın (Decouple): Tüm HTTP ve WebSocket mantığınızı özel Autoload Singleton'larında izole edin. Arayüz (UI) betiklerinin veya oynanış nesnelerinin ham bağlantıları yönetmesine izin vermeyin; bu izolasyon, yeni bir motor sürümü için bağlantı parametrelerini ayarlamanız gerektiğinde yalnızca tek bir dosyayı düzenlemenizi sağlar.

  3. Headless Sunucu Shader Yollarını Doğrulayın: Godot 4.7.1 RC 2, headless modda örnek başına shader parametrelerini (per-instance shader parameters) düzelttiğinden; viewport'ları, rendering server'ları veya shader değerlerini kullanan tüm sunucu tarafı kodlarını denetleyin. Görsel düğümlerin fiziksel hesaplamaları etkileyen mantıklar çalıştırmadığından emin olarak sunucu oynanış güncellemelerinin deterministik kalmasını sağlayın.

  4. mbedTLS Handshake Hatalarını İzleyin: RESULT_TLS_HANDSHAKE_ERROR hatasını yakalayan istemci tarafı günlük kaydı (client-side logging) uygulayın. Eski işletim sistemlerine sahip oyuncuların TLS şifre uyuşmazlığı (cipher mismatches) nedeniyle bağlanamadığını tespit edebilmek için bu günlükleri merkezi bir hata izleme servisine gönderin.

  5. Geçişler Sırasında Paralel Sunucu Örnekleri Çalıştırın: Yeni bir motor derlemesi gerektiren bir istemci yaması (client patch) dağıtırken, hem eski hem de yeni Dedicated Server örneklerini paralel olarak çalıştırın. Eski istemci sürümündeki oyuncuların eski sunucularda aktif oturumlarını tamamlamalarına izin verirken, güncellenmiş istemcileri yeni sunuculara yönlendirerek ani bağlantı kesintilerini önleyin.

Ağ kütüphanelerini yönetme zahmetine katlanmadan multiplayer backend'inizi ölçeklendirmeye hazır mısınız? horizOn'u ücretsiz deneyin veya Godot projenize güvenli, güncellemelere dayanıklı multiplayer özelliklerini nasıl kolayca entegre edebileceğinizi öğrenmek için API belgelerine göz atın.


Kaynak: Release candidate: Godot 4.7.1 RC 2