02/06/2024 20:26
(02/06/2024 00:21)blueN Escreveu: Otimização vai além de você apenas alterar o funcionamento de um timer ou deixar de usar uma callback nativa como é o caso de OnPlayerUpdate. A otimização vai desde plugins até mesmo a forma como você salva os dados do servidor enfim.
Umas dicas que eu tenho para te dar.
1. Não use DOF2/DINI/SQLite para salvamentos de dados, seja em empresa, jogadores, itens, veículos enfim, tudo relacionado á dados.
2. Busque sempre usar o MySQL, até mesmo para lhe ajudar no crescimento do seu projeto, integrações com outros sistemas externos.
3. Sempre faça sua query MySQL da forma mais otimizada possível, vou passar umas dicas abaixo mas recomendo que em caso de dúvidas busque no ChatGPT pode ser o free mesmo, ele vai lhe auxiliar bastante caso você seja iniciante nessa área.
3.1. Sempre salve dados de jogador, empresa, veículos por id, jamais utilize uma string para fazer consulta pois o processo para buscar é bem mais demorado do que pelo id onde o MySQL saberá exatamente onde ir.
3.1.1. Essa regra acima não se aplica para a primeira busca de conta de jogador por exemplo. Pois a única informação que você terá dessa pessoa é apenas o nick, mas após isso, após a conexão e autenticação dele, sempre use o ID para atualizações de dados. Mesma coisa para os demais sistemas como o de empresa por exemplo.
4. Jamais utilize o mysql_query com exceção do OnGameModeInit. Todas as suas consultas devem ser feitas via mysql_tquery ou mysql_pquery pois são assíncronas e o processo em sí não travará a thread do seu servidor e o funcionamento do servidor continuará sem nenhum problema. Juntando essa dica com a dica 3 você já verá uma enorme diferença no consumo de CPU do seu projeto.
5. Caso utilize o Y_Hooks(YSI) é sempre bom se atentar como você vai utilizar às funções. Vamos lá, caso você aperte uma tecla o Y_Hooks percorrerá todas as callbacks comparando o que você escreveu no código, se você por exemplo colocou uma função no "F" para entrar em algum interior e o Y_Hooks passou por onde você colocou essa lógica de código, não há necessidade dele continuar percorrendo todo o código procurando por mais informações no "F" correto?
Então faça o seguinte, toda via que você entender que não precisa mais o Y_Hooks continuar rodando, utilize o Y_HOOKS_BREAK_RETURN 1 ou 0 para que ele pare e não continue mais para nenhum outro canto a não ser que a tecla seja pressionada novamente, segue abaixo um exemplo de funcionamento.
Código PHP:hook OnPlayerKeyStateChange(playerid, newkeys, oldkeys) {
if(newkeys == KEY_SECONDARY_ATTACK) {
if(IsPlayerInRangeOfPoint(playerid, 2.0, 0.0, 0.0, 0.0)) {
// Eu estou na posição 0.0 0.0 0.0 e era essa informação que eu estava buscando usei o Y_HOOKS_BREAK_RETURN_1 para que o código não continue mais
return Y_HOOKS_BREAK_RETURN_1;
}
// Caso eu não estivesse, ele iria continuar normalmente
}
return Y_HOOKS_CONTINUE_RETURN_1;
}
Lembrando que esse exemplo serve para tudo que utiliza Y_Hooks, literalmente tudo.
6. Recomendo também a utilização de Y_Iterate/Foreach, isso é de extrema importância para evitar longas verificações. Exemplo abaixo.
Jogador 1 - Conectado
Jogador 2 - Desconectado
Jogador 3 - Conectado
Utilizando um "for(new i = 0; i < MAX_PLAYERS; i++)" ele iria fazer 1000 verificações para saber quais jogadores estão conectados, então ele ainda passaria dentro do jogador 2 que não está conectado.
Utilizando um "foreach(new i: Players)" ele iria passar apenas em 2 jogadores, o jogador 1 e jogador 3 pois apenas eles dois estão conectados no servidor reduzindo MUITO o loop para apenas 2 verificações que é exatamente o que você está procurando.
Utilizando agora o Iterate do YSI você pode criar informações personalizadas como por exemplo, lista de admins apenas, lista de jogadores logados, lista de casas, lista de empresas enfim, tudo com apenas informações que estão sendo utilizadas. Por mais que você crie um define com 300 e só 10 informações estejam realmente sendo utilizadas, o Iterate junto com o Foreach fará esse papel de passar apenas nas informações válidas.
Recomendo que você busque em https://github.com/pawn-lang/YSI-Includes/tree/5.x por mais informações referente à esses sistemas e como usar de forma correta, lembrando que não é um bicho de 7 cabeça.
8. Por fim, alguns plugins estão muito mal otimizados, um deles e o mais famoso é o Streamer, a versão mais recente tem um problema muito grande em seu código fonte referente às atualizações. Então é recomendado usar uma versão mais antiga. Vou deixar listado abaixo os plugins que estão com problemas de otimização e sua versão recomendada.
- Streamer (Problema na atualização de objetos causando lag na maquina)
- Sscanf (Sua versão atualizada não é tão otimizada, uma versão mais antiga tá bem mais estável)
Para descobrir qual é a versão recomendada, olhe as issues no seu repositório do github, há usuários relatando o problema e mostrando a versão que está normalizada.
Dicas muito úteis. Apenas queria ressaltar que nem sempre utilizar versões antigas de um plugin é uma boa escolha. Isso vale para qualquer tipo de software. Mesmo se a performance em uma versão antiga for superior, utilizar uma versão antiga te expõe a mais bugs que possivelmente foram consertados em versões recentes. Se você usa o servidor do open.mp, não é uma escolha utilizar uma versão antiga do sscanf, já que o sscanf apenas foi atualizado para o SDK do open.mp nas versões mais recentes do plugin.
Não estou disponível para realizar serviços relacionados ao SA-MP e não costumo responder a mensagens privadas, a menos que estejam relacionadas à moderação do fórum.