
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.
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.
| Belirti | Muhtemel sebep |
|---|---|
| Sürekli düşük FPS, herkeste | Ağır client-side script veya çok fazla element |
| Belirli anlarda donma | Yavaş MySQL sorgusu veya senkron dosya işlemi |
| Oyuncu sayısıyla artan lag | Oyuncu başına çalışan timer’lar |
| Girişte takılma | Login 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.