[Tutorial] Dicas e Truques e Otimizaзхes
#1

Pegar item de uma enum

Este truque й legal para pegar o item de uma enum sem saber o nome do item

Basta fazer:
PHP код:
enum bruno {
a,b,c,d,e
}
    
printf"E enum tem %d itens"bruno:); // mesmo que "c"
    

Pegar nъmeros de itens de uma enum

Este truque й legal para fazer loop em enums, de maneira bem fбcil. Й como um sizeof para enum.

Basta fazer:
PHP код:
enum bruno {
a,b,c,d,e
}
    
printf"E enum tem %d itens"_:bruno ); // note _:bruno
    

Referenciar parametros

Digamos que vocк tenha:
PHP код:
oi_amigo amigo1 0amigo2 ) {
    
printf"%d e %d "amigo1 amigo2 );
    

e vocк queira apenas mudar o valor de amigo2 sem mexer no amigo1

Para isto basta referenciar o parвmetro pelo prуprio nome, use:
pawn Код:
oi_amigo( .amigo2 = 3 ) ; // amigo2 referenciado
E o valor 3 irб para o amigo2

Declaraзгo fбcil
Quando vocк estб com preguiзa de contar quantos dados contйm em uma array para declara-la corretamente.

Como:
pawn Код:
new var[5] = { 1 , 2 , 3 , 4 , 5 };
Basta fazer:
pawn Код:
new var[] = { 1 , 2 , 3 , 4 , 5 };

Limitaзхes: Neste caso nгo pode fazer elipse (...). Pois desconhece o tamanho da variбvel



tag mismatch
Em alguns casos, vocк pode facilmente resolver este erro adaptando usando tag:

Exemplo
PHP код:
new Textoi 
ao usar

PHP код:
oi 10
Darб aviso, entгo vocк faz:
pawn Код:
oi = Text:10;
e irб funcionar

Else e Operador NOT
A maioria das vezes vocк nгo dб conta, mas vocк acaba fazendo:

pawn Код:
if(!var) {
// codigo var == 0
}

else {
// codigo var != 0
}
Quando й melhor
pawn Код:
if(var) {
// codigo var != 0
}

else {
// codigo var == 0
}
Й bobo, mas muita gente esquece disto. Note que o operador NOT "!" nгo foi utilizado, sendo mais rбpido

Diminuindo MAX_PLAYERS
O MAX PLAYERS da SA:MP tem valor 500. Mas tem gente que nгo tem nem 20 slots no servidor, isto й MUITO І desotimizado.

Use isto no topo do gamemode, abaixo de include a_samp
pawn Код:
#if defined MAX_PLAYERS
    #undef MAX_PLAYERS
#endif

#define MAX_PLAYERS 20
Char Arrays
Essa й outra dica interessante para poupar memуria. Em Pawn nгo tem arrays diferente de 32 bits, exceto, se usar char.

new arr[100 char];

Entгo o acesso deve ser feito da seguinte forma:
PHP код:
arr{0
Cada parte da array vai ocupar 4 vezes a menos que as arrays normais

Limites: O problema disto й que o valor armazenado nгo pode ser maior que 255. Mas isto й suficiente para bool, ou textos, por exemplo.

Como jб dito no tуpico de Slice

Static e New
Na grande maioria dos casos usar static й mais viбvel que new. Porque?
static й criada uma vez, e nгo й criada novamente, assim nгo precisa criar a cada execuзгo do cуdigo tornando mais rбpido.

Limitaзхes: O problema disto й que ela abriga sempre um ъltimo valor, entгo vocк precisa limpar a string (caso for uma array, claro) usando

PHP код:
string[0] = 0;
// caso nгo for
valor 0
Mas normalmente as funзхes da SA:MP como GetPlayerName, GetPlayerHealth, Format, jб fazem a limpeza da variбvel nelas, logo й mais otimizado usar:

pawn Код:
static playername[MAX_PLAYER_NAME];
GetPlayerName( playerid, playername, MAX_PLAYER_NAME );
do que
pawn Код:
new playername[MAX_PLAYER_NAME];
GetPlayerName( playerid, playername, MAX_PLAYER_NAME );
Loop players rбpido s/ foreach
Com este cуdigo vocк deixa o loop em jogadores mais rбpido, inclusive mais rбpido que foreach, se estiver com slots praticamente lotado (porque este mйtodo nгo acessa arrays para contar os jogadores)

pawn Код:
static i ;  // static mais otimizado, como disse antes
for( i = GetMaxPlayers() - 1; i > -1; --i) {
    if(IsPlayerConnected(i)) {
        // code
    }
}
Limitaзхes: Isto faz o loop inverso, do id maior para o id menor, mas na maioria das vezes nгo terб problema e й MUITO otimizado

Operador OR
Quando for checar valores mбximos ou se vбrias arrays sгo nulas, й aconselhбvel usar o operador bit a bit OR

Em vez dк
pawn Код:
if( var1 == 0 && var2 == 0 && var3 == 0)
Vocк faz:

pawn Код:
if( var1 | var2 | var3 == 0)
Й muito mais rбpido

Floatpower c/ 2
Caso vocк estiver fazendo

Por exemplo:
pawn Код:
floatpower(2, 40);
й mais otimizado fazer:
pawn Код:
1 << 40
Й bastante mais otimizado. Como o prуprio Ken disse em um post.

Menos acesso nas variбveis
Essa dica, bem como a do OR. Й interessante para quem estб acessando a variбvel mais de uma vez sem necessidade, mas preste atenзгo quando usar ISTO.

Exemplo lento:
pawn Код:
// caso 0 for menor que var e var for menor que 9

if(0 >= var && var <= 9)
Exemplo rбpido:
pawn Код:
// caso 0 for menor que var. var for menor que 9
if(0 <= var <= 9)
Ambas fazem a mesma funзхes. Mas o segundo mйtodo й mais otimizado, por nгo processar o operador "&&" e nem acessar a variбvel duas vezes


Parentese de Retorno
Outra dica interessante para quem quer poupar linha em cуdigo й fazer o parвmetro retornar o ъltimo valor tido nele:

Exemplo longo:
pawn Код:
format(string, 12, "%d", 15);
new var[] = string;
Exemplo curto:
pawn Код:
new var[] = ( format(string, 12, "%d", 15), string );
Isto й, se vocк fazer

PHP код:
printf("%d", (5,4)); 
apenas o valor 4 serб imprimido, o valor 5 serб processo mas nгo imprimido.


Strings #
Se vocк й o cara que curte deixar seus cуdigos dнficeis e de chato entendimento use # para representar strings

PHP код:
print( # oi amigo ); 
Concatenar Strings Pre Compiladas

Para strings que nгo estгo alocadas em variбveis vocк pode "junta-las" - concatena-las fazendo:
PHP код:
printf("oi bruno da"  " ips team"); 
Limpar Arrays rapidamente
Um mйtodo super rбpido para limpar strings й fazendo a copia uma a outra


Mйtodo lento:
pawn Код:
for(new i ; i != sizeof arrayaserlimpa ; i++) {
    arrayaserlimpa [i] = 0;
}
Mйtodo rбpido
pawn Код:
new arrayaserlimpa[200] = {1, ...};

new arrreset[ sizeof arrayaserlimpa ];

arrayaserlimpa = arrreset;
Condicionando/Colocando valor em variбveis rapidamente

Como eu disse anteriormente, colocando parкntese vocк retorna o valor do que hб dentro. Logo outro truque interessante й que vocк pode condicionar variaveis em condicional com menos instruзхes, fazendo:

Invйs de
pawn Код:
cmdindex = strfind(string, " ");

if(cmdindex != -1) {
 // stuff
}
Vocк faz:

pawn Код:
if( ( cmdindex = strfind(string, " ") ) != -1) {
 // stuff
}
Vбrias Condicionais x &&
Jб foi feito os testes e usando && vocк acaba fazendo mais instruзхes do que aplicando vбrias condicionais

Logo

Mйtodo lento:
pawn Код:
if(var1 && !var2) {
  //stuff
}
Mais rбpido
pawn Код:
if(var1) {
   if(!var2) {
      //stuff
   }
}
stock sгo inъteis


Normalmente o pessoal nгo sabe. Mas "stock func" serve para nгo dar "unused function". Mas caso a funзгo for usada, o "unused" nгo irб ser mostrado. Logo й redundante

Logo:

Lento
pawn Код:
stock func() {
}
Rбpido:
pawn Код:
func() {
}

Checar se a string й packeada

Para checar se o cуdigo usa "packet" strings basta fazer uma coisinha simples:

pawn Код:
if ( str [ 0 ] > 0xff ){
 // is packed
}
Isto porque o modo correto de uso й str{0}. Quando sгo packeadas a declaraзгo correta й !"string"

Alfabeto com Elipse

Nгo posso deixar de publicar este, hehe. Fiz isto esses dias porque estava com preguiзa de fazer o alfabeto inteiro e por numa array:

PHP код:
new alfabeto + ('z' 'a') ] = { 'a''b', ...}  ; 


--

Dicas de rjj


Igualar variбveis

Mйtodo lento:
PHP код:
2

Mйtodo rбpido
PHP код:
2

- Tutorial por Bruno da Silva. Pendente de Modificaзхes
Reply


Messages In This Thread
Dicas e Truques e Otimizaзхes - by ipsBruno - 04.08.2012, 20:38
Respuesta: Dicas e Truques e Otimizaзхes - by Truck - 04.08.2012, 20:41
Re: Dicas e Truques e Otimizaзхes - by Don_Speed - 04.08.2012, 20:47
Respuesta: Dicas e Truques e Otimizaзхes - by ipsBruno - 04.08.2012, 21:05
Re: Dicas e Truques e Otimizaзхes - by Bruno Pereira - 04.08.2012, 21:46
Respuesta: Dicas e Truques e Otimizaзхes - by ipsBruno - 04.08.2012, 23:06
Re: Dicas e Truques e Otimizaзхes - by Abravanel - 04.08.2012, 23:10
Re: Dicas e Truques e Otimizaзхes - by ViniBorn - 04.08.2012, 23:17
Re: Dicas e Truques e Otimizaзхes - by FireCat - 04.08.2012, 23:20
Respuesta: Dicas e Truques e Otimizaзхes - by ipsBruno - 04.08.2012, 23:27
Re: Dicas e Truques e Otimizaзхes - by DrTHE - 04.08.2012, 23:33
Re: Dicas e Truques e Otimizaзхes - by jpeg - 04.08.2012, 23:49
Re: Dicas e Truques e Otimizaзхes - by OpeN. - 05.08.2012, 01:19
Re: Dicas e Truques e Otimizaзхes - by leonardo1434 - 05.08.2012, 01:53
Re: Dicas e Truques e Otimizaзхes - by Bruno Pereira - 05.08.2012, 09:52
Re: Dicas e Truques e Otimizaзхes - by humildadeforever - 05.08.2012, 10:29
Re: Dicas e Truques e Otimizaзхes - by FireCat - 05.08.2012, 11:31
Respuesta: Re: Dicas e Truques e Otimizaзхes - by ipsBruno - 05.08.2012, 11:34
Re: Dicas e Truques e Otimizaзхes - by paulor - 05.08.2012, 15:32
Respuesta: Dicas e Truques e Otimizaзхes - by ipsBruno - 05.08.2012, 15:34
Re: Dicas e Truques e Otimizaзхes - by StreetGT - 05.08.2012, 15:45
Re: Dicas e Truques e Otimizaзхes - by leonardo1434 - 05.08.2012, 15:50
Re: Dicas e Truques e Otimizaзхes - by RebeloX - 05.08.2012, 15:53
Re: Dicas e Truques e Otimizaзхes - by leonardo1434 - 05.08.2012, 15:57
Re: Dicas e Truques e Otimizaзхes - by paulor - 05.08.2012, 16:23
Respuesta: Dicas e Truques e Otimizaзхes - by ipsBruno - 05.08.2012, 17:02
Re: Dicas e Truques e Otimizaзхes - by Shadow Black - 05.08.2012, 21:22
Re: Respuesta: Dicas e Truques e Otimizaзхes - by Casttiel - 03.10.2016, 16:03
Re: Dicas e Truques e Otimizaзхes - by PT - 03.10.2016, 17:57
Re: Dicas e Truques e Otimizaзхes - by Nikkel - 03.10.2016, 18:08
Re: Dicas e Truques e Otimizaзхes - by F1N4L - 03.10.2016, 18:16

Forum Jump:


Users browsing this thread: 2 Guest(s)