MTA:SA Sunucu Optimizasyonu: Lag'in Gerçek Sebebini Bulmak

MTA:SA Sunucu Optimizasyonu: Lag'in Gerçek Sebebini Bulmak

MTA:SA roleplay sunucunuz takılıyorsa sorun genellikle donanım değildir. Lua script profillemesi, MySQL sorgu optimizasyonu, timer yönetimi ve element sayısı kontrolü ile lag'i kaynağında çözün.

White Bilişim
Paylaş
Yapay zekâya sor ChatGPT Claude

MTA:SA Sunucu Optimizasyonu

MTA:SA sunucunuz takılıyorsa ilk refleks genelde paketi büyütmek olur. Oysa MTA:SA’da lag’in büyük bölümü donanımdan değil, optimize edilmemiş Lua script’lerinden ve yavaş MySQL sorgularından kaynaklanır. Bu rehberde sorunun kaynağını ölçerek bulmayı ve doğru yerden çözmeyi anlatıyoruz.

Önce Ölçün: Sorun Nerede?

Sunucu konsolunda çalıştırabileceğiniz iki komut, tahmin yürütmeyi bitirir:

performancebrowser
debugscript 3

performancebrowser, hangi kaynağın (resource) ne kadar CPU zamanı harcadığını gösterir. Genellikle sonuç şaşırtıcıdır: sunucu yükünün büyük bölümünü bir veya iki kaynak üretir.

BelirtiMuhtemel sebep
Sürekli düşük FPS, herkesteAğır client-side script veya çok fazla element
Belirli anlarda donmaYavaş MySQL sorgusu veya senkron dosya işlemi
Oyuncu sayısıyla artan lagOyuncu başına çalışan timer’lar
Girişte takılmaLogin sırasında çalışan ağır sorgular

1. Timer Yönetimi

En yaygın hata, oyuncu başına sürekli çalışan timer açmaktır. 200 oyunculu bir sunucuda saniyede bir çalışan bir timer, saniyede 200 fonksiyon çağrısı demektir.

-- Kötü: her oyuncu için ayrı timer
for _, player in ipairs(getElementsByType("player")) do
    setTimer(updatePlayerStats, 1000, 0, player)
end
 
-- İyi: tek timer, döngü içinde işlem
setTimer(function()
    for _, player in ipairs(getElementsByType("player")) do
        updatePlayerStats(player)
    end
end, 5000, 0)

💡 Timer aralığını uzatmak da başlı başına bir kazançtır. Kullanıcının fark etmeyeceği işlemler için 1 saniye yerine 5 saniye kullanın.

2. MySQL Sorgularını Asenkron Yapın

MTA:SA’da senkron bir veritabanı sorgusu, sorgu bitene kadar tüm sunucuyu bekletir. Tek bir yavaş sorgu herkesin ekranını dondurur.

-- Kötü: sunucuyu bloke eder
local result = dbPoll(dbQuery(connection, "SELECT * FROM accounts"), -1)
 
-- İyi: asenkron, callback ile
dbQuery(function(qh)
    local result = dbPoll(qh, 0)
    -- işlem
end, connection, "SELECT * FROM accounts WHERE id = ?", playerId)

Ayrıca sorgularınızın kullandığı sütunlarda indeks olduğundan emin olun:

CREATE INDEX idx_accounts_serial ON accounts(serial);

İndekssiz bir tabloda 100.000 satırlık arama, her girişte sunucuyu bekletir.

3. Element Sayısını Kontrol Edin

MTA:SA’da her nesne, marker, blip ve pickup bir elementtir ve senkronizasyon maliyeti taşır.

-- Kaç element var?
outputConsole(#getElementsByType("object"))
outputConsole(#getElementsByType("marker"))
outputConsole(#getElementsByType("blip"))

Binlerce marker ve blip, oyuncu tarafında FPS düşüşünün doğrudan sebebidir. Yalnızca yakındaki oyunculara görünen elementler oluşturmak için streamer mantığı kullanın: oyuncu bölgeye girdiğinde oluşturun, çıktığında yok edin.

4. Client-Side Yükü Azaltın

onClientRender içine yazılan her satır, saniyede oyuncunun FPS’i kadar çalışır. 60 FPS’te bu saniyede 60 çalıştırma demektir.

-- Kötü: her karede hesaplama
addEventHandler("onClientRender", root, function()
    local distance = getDistanceBetweenPoints3D(...)  -- her karede
    if distance < 10 then dxDrawText(...) end
end)
 
-- İyi: mesafe kontrolü daha seyrek
local isNear = false
setTimer(function() isNear = checkDistance() end, 500, 0)
addEventHandler("onClientRender", root, function()
    if isNear then dxDrawText(...) end
end)

5. Kaynakları Gerektiğinde Başlatın

Sunucu açılışında çalışan her kaynak bellek tüketir. Sadece belirli etkinliklerde kullanılan kaynakları start/stop ile yönetin; sürekli açık tutmayın.

Donanımı Ne Zaman Büyütmeli?

Yukarıdaki adımları uyguladıktan sonra hâlâ sorun yaşıyorsanız donanım gerçekten darboğaz olabilir. Şu durumlarda paket yükseltmek anlamlıdır:

  • performancebrowser çıktısında yük tek bir kaynakta toplanmıyor, dengeli dağılmış durumda
  • Sunucu belleği sürekli sınıra dayanıyor
  • MySQL ve oyun sunucusu aynı makinede ve ikisi de yoğun

🚀 200 slotun üzerindeki roleplay sunucularında yüksek tek çekirdek hızı belirgin fark yaratır. Ryzen Premium VDS paketleri bu senaryo için uygundur.

Sonuç

MTA:SA optimizasyonu, ölçmekle başlar. Timer sayısını azaltmak, sorguları asenkron hâle getirmek ve element sayısını kontrol altında tutmak, çoğu oyun sunucusunda paket büyütmekten daha fazla kazanç sağlar.

👉 Kurulumdan başlıyorsanız MTA:SA sunucu kurulumu rehberi yazımıza, paket eşleştirmesi için MTA:SA sunucu kiralama sayfamıza göz atın.