Servidores de Jogos

Otimizando scripts Lua que consomem muita CPU

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.

Compartilhar:

Pronto para hospedar seu próximo projeto?

VPS com painel pré-instalado em 1 clique. Ativação imediata.

Ver planos VPS