Servidores de Jogos

Timers, desempenho e boas práticas de script

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 (getElementsByType em todo frame);
  • Não faça triggerServerEvent no 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.

Compartilhar:

Pronto para hospedar seu próximo projeto?

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

Ver planos VPS