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);
KillTimerao 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.