[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
#2

Caramba tinha coisa que nгo sabia, parabйns Bruno, Belo tutorial.
Reply
#3

Caramba tinha coisa que nгo sabiaІ
Reply
#4

Atualizado com mais dicas, nгo deleta o tуpico moderaзгo, estou achando mais coisas para implementar.
Reply
#5

Gostei muito parabйns =D rep++
Reply
#6

Valeu pessoal, atualizei com novas dicas
Reply
#7

Legal Bruno.
Essa de igualar variбveis eu nгo sabia :O
Reply
#8

Eu nгo diria que stock й inъtil, apenas que sua utilidade й restrita a includes.

PS: Hб tambйm uma dica legal, relativo ao uso de ... na criaзгo de arrays
Reply
#9

bom.
tens de referir que se usarmos static numa include nao dб para ser lida no gm
Reply
#10

Nгo entendi Firecat
Reply
#11

Parabйns уtimo tutorial!
Reply
#12

Muito bom cara, excelente!!!
Reply
#13

Show. Gostei. Parabйns
Reply
#14

2 coisas que eu nгo sabia ainda, a array sobre o alfabeto(nunca tinha tentando antes) e sobre o truque do floatpower.(jб vi vбrias vezes, mas nunca achei o significado.)


Excelente bruna. vai ajudar bastante os mais preguiзosos.
Reply
#15

Acho que o FireCat quis dizer que se usar static em uma include ela nгo pode ser lida no GM. Nгo sei se й verdade ou se nгo й, por que nunca testei.
Reply
#16

Tem bastante coisas interessantes. Bom tutorial, parabйns.
Reply
#17

O que eu quiz dizer foi, se por exemplo tivermos um include chamada "Offsets.inc" e tivermos lб dentro por exemplo:
pawn Код:
static Spawns[][]
{
    {1.0,2.0,3.0},
    {2.0,3.0,1.0}
};
E se usarmos a include no GM/FS e quiseremos usar essa array, nгo vai ser possivel porque й static
Reply
#18

Quote:
Originally Posted by FireCat
Посмотреть сообщение
O que eu quiz dizer foi, se por exemplo tivermos um include chamada "Offsets.inc" e tivermos lб dentro por exemplo:
pawn Код:
static Spawns[][]
{
    {1.0,2.0,3.0},
    {2.0,3.0,1.0}
};
E se usarmos a include no GM/FS e quiseremos usar essa array, nгo vai ser possivel porque й static
Isto sу se aplica a arrays globais, quando falo que static й mais otimizada que new й em tempo de execuзгo - obvio, й burrice vocк declarar uma static global.
Reply
#19

Ae Muito foda esse seu tuto, bastantes dicas muito boas, Parabйns!

Para resetar um var seria bem melhor assim.


pawn Код:
new arrayaserlimpa[200] = {1, ...};
arrayaserlimpa = #;
Reply
#20

Obrigado

Este seu mйtodo serve para limpar strings, nгo array.

pawn Код:
new arrayaserlimpa[200] = {1, ...};

arrayaserlimpa = #;

printf("Hey man %d", arrayaserlimpa[100]);
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)