FiveM Sunucu Optimizasyonu: resmon, Lag ve txAdmin Yönetimi
FiveM sunucunuzdaki lag, hitch warning ve FPS düşüşlerini resmon 1, döngü uyku süreleri, txAdmin profiler ve doku optimizasyonuyla çözün.
İçindekiler
FiveM sunucularında oyuncu sayısı arttıkça karşılaşılan donmalar, ışınlanmalar, mermi gecikmeleri ve FPS düşüşleri genellikle donanım yetersizliğinden ziyade optimize edilmemiş scriptlerden kaynaklanır. FXServer ana oyun döngüsünü tek bir iş parçacığında (server thread) yürütür. Bu ana döngüye binen her mikrosaniyelik fazladan hesaplama yükü veya istemci tarafında her karede gereksiz yere yinelenen döngüler, oyuncuların tamamına yansıyan bir performans kaybı üretir.
Sunucudaki gecikmeleri gidermek için istemci tarafındaki kaynakları resmon 1 ile ölçmek, Lua döngülerine dinamik bekleme süreleri eklemek, txAdmin Profiler aracıyla sunucu tarafı gecikme uyarılarını (hitch warnings) ayrıştırmak ve sunucu belleğini rahatlatmak gerekir.
resmon 1 ile istemci tarafı CPU ve bellek tüketiminin tespiti
FiveM istemcisinde çalışan eklentilerin işlemci üzerinde harcadığı süreyi doğrudan takip edebilirsiniz. Oyun içindeyken F8 tuşuna basarak konsolu açın ve kaynak izleme aracını çalıştırın:
resmon 1
Ekranın sağ tarafında açılan tabloda sunucudaki her bir scriptin istemci üzerinde tükettiği süre milisaniye (ms) cinsinden ve harcadığı RAM miktarı (MiB) olarak listelenir. Bu değerleri incelerken aşağıdaki sınırları referans alabilirsiniz:
| ms Aralığı | Durum | Değerlendirme |
|---|---|---|
| 0.00 – 0.03 ms | İdeal | Script boşta dururken veya arka planda sessiz çalışırken kaynak harcamıyor. |
| 0.04 – 0.08 ms | Orta | Ekrana çizim yapan veya aktif tuş dinleyen kaynaklar için kabul edilebilir sınır. |
| 0.09 – 0.15 ms | Riskli | Optimize edilmemiş döngü veya sık tetiklenen mesafe kontrolü içeriyor. |
| 0.16 ms ve üzeri | Kritik | Wait(0) döngüsü içeren, her karede çizim veya veri hesaplayan hatalı kod. |
Tabloyu incelerken oyuncuların belirli bir bölgeye (örneğin karakol veya galeri) gittiğinde aniden sıçrayan değerleri gözlemleyin. Bir araç galerisi veya envanter scripti oyuncu hiçbir menü açmadığı halde sürekli 0.10 ms üzerinde kalıyorsa, o scriptin döngü yapısı incelenmelidir. Kaynak izleme tablosunu kapatmak için F8 konsoluna resmon 0 yazabilirsiniz.
Lua döngülerinde Wait(0) tuzakları ve dinamik uyku optimizasyonu
İstemci tarafında yaşanan yüksek CPU tüketiminin en yaygın nedeni, sonsuz döngülerin (while true do) içine yerleştirilen sabit Citizen.Wait(0) komutlarıdır. Wait(0), döngünün oyunun oluşturduğu her karede (frame) baştan sona çalışması anlamına gelir. 144 Hz monitör kullanan bir oyuncuda bu blok saniyede 144 kez baştan hesaplanır.
Oyuncu etkileşim noktasından kilometrelerce uzaktayken bile ekrana 3D yazı çizmek veya klavye tuşunu dinlemek istemciyi yorar. Bu sorunu çözmek için mesafe bazlı dinamik uyku mantığı uygulanmalıdır:
CreateThread(function()
local hedefNokta = vector3(215.8, -810.1, 30.7)
while true do
local beklemeSuresi = 1000
local oyuncuPed = PlayerPedId()
local oyuncuKonum = GetEntityCoords(oyuncuPed)
local mesafe = #(oyuncuKonum - hedefNokta)
if mesafe < 20.0 then
beklemeSuresi = 0
DrawMarker(1, hedefNokta.x, hedefNokta.y, hedefNokta.z - 1.0, 0, 0, 0, 0, 0, 0, 1.0, 1.0, 1.0, 0, 255, 0, 150, false, false, 2, false, nil, nil, false)
if mesafe < 2.0 then
-- E tuşuna basılıp basılmadığını kontrol et
if IsControlJustReleased(0, 38) then
TriggerEvent("etkilesim:menuAc")
end
end
end
Wait(beklemeSuresi)
end
end)
Yukarıdaki yapılandırmada oyuncu hedef noktadan 20 birim uzaktayken kod saniyede yalnızca 1 kez (Wait(1000)) çalışır ve tüketim 0.01 ms seviyesinde kalır. Oyuncu noktaya yaklaştığında bekleme süresi otomatik olarak 0 değerine çekilir ve çizim akıcı şekilde yürütülür.
Veritabanı sorgularının optimize edilmesi ve toplu işlem mantığı
Sunucuda oyuncu sayısı arttıkça ortaya çıkan donmaların bir diğer ana sebebi veritabanı (MySQL) darboğazlarıdır. Her oyuncunun parası, konumu veya envanteri değiştiğinde ana döngü içerisinden senkron SQL sorgusu göndermek, sunucu iş parçacığının yanıt beklerken kilitlenmesine sebep olur:
- Döngü içinde SQL çalıştırmaktan kaçının: 60 oyuncunun verisini kaydederken döngü kurup 60 ayrı
UPDATEsorgusu göndermek yerine, verileri tek bir toplu işlem (transaction) veya tek bir çoklu sorgu kalıbı içinde veritabanına iletin. - Asenkron kütüphaneler kullanın:
oxmysqlgibi modern veritabanı katmanları sorguları ayrı bir iş parçacığında çalıştırır. Sorgu tamamlanana kadar FXServer ana döngüsü bekleme yapmaz, tick üretmeye devam eder. - Sütun indeksleme yapın:
usersveyaplayer_inventorytablolarında sorgulama yapılanidentifier,citizenidveyaplatesütunlarına MySQL üzerindeINDEXtanımlayın. İndeks bulunmayan büyük tablolarda her sorgu tam tablo taraması (full table scan) yapar ve gecikmeye yol açar.
txAdmin Profiler ile sunucu tarafı gecikme (hitch warning) analizi
Sunucu konsolunda sıkça görülen Server thread hitch warning: timer took X ms uyarısı, sunucunun tek bir tick döngüsünü 50 milisaniyelik hedef süre içinde tamamlayamadığını gösterir. Örneğin 200 ms süren bir hitch uyarısı, oyun dünyasının 150 milisaniye boyunca durakladığı anlamına gelir.
Hangi eklentinin veya veritabanı olayının bu takılmaya yol açtığını tespit etmek için txAdmin Profiler aracını kullanabilirsiniz. Sunucu konsoluna veya txAdmin canlı konsoluna şu komutu girin:
profiler record 500
Bu komut sonraki 500 tick boyunca çalışan tüm sunucu fonksiyonlarını ve çağrı sürelerini kaydeder. Kayıt tamamlandığında konsola bir bağlantı adresi gelir veya doğrudan şu komutla veriyi inceleyebilirsiniz:
profiler view
Açılan profiler arayüzünde çağrılan fonksiyonlar milisaniye cinsinden sıralanır. Listedeki en uzun çubukları inceleyerek hangi scriptin hangi veritabanı çağrısında veya hangi döngüde takıldığını nokta atışı görebilirsiniz.
Harita (MLO) ve araç dokusu (texture) optimizasyonu
FiveM sunucularında istemcilerin FPS düşüşü ve "doku kaybı" (texture loss / yolun ve binaların görünmez olması) yaşamasının temel nedeni, sunucuya eklenen optimize edilmemiş harita ve araç modelleridir.
İstemci ekran kartı belleğini (VRAM) aşırı yüklememek için şu adımlara dikkat edilmelidir:
- 16 MB doku sınırı:
.ytduzantılı doku sözlüğü dosyalarının 16 MB boyutunu aşmaması gerekir. 30–50 MB boyutunda dokular içeren araçlar, yakındaki tüm oyuncuların VRAM havuzunu doldurarak doku kayıplarına yol açar. OpenIV aracıyla bu dokular açılarak 4K çözünürlükteki gereksiz dokular 1080p veya 2K seviyesine sıkıştırılmalıdır. - Yüksek poligonlu modeller: 300.000 poligon üzerindeki araç ve karakter modelleri istemci işlemcisinin çizim çağrılarını (draw calls) artırır.
- Harici medya sunucuları kullanımı: Envanterdeki eşya simgeleri, araç galerisindeki görseller ve özel ses dosyaları doğrudan FXServer kaynakları içerisine gömüldüğünde sunucu belleğini tüketir. Bu statik dosyaları FiveManage gibi harici bir medya ve CDN sunucusuna yönlendirmek, istemcilerin görselleri web üzerinden doğrudan çekmesini sağlar ve oyun sunucusunun ağ yükünü hafifletir.
FiveM gecikme ve takılma sorunları için karar tablosu
Karşılaştığınız performans problemine göre ilk müdahale noktasını belirlemek için aşağıdaki tablodan yararlanabilirsiniz:
| Yaşanan Belirti | Olası Kök Neden | Uygulanacak İlk Müdahale |
|---|---|---|
| Ekranda anlık FPS düşüşü ve takılma | İstemci tarafında yüksek ms tüketen script | F8 konsolunda resmon 1 açarak 0.10 ms üzerindeki kaynakları tespit edin. |
| Karakter ve araçların havada donması | Sunucu tarafı hitch warning (tick gecikmesi) | Konsolda profiler record 500 çalıştırarak tıkanan fonksiyonu bulun. |
| Yolların ve binaların geç yüklenmesi | Yüksek boyutlu doku (.ytd) veya harita modu | 16 MB üzerindeki araç ve harita dokularını sıkıştırın. |
| Envanter veya menülerin geç açılması | Veritabanı sorgu kuyruğunun kilitlenmesi | oxmysql asenkron çağrılarını ve sütun indekslerini denetleyin. |
| Oyuncuların aniden sunucudan düşmesi | UDP paket kaybı veya bant genişliği doygunluğu | Ağ trafiğini ve güvenlik duvarı filtreleme kurallarını inceleyin. |
Donanım mimarisi ve ağ güvenliğinin performansa etkisi
Script optimizasyonları sunucu üzerindeki gereksiz yükü kaldırsa da, 60–128 ve üzeri oyuncu barındıran topluluk sunucularında tek iş parçacığı performansının fiziksel gücü belirleyicidir. FiveM motoru çekirdek sayısından çok, tek bir çekirdeğin döngüleri ne kadar yüksek saat hızında işleyebildiğine bakar.
Yüksek oyuncu kapasiteli FiveM toplulukları için Ekstrem VDS paketlerinde AMD Ryzen 9 9950X işlemci ve DDR5 bellek sunulur. İşlemci kaynakları paylaşımsız olarak ayrılmış (dedicated) vCore biçiminde tanımlanır ve Samsung 990 Pro Gen4 NVMe depolama ile veritabanı I/O darboğazları önlenir. Altyapı Mars İstanbul Veri Merkezi bünyesinde barındırılır ve 10 Gbps port hızıyla desteklenir.
Oyun sunucularına yönelik saldırılara karşı TRSHIELD DDoS koruması tüm paketlerde ek ücret olmadan standart olarak yer alır. TRSHIELD 12 Tbps DDoS koruma kapasitesi ile bilinen bütün saldırı vektörlerine karşı koruma sağlar. TRSHIELD'da FiveM için udp/30120 bağlantı doğrulaması ve tcp/30120 SYN koruması profili bulunur. Bu profil sunucunun FiveM genel sunucu listesinde görünmesine engel olmaz, ek izin listesi ayarı gerektirmez ve aynı zamanda RedM sunucularını da korur.
Büyük kod güncellemeleri veya framework değişiklikleri öncesinde sistem durumunu korumak için her VPS ve VDS paketinde 1 adet ücretsiz snapshot hakkı sunulur. Projeniz için oyun sunucusu seçeneklerimizi inceleyebilir; sunucu listeleme ayarları için FiveM server listesinde görünmeme sorunu ve yetkilendirme adımları için FiveM Hex ID öğrenme ve yetki verme rehberlerimize göz atabilirsiniz.
Sık sorulan sorular
resmon 1 konsolunda normal bir scriptin CPU tüketimi ne kadar olmalıdır?
Boşta duran veya arka planda çalışan bir scriptin tüketimi 0.01 ms ile 0.03 ms arasında kalmalıdır. 0.05 ms üzerindeki değerler incelenmeli, 0.10 ms ve üzerini sürekli tüketen kaynaklar döngü optimizasyonuna alınmalıdır.
Server thread hitch warning uyarısı neden kaynaklanır?
FiveM ana sunucu döngüsü varsayılan olarak her tick'i yaklaşık 50 milisaniyede tamamlamayı hedefler. Sunucu tarafındaki ağır bir veritabanı sorgusu veya optimize edilmemiş bir döngü bu süreyi aştığında konsola hitch warning uyarısı düşer.
Döngülerde Wait(0) yerine dinamik uyku süresi nasıl ayarlanır?
Oyuncu ilgili etkileşim noktasına veya bölgeye uzakken döngü 500 veya 1000 milisaniye uyutulur. Oyuncu bölgeye yaklaştığında uyku süresi sıfıra indirilerek tuş dinleme ve çizim fonksiyonları devreye sokulur.
Harici medya sunucuları FiveM performansını nasıl etkiler?
Araç galerisi veya envanter görselleri gibi yüksek boyutlu statik dosyaların harici bir HTTP sunucusundan çekilmesi, FiveM sunucusunun bellek tüketimini ve ağ bant genişliği yükünü hafifletir.