Dicas e Truques e Otimizaзхes -
ipsBruno - 04.08.2012
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:2 ); // 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 = 0, amigo2 ) {
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
ao usar
Darб aviso, entгo vocк faz:
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:
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:
й mais otimizado fazer:
Й 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
Rбpido:
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 [ 1 + ('z' - 'a') ] = { 'a', 'b', ...} ;
--
Dicas de rjj
Igualar variбveis
Mйtodo lento:
Mйtodo rбpido
- Tutorial por Bruno da Silva. Pendente de Modificaзхes
Respuesta: Dicas e Truques e Otimizaзхes -
Truck - 04.08.2012
Caramba tinha coisa que nгo sabia, parabйns Bruno, Belo tutorial.
Re: Dicas e Truques e Otimizaзхes -
Don_Speed - 04.08.2012
Caramba tinha coisa que nгo sabiaІ
Respuesta: Dicas e Truques e Otimizaзхes -
ipsBruno - 04.08.2012
Atualizado com mais dicas, nгo deleta o tуpico moderaзгo, estou achando mais coisas para implementar.
Re: Dicas e Truques e Otimizaзхes -
Bruno Pereira - 04.08.2012
Gostei muito parabйns =D rep++
Respuesta: Dicas e Truques e Otimizaзхes -
ipsBruno - 04.08.2012
Valeu pessoal, atualizei com novas dicas
Re: Dicas e Truques e Otimizaзхes -
Abravanel - 04.08.2012
Legal Bruno.
Essa de igualar variбveis eu nгo sabia :O
Re: Dicas e Truques e Otimizaзхes -
ViniBorn - 04.08.2012
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
Re: Dicas e Truques e Otimizaзхes -
FireCat - 04.08.2012
bom.
tens de referir que se usarmos static numa include nao dб para ser lida no gm
Respuesta: Dicas e Truques e Otimizaзхes -
ipsBruno - 04.08.2012
Nгo entendi Firecat
Re: Dicas e Truques e Otimizaзхes -
DrTHE - 04.08.2012
Parabйns уtimo tutorial!
Re: Dicas e Truques e Otimizaзхes -
jpeg - 04.08.2012
Muito bom cara, excelente!!!
Re: Dicas e Truques e Otimizaзхes -
OpeN. - 05.08.2012
Show. Gostei. Parabйns
Re: Dicas e Truques e Otimizaзхes -
leonardo1434 - 05.08.2012
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.
Re: Dicas e Truques e Otimizaзхes -
Bruno Pereira - 05.08.2012
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.
Re: Dicas e Truques e Otimizaзхes -
humildadeforever - 05.08.2012
Tem bastante coisas interessantes. Bom tutorial, parabйns.
Re: Dicas e Truques e Otimizaзхes -
FireCat - 05.08.2012
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
Respuesta: Re: Dicas e Truques e Otimizaзхes -
ipsBruno - 05.08.2012
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.
Re: Dicas e Truques e Otimizaзхes -
paulor - 05.08.2012
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 = #;
Respuesta: Dicas e Truques e Otimizaзхes -
ipsBruno - 05.08.2012
Obrigado
Este seu mйtodo serve para limpar strings, nгo array.
pawn Код:
new arrayaserlimpa[200] = {1, ...};
arrayaserlimpa = #;
printf("Hey man %d", arrayaserlimpa[100]);