30.08.2013, 00:43
- Optimizacion de cуdigo -
Hola, primero que nada me presento soy nuevo en esta comunidad, mas no en el lenguaje, por lo quiero ayudar a los que lo necesiten, no soy un experto pero tampoco soy nuevo, si necesitan ayuda con test o alguna funciуn problema con gusto podre ayudarles si tengo tiempo libre.- Condicionales -
La optimizacion de cуdigo, como su nombre lo dice podremos agilizar la codificacion y que el servidor corra con el menos lag posible, con esto me refiero a cuando creamos un script, hay muchas maneras, pero no siempre las mas faciles de hacer son las mas eficientes. Nosotros debemos llamar siempre que sea posible al valor indicado y no buscar en los que esten disponibles, ejemplo:pawn Код:
...
if(valor == 1) return 1;
if(valor == 2) return 2;
if(valor == 3) return 3;
...
pawn Код:
...
switch(valor)
{
case 1: return 1;
case 2: return 2;
case 3: return 3;
}
...
Aun que bien los dos son igualmente menos optimizados ya que al ser un valor entero y debemos regresar el mismo valor podriamos hacer simplemente:
pawn Код:
return valor;
Los condicionales "if" deben ser usados en lo mнnimo posible cuando existan casos asн, ya que mucha gente no sabe de esto, usa "if" en casi todos los casos, muchas veces podemos optimizar con switch en las callbacks y ni siquiera lo sabemos, un ejemplo seria:
pawn Код:
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
if(dialogid == DIALOGO_UNO)
return funcion(...);
if(dialogid == DIALOGO_DOS)
return funcion(...);
if(dialogid == DIALOGO_TRES)
return funcion(...);
return 1;
}
pawn Код:
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
switch(dialogid)
{
case DIALOGO_UNO: funcion(...);
case DIALOGO_DOS: funcion(...);
case DIALOGO_TRES: funcion(...);
}
return 1;
}
En muchas callbacks podemos aplicar switch, por ejemplo en numeros estaticos (como en OnPlayerPickUp cuando tenemos pickups que nunca se destruyen o respawnean o se crean mas), este tema de condicionales es muy amplio asi que lo acabare despues.
- Bucles -
Los bucles son muy importantes en la programacion, a todos nos daria flojera la comprobacion de uno por uno, repetir la misma funcion haciendo copy paste, los bucles pueden congelar nuestro servidor por segundos si se hace uno muy largo, por ejemplo:pawn Код:
for(new x=0;x<9999999999;x++) {}
pawn Код:
for(new playerid=0;playerid<MAX_PLAYERS;playerid++)
funcion(playerid,...);
pawn Код:
#undef MAX_PLAYERS
#define MAX_PLAYERS 100
Los bucles hay que manejarlos con cuidado por razones dichas anteriormente, aun que aveces no son necesarios si queremos repetir una funcion menos de diez veces, es mejor hacer copy paste, ya que la creacion de un bucle mas la funcion tomaria mas tiempo de ejecucion.
- Comandos -
Mucha gente y como ya hablamos anteriormente, se dejan llevar usando condicionales ("if") en OnPlayerCommandText, y como ya dijimos esto es un error muy grande por que muchos pueden tener miles de comandos y tendria que verificar uno por uno, lo correcto seria usar un procesador de comandos, a que me refiero con esto; un procesador de comandos es como el switch comparado con el if, ya que llama directamente al comando que se tecleo, sin buscar entre los demas, por eso es mucho mas rapido (cuando se tienen demasiados comandos), los mas conocidos son zcmd y y_commands. en este tema no hay mucho que abordar ya que la mayor parte es sobre las condicionales que ya mencionamos.- Timers y OnPlayerUpdate -
Muchas personas piensan que el uso de estos dos, nos dara un gran lag, sin embargo al usarlos correctamente no da lag alguno, muchas veces creamos demasiados timers (hasta 1 por jugador o mas), algo que seria incorrecto por que, los temporizadores por alguna razon comienzan a dar lag al tener muchos, aun que no lo crean con tener un timer es mas que suficiente para todo el servidor, en ese timer se llamaria cada segundo o medio segundo y ahi asignarian las funciones que se requieran tanto para el servidor como usuarios, usando foreach seria aun mejor:pawn Код:
public timer()
{
funcion(...);
foreach(new playerid : Player)
{
funcion(playerid,...);
}
}
La callback OnPlayerUpdate si da lag si no la sabes usar, para comenzar esta callback es llamada cuando se actualiza cliente-servidor, que quiero decir, que el servidor esta en constante actualizacion (vease server.cfg>streamer/onfoot/weapon_rate) que son 40 milisegundos por defecto, y eso es por cada cliente, si metemos algo muy pesado en esa callback por ejemplo escritura/lectura de archivos con dini guardaria datos cada 40 milisegundos, y si dini tarda 2 milisegundos por archivo, bastarian al menos 10 jugadores para que comienze el lag, y al menos 20 para que sea insoportable, ahora que comprendimos como es el funcionamiento de esa callback podemos hacer un buen uso de ella, debemos meter el minimo de funciones ahi e incluso si es posible dejarla vacia.
- Codificacion -
Practicamente esto no es para acelerar la velocidad de procesamiento de nuestro servidor, pero si es bueno que aprendamos primeramente, la tabulacion, mucha gente no tabula o no sabe como hacerlo, la tabulacion es muy importante ya que nos ayuda a localizar facilmente que funciones estan dentro de otras funciones, tambien le da estetica a nuestro codigo:pawn Код:
public OnGameModeInit()
{
new mode = 1;
if(mode == 1)
funcion(...);
return 1;
}
La ortografia; somos programadores, lo que significa que el uso de una mayuscula puede costarnos un error en el programa, lo mejor es que aprendamos bien el nombre de las funciones y escribamos correctamente, tambien le da estetica, no me refiero a escribir perfecto pero por lo menos no hacerse notar que es un idiota:
pawn Код:
printg("ola ke onda? soy re trol");
Arreglos, un arreglo o array son muchas variables comprendidas en una, a que me refiero:
pawn Код:
new hola[100];
Espanglish, a que me refiero con esto, si somos hispanohablantes que se haga notar, muchos al crear una funcion o variable hacen esto:
pawn Код:
stock IsPlayerInAquellaZona(...)
- Otras callbacks -
Las callbacks son llamadas cuando pasan eventos dentro del servidor, se presiona una tecla, se sube a un auto, muere, entre otras, debemos saber cuales se llaman mas seguido en nuestro servidor y optimizarlas lo mas posible, por ejemplo en un servidor deathmach, la callback que probablemente es llamada mas seguido (sin contar OnPlayerUpdate) es OnPlayerDeath, en este caso no podemos estar metiendo codigo basura o lento ya que nos re-lentiza nuestro servidor.- Funciones pesadas -
Aveces tenemos funciones que pueden ir lento, como pueden tener bucles o guardado en archivos, por lo que tenemos que llamarlas cada vez que sea necesario, ya que si llamamos constantemente pueden causar lag.- Tiempos -
Usted puede tomar el tiempo de cuanto tarda una funcion en procesarse, haciendo un bucle y obteniendo el tiempo con GetTickCount (devuelve en milisegundos), asi podra saber que tanto tarda.Aun falta mucho por explicar, y no esta completo, tratare de terminarlo en la brevedad posible, cabe aclarar que el tiempo del que hablo no llega ni al milisegundo (o algunas veces si) pero si usted optimiza su codigo bien puede tener una velocidad de procesamiento mejor, y menos lag, recordando que el servidor corre en un hilo (debe acabar una funcion para empezar otra) entonces si las funciones tardan menos respondera mas rapido el servidor.
Cualquier duda comentario queja donativo pregunta donativo por paypal es bienvenid@.