Otimizando scripts Lua que consomem muita CPU
Você identificou no performancebrowser o resource que mais pesa. E agora? Estas são as otimizações que costumam trazer os maiores ganhos.
1. Faça menos vezes
A pergunta mais importante: isso precisa rodar tão frequentemente?
- Fome e sede a cada segundo → a cada minuto;
- Verificar posição de todos os jogadores a cada 100 ms → a cada 1–2 segundos;
- Atualizar ranking a cada morte → a cada 5 minutos.
2. Use eventos em vez de verificações
Em vez de verificar em loop se o jogador entrou numa área, use colshapes:
local area = createColSphere(x, y, z, 5)
addEventHandler("onColShapeHit", area, function(elemento)
if getElementType(elemento) == "player" then
-- entrou na área
end
end)
O MTA avisa quando algo entra ou sai — sem loops.
3. Estruturas de dados certas
Buscar em lista é lento; buscar em tabela indexada é rápido.
-- lento: percorre a lista toda
for _, v in ipairs(veiculosDoJogador) do
if v.placa == placa then ... end
end
-- rápido: acesso direto
local veiculo = veiculoPorPlaca[placa]
4. Cache de resultados
Guarde resultados que não mudam com frequência (preços, configurações, dados do jogador) em vez de recalcular ou consultar o banco toda vez.
5. Evite trabalho por jogador em timers globais pesados
Um timer que, a cada segundo, faz uma consulta ao banco para cada jogador é uma bomba com 300 jogadores. Distribua o trabalho ao longo do tempo ou mantenha os dados em memória.
6. Localize funções usadas em loops
local getElementPosition = getElementPosition
local getDistanceBetweenPoints3D = getDistanceBetweenPoints3D
Pequeno ganho, mas útil em loops muito frequentes.
7. Cuidado com strings em loops
Concatenar strings repetidamente em loops cria muito lixo de memória. Use table.concat para montar textos grandes.
8. Consultas assíncronas
Nunca espere o banco (dbPoll(qh, -1)) em código que roda durante o jogo.
9. Lado do cliente
Mova para o cliente o que for visual e não precisa de autoridade — o servidor fica com menos trabalho. Mas nunca mova validações.
10. Meça de novo
Depois de cada mudança, confira o Lua timing no performancebrowser.
Hospede seu servidor com a VittHost
No MTASA-BR da VittHost, seu código 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.