Timers, desempenho e boas práticas de script
Scripts mal escritos são a principal causa de lag em servidores de MTA. Algumas práticas simples fazem enorme diferença.
setTimer com moderação
setTimer(funcao, intervaloMs, repeticoes, ...)
repeticoes = 0→ repete para sempre.
Erro comum: um timer por jogador
-- ruim: um timer de 1s para cada jogador
addEventHandler("onPlayerJoin", root, function()
setTimer(atualizarFome, 1000, 0, source)
end)
Com 300 jogadores, são 300 timers. Melhor:
-- bom: um timer global que processa todos
setTimer(function()
for _, jogador in ipairs(getElementsByType("player")) do
atualizarFome(jogador)
end
end, 60000, 0)
E será que fome precisa mudar a cada segundo? A cada minuto costuma bastar.
Sempre cancele timers
Guarde a referência e cancele quando não for mais necessário (jogador saiu, emprego acabou):
if isTimer(t) then killTimer(t) end
onClientRender: código a cada frame
Tudo dentro de onClientRender roda dezenas de vezes por segundo:
- Não crie tabelas, fontes ou texturas ali — crie uma vez fora;
- Não chame funções pesadas (
getElementsByTypeem todo frame); - Não faça
triggerServerEventno render; - Só adicione o handler quando a interface estiver aberta, e remova ao fechar.
Variáveis locais
Acessar variáveis local é mais rápido que globais. Funções usadas muito também podem ser "cacheadas":
local getPlayerMoney = getPlayerMoney
Evite buscas repetidas
-- ruim: percorre todos os veículos a cada chamada
local function acharVeiculoDoJogador(jogador) ... end
-- bom: mantenha uma tabela jogador -> veículo, atualizada nos eventos
local veiculoDe = {}
Banco de dados sem travar
Use consultas assíncronas (dbQuery com callback) para não congelar o servidor. Veja o post "Otimizando consultas com dbQuery assíncrono".
Limpe a memória
Tabelas indexadas por jogador precisam ser limpas no onPlayerQuit:
addEventHandler("onPlayerQuit", root, function()
dados[source] = nil
end)
Caso contrário, a memória cresce sem parar.
Meça
Use o performancebrowser e o comando ipb para descobrir quais resources mais consomem CPU. Otimize com base em dados, não em suposições.
Hospede seu servidor com a VittHost
No MTASA-BR da VittHost, seu código bem otimizado roda em servidores no Brasil, com proteção DDoS, painel Pterodactyl, MySQL incluso, downloads acelerados por nginx dedicado e teste grátis de 3 dias.