Portal SAMP
[Pedido] Otimizações e Dúvidas - Versão de Impressão

+- Portal SAMP (https://portalsamp.com)
+-- Fórum: SA-MP (https://portalsamp.com/forumdisplay.php?fid=5)
+--- Fórum: Área de suporte (https://portalsamp.com/forumdisplay.php?fid=6)
+--- Tópico: [Pedido] Otimizações e Dúvidas (/showthread.php?tid=4786)



Otimizações e Dúvidas - FormigaPWN - 01/06/2024

Bom eu já estou na linguagem pawno/pawn faz exatamentes 2 anos eu consigo me virar bastante e desde do meu inicio eu tento aprender coisas novas mais infelizmente na raça pois não tem cursos e os que tem eu nem sei por onde vai. Bom eu queria saber alguns indicies de otimizações se alguém poder ajudar e me dizer recomendações do que posso fazer para aprender mais sobre otimizações. Eu estava em dúvida em algumas coisas sobre otmização em si se... Códigos em comentários ou muitos warnings, se eles dão lag no servidor ou algo do tipo, se muito warning pode ocasionar em lag ou pode atrapalhar em algo, quais warnings tenho que tomar cuidado e quais cuidados tenho que tomar. 

Alguém poder da uma ajudinha nesses conhecimentos acima eu irei ficar agradecido. Smile


RE: Otimizações e Dúvidas - BitSain - 01/06/2024

Para otimizar seu código e melhorar o desempenho do servidor, é importante entender que comentários e warnings têm impactos diferentes. Comentários não afetam o desempenho, pois são ignorados pelo compilador e servem apenas para documentação. Use-os com moderação para explicar partes complexas do código. Por outro lado, warnings indicam possíveis problemas que, embora não impeçam a compilação, podem causar comportamentos inesperados. É uma boa prática corrigir todos os warnings, especialmente aqueles relacionados a variáveis não inicializadas, variáveis não utilizadas e funções obsoletas.

Para melhorar a eficiência do código, escolha as estruturas de dados adequadas e otimize algoritmos para reduzir a complexidade. Evite loops aninhados desnecessários e prefira funções pequenas e bem definidas. Gerencie a memória de forma eficaz, liberando-a quando não for mais necessária e usando tipos de dados apropriados para economizar espaço.


RE: Otimizações e Dúvidas - FormigaPWN - 01/06/2024

(01/06/2024 12:37)BitSain Escreveu: Para otimizar seu código e melhorar o desempenho do servidor, é importante entender que comentários e warnings têm impactos diferentes. Comentários não afetam o desempenho, pois são ignorados pelo compilador e servem apenas para documentação. Use-os com moderação para explicar partes complexas do código. Por outro lado, warnings indicam possíveis problemas que, embora não impeçam a compilação, podem causar comportamentos inesperados. É uma boa prática corrigir todos os warnings, especialmente aqueles relacionados a variáveis não inicializadas, variáveis não utilizadas e funções obsoletas.

Para melhorar a eficiência do código, escolha as estruturas de dados adequadas e otimize algoritmos para reduzir a complexidade. Evite loops aninhados desnecessários e prefira funções pequenas e bem definidas. Gerencie a memória de forma eficaz, liberando-a quando não for mais necessária e usando tipos de dados apropriados para economizar espaço.

Obrigado por sua sugestão do que eu posso fazer em respeito a meu pedido ai de verdade!!

Uma outra coisa é... Minha gamemod tem alguns modulos para por sistemas e códigos bem complexos, você acha que se eu por mapeações e códigos maiores você acha que diminuindo as linhas do pwn principal pode ser uma forma de otimizar?


RE: Otimizações e Dúvidas - Dr Editor - 01/06/2024

(01/06/2024 13:43)FormigaPWN Escreveu: Uma outra coisa é... Minha gamemod tem alguns modulos para por sistemas e códigos bem complexos, você acha que se eu por mapeações e códigos maiores você acha que diminuindo as linhas do pwn principal pode ser uma forma de otimizar?

Uma prática boa para servidores com muitos mapas é separá-los em um FS, pois apesar de não ter impacto direto na performance, retarda o compilador. Mapa você não atualiza com a mesma frequência que um gamemode, logo não faz sentido o compilar sempre junto ao mesmo.

Sobre códigos, mil linhas de código otimizado tem uma diferença grotesca de performance comparado a mil linhas de código mal otimizado. Então esse negócio de número de linhas não deve ser temido.
Menos linhas torna o arquivo menor, mas em questão de otimização não tem nada haver.


RE: Otimizações e Dúvidas - blueN - 02/06/2024

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(playeridnewkeysoldkeys) {

    if(newkeys == KEY_SECONDARY_ATTACK) {
        if(IsPlayerInRangeOfPoint(playerid2.00.00.00.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.


RE: Otimizações e Dúvidas - Dr Editor - 02/06/2024

(02/06/2024 00:21)blueN Escreveu: 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.

Boa abordagem para otimização, no geral. Mas nisso eu acho que vai mais da aplicação do que no sistema utilizado para salvar e carregar.
Salvar tudo na memória e usar o carregamento e salvamento uma única vez é melhor do que ficar trabalhando com as bibliotecas de dados em tempo de execução, na minha opinião.
E não entendo porque SQLite não deveria ser considerando uma boa biblioteca para manipulação de dados.


RE: Otimizações e Dúvidas - manow6523 - 02/06/2024

(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(playeridnewkeysoldkeys) {

    if(newkeys == KEY_SECONDARY_ATTACK) {
        if(IsPlayerInRangeOfPoint(playerid2.00.00.00.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.

Bastante informações úteis, parabéns!

No caso do Streamer, a versão mais otimizada é a 2.8.2, correto? (https://github.com/samp-incognito/samp-streamer-plugin/issues/438)

Mas e sobre o Sscanf, qual seria a melhor versão? Não encontrei nenhuma informação específica sobre...


RE: Otimizações e Dúvidas - White_Blue - 02/06/2024

(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(playeridnewkeysoldkeys) {

    if(newkeys == KEY_SECONDARY_ATTACK) {
        if(IsPlayerInRangeOfPoint(playerid2.00.00.00.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.