Servidores de Jogos

Otimizando loops e timers no gamemode

Otimizando loops e timers no gamemode

Loops e timers estão por trás da maioria dos problemas de desempenho em gamemodes. Pequenas mudanças podem reduzir bastante o uso de CPU.

1. Não percorra slots vazios

// ruim: percorre todos os slots, mesmo com 30 jogadores online
for (new i = 0; i < MAX_PLAYERS; i++)

// melhor: vai só até o maior ID em uso
for (new i = 0, j = GetPlayerPoolSize(); i <= j; i++)

// ainda melhor: só jogadores conectados (YSI)
foreach (new i : Player)

Com MAX_PLAYERS em 1.000, a diferença é grande.

2. Não recalcule o que não muda

// ruim: chama a função na condição a cada volta do loop
for (new i = 0; i < ContarCasas(); i++)

// melhor
for (new i = 0, total = ContarCasas(); i < total; i++)

Guarde em variáveis os valores usados várias vezes (nome do jogador, posição).

3. Saia cedo

Use continue e break para evitar trabalho desnecessário. Coloque as checagens mais baratas primeiro:

if (!Jogador[i][jLogado]) continue;          // barato
if (!IsPlayerInRangeOfPoint(i, 50.0, x, y, z)) continue; // mais caro

4. Loops aninhados: cuidado

Jogador x jogador (1.000 x 1.000) ou jogador x casas (1.000 x 5.000) explodem rapidamente. Alternativas:

  • Áreas do Streamer em vez de checar distância manualmente;
  • Estruturas por região;
  • Checagens menos frequentes.

5. Timers: poucos e com intervalos sensatos

  • Um timer global em vez de um por jogador;
  • Intervalos compatíveis com a necessidade (fome a cada minuto, não a cada segundo);
  • KillTimer ao sair ou desconectar.

6. Distribua tarefas pesadas

Salvar 300 jogadores no mesmo tick gera um pico. Divida:

static indiceSalvar = 0;
// a cada segundo, salva 10 jogadores
for (new n = 0; n < 10; n++)
{
    if (IsPlayerConnected(indiceSalvar) && Jogador[indiceSalvar][jLogado])
        SalvarJogador(indiceSalvar);
    if (++indiceSalvar > GetPlayerPoolSize()) indiceSalvar = 0;
}

7. Strings

format e operações com strings grandes são relativamente caras. Evite montar textos que ninguém vai ver (por exemplo, textdraws de jogadores que não estão com o HUD aberto).

Meça antes e depois

Use a medição com GetTickCount do post "Medindo o desempenho do servidor" para confirmar que a otimização valeu a pena.

Hospede seu servidor com a VittHost

Nos planos OPENMP-BR da VittHost, você vê o efeito das otimizações no uso de CPU pelo painel Pterodactyl. Servidores no Brasil, proteção DDoS, MySQL incluso, compatibilidade total com scripts SA-MP 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