SA-MP Forums

Go Back   SA-MP Forums > Non-English > Languages > Português/Portuguese > Lançamentos/Releases

Reply
 
Thread Tools Display Modes
Old 11/09/2017, 03:13 AM   #1
Jelly23
Big Clucker
 
Join Date: Aug 2017
Posts: 77
Reputation: 142
Default Uso de funções nativas e variáveis globais

• Introdução
Já havia feito um tópico, mas apenas relacionado à funções nativas, e por ter voltado com uma conta nova, eu não posso editar meu tópico antigo. Vou explicar sobre a repetição de funções nativas e falar sobre variáveis globais (strings globais são o costume de algumas pessoas).
• Por que evitar repetir funções nativas?
Toda vez que você usa uma função nativa, o servidor procurar pela sua definição, então ira procurar no samp-server.exe pela função nativa com amx_function (Na realidade é amx_FindNative, apenas chamo assim por utilizar o AmxModX e ter uma macro para isso), então se possível, limite as vezes que você vai utilizar uma função.
Exemplo 1:
Ruim
PHP Code:
if(GetPlayerWeapon(playerid) == ... || GetPlayerWeapon(playerid) == ... || GetPlayerWeapon(playerid) == ...) 

     
//codigo 

Bom
PHP Code:
new arma GetPlayerWeapon(playerid); 
if(
arma == ... || arma  == ... || arma == ...) 

     
//codigo 

Por que o método acima é bom?
- No método ruim, a função nativa GetPlayerWeapon é chamada três vezes para poder verificar o ID da arma.
- No método bom, a função nativa é chamada apenas uma vez, tendo o valor retornado pela função na variável, que será usada para comparar o ID da arma, no lugar de chamar a função nativa mais de uma vez.
Exemplo 2:
Ruim
Muitas pessoas usam uma função com a keyword stock para obter o nome, como GetName(playerid), esse método é ruim, considerando que a função nativa GetPlayerName vai ser chamada toda vez que essa função ser usada, e também sem nem se quer saber para que serve a keyword stock.

Bom
PHP Code:
new nome[MAX_PLAYERS][MAX_PLAYER_NAME];  

public 
OnPlayerConnect(playerid)  
{  
     
GetPlayerName(playerid,nome[playerid],24);  
     return 
1;   

O método acima é bom por que a função GetPlayerName só é chamada uma vez na callback OnPlayerConnect, assim podendo fazer uso da matriz nome[playerid] para comparar/verificar/obter o nome de jogadores.
• Uso de variáveis globais
Algumas pessoas usam variáveis globais para certas coisas, como uma string de 256 ou 128 células para todas as mensagens do gamemode pensando que estão economizando algo, mas na realidade não estão, além de estarem desperdiçando células.

Evite variáveis globais. Elas podem ser substituídas acidentalmente ou podem mostrar o texto errado no lugar errado. Você também não economizará memória. Uma variável consome igualmente a mesma quantidade de memória, não importa onde ou quando é criada. As variáveis ​​locais são criadas na memória quando necessário e elas são descartadas após o uso, diferente de variáveis globais que permanecem na memória. Então concluindo, é recomendado que você utilize variáveis locais com a quantidade de células que você vai utilizar.
Jelly23 is online now   Reply With Quote
Old 11/09/2017, 03:32 AM   #2
IlanZ
High-roller
 
IlanZ's Avatar
 
Join Date: Jul 2016
Location: Brasil
Posts: 1,286
Reputation: 71
Default Re: Uso de funções nativas e variáveis globais

Bom tutorial.
__________________
IlanZ is offline   Reply With Quote
Old 11/09/2017, 04:16 AM   #3
Dayvison_
High-roller
 
Dayvison_'s Avatar
 
Join Date: Nov 2013
Posts: 1,257
Reputation: 171
Default Re: Uso de funções nativas e variáveis globais

Discordo de você no ponto em que toca "memória vs velocidade", eu tenho em mente que é melhor perder um pouco na memória e ganhar na velocidade de execução, você acaba se contradizendo quando citou o exemplo do GetPlayerName com uma variavel global.
Copiei o código abaixo do meu script, estas são as variaveis globais que uso como string e todas juntas gastam apenas 16 Kbs(((1024 * 4) / 1024) * 4), não é uma grande perda de memória.
PHP Code:
// MAX_STRING_LENGTH = 1024(atualmente)
stock
    gs_InternalBuffer
[MAX_STRING_LENGTH],/// Usado em funções internas, como funções de logs, formatam e retornam etc..(Funções que não chamam funções que usam isto algo como recursão?)
    
gs_QueryBuffer[MAX_STRING_LENGTH],   /// Usado exclusivamente para criar consultas do MySQL
    
gs_Buffer[MAX_STRING_LENGTH],        /// Usado em todo resto
    
gs_Buffer2[MAX_STRING_LENGTH]        /// Usado em todo resto(quando acima não é suficiente)

Quanto ao todo restante você está certo xD
Dayvison_ is offline   Reply With Quote
Old 11/09/2017, 04:28 AM   #4
C4rtm4n
Gangsta
 
C4rtm4n's Avatar
 
Join Date: Jul 2017
Location: South Park
Posts: 592
Reputation: 13
Default Re: Uso de funções nativas e variáveis globais

Muito util.
__________________
No Projects At the moment

C4rtm4n is offline   Reply With Quote
Old 11/09/2017, 11:24 PM   #5
PeterLinkson
Big Clucker
 
PeterLinkson's Avatar
 
Join Date: Jul 2017
Location: Rio de janeiro, Brasil.
Posts: 77
Reputation: 14
Default Re: Uso de funções nativas e variáveis globais

Ótimo tutorial, uso do mesmo jeito que você falou,
eu sempre duvidei das variaveis globais mandar uma mensagem errada, ou desperdiçar memoria.

vale lembrar também que se usar a função SetPlayerName em algum momento, reajustar a matriz nome

uma dica que eu dou também, é usar corretamente o format
sem o sizeof
Code:
new string[8];

if(...)
{
    format(string, 4, "%s", "ata");
}
else
{
    format(string, 8, "%s", "verdade");
}
PeterLinkson is offline   Reply With Quote
Old 12/09/2017, 12:29 AM   #6
Relaxed
Huge Clucker
 
Relaxed's Avatar
 
Join Date: Oct 2016
Location: Torres-RS
Posts: 377
Reputation: 18
Default Re: Uso de funções nativas e variáveis globais

Ótimo tutorial, parabéns.
Relaxed is offline   Reply With Quote
Old 13/09/2017, 05:05 AM   #7
rjjj
Huge Clucker
 
rjjj's Avatar
 
Join Date: Jan 2014
Location: Acre, Brasil
Posts: 200
Reputation: 179
Default Re: Uso de funções nativas e variáveis globais

Um tutorial útil, em especial certos detalhes como a associação do samp-server com as nativas do arquivo .amx .



Tomando como referência o tutorial Code optimisation do Y_Less, deixo aqui uma lista dos recursos do SA-MP Pawn, ordenada do mais rápido ao mais lento:

  • Nada
  • Constantes
  • Variáveis
  • Arrays
  • Funções nativas
  • Funções personalizadas
  • Funções remotas



Quote:
Originally Posted by PeterLinkson View Post
Ótimo tutorial, uso do mesmo jeito que você falou,
eu sempre duvidei das variaveis globais mandar uma mensagem errada, ou desperdiçar memoria.

vale lembrar também que se usar a função SetPlayerName em algum momento, reajustar a matriz nome

uma dica que eu dou também, é usar corretamente o format
sem o sizeof
Code:
new string[8];

if(...)
{
    format(string, 4, "%s", "ata");
}
else
{
    format(string, 8, "%s", "verdade");
}

Em geral, é melhor usar o operador sizeof em comparação com especificar exatamente o tamanho da array. Imagine uma pessoa que decide mudar o tamanho de uma variável array no topo de um GM: ela não teria que ir atrás de todos os locais em que aquela variável antes era aplicada com o tamanho anterior.



Além disso, o sizeof roda em tempo de compilação, sendo desprezível em tempo de execução .




Espero ter ajudado .
__________________


rjjj is offline   Reply With Quote
Old 13/09/2017, 06:41 PM   #8
CaioTJF
Gangsta
 
CaioTJF's Avatar
 
Join Date: Sep 2012
Location: Rio de Janeiro
Posts: 511
Reputation: 120
Default Re: Uso de funções nativas e variáveis globais

Alguém já parou pra reparar quanto um servidor puxa de memória em uma máquina? É uma coisa insignificante.
__________________

IP: 192.99.94.236:7771 / Website: www.gtatorcidas.net

Procurando VPS para hospedar seu servidor? --> www.blasthosting.com.br
CaioTJF is online now   Reply With Quote
Reply

Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
[Ajuda] Funções Nativas do Samp matheusdorado Português/Portuguese 13 03/06/2016 08:02 AM
[Ajuda] Duvida em relaçao a variaveis globais 3War Português/Portuguese 2 03/10/2015 06:55 AM
[Pedido] Salvar variaveis globais gmstrikker Português/Portuguese 8 29/08/2014 02:16 PM
[Ajuda] Como criar publics com funções nativas ? rCr Português/Portuguese 5 22/04/2013 03:25 PM
[Tutorial] Usando a_objects.inc 0.3e Funções nativas Schocc Lançamentos/Releases 14 12/12/2012 09:52 PM


All times are GMT. The time now is 04:50 PM.


Powered by vBulletin® Version 3.8.6
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.