[Include] a_bucles.inc > crea repeticiones exactas!
#1

a_bucles
v0.1 - 14/06/2013
Actualizaciones

  • 26-09-2013
    • se optimiza de tal forma que la velocidad incrementa considerablemente, tanto que en algunos casos llega a mas de 200 veces lo que era en su versiуn anterior
    • se agrega la funciуn "forValido" para verificar que una repeticiуn de un bucle es funcional, normalmente se deberia usar para cuando se usa "forEl" o "forLi" dentro de un recorrido con "forEach"
    • se agrega "forAgU" que es basicamente lo mismo que "forAg" con la ъnica diferencia a que este solo agregarб valores ъnicos, en otras palabras, si el valor ya existe, no lo volverб a agregar
    • se bloquea el uso del dнgito ((1<<31)-1) ya que es el dнgito nulo de todos los bucles
Nueva forma de repeticiones

  • mas rбpidos, mas cуmodos, mas opciones y muchas otras!
  • si tu servidor esta constantemente utilizando bucles que solo buscan unos pocos objetivos entre varios, esta es la opciуn perfecta.
Antes.


pawn Код:
public OnPlayerConnect(playerid)
{
    new minicio[63], nombredeusuario[MAX_PLAYER_NAME];
    GetPlayerName(playerid, nombredeusuario, sizeof nombredeusuario);
    format(minicio, sizeof minicio, "%s(ID: %d) ha entrado al servidor.", nombredeusuario, playerid);
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
        if(!IsPlayerConnected(i)) continue;
        SendClientMessage(i, -1, minicio);
    }
    return 1;
}
Ahora.


pawn Код:
public OnPlayerConnect(playerid)
{
    new minicio[63], nombredeusuario[MAX_PLAYER_NAME];
    GetPlayerName(playerid, nombredeusuario, sizeof nombredeusuario);
    format(minicio, sizeof minicio, "%s(ID: %d) ha entrado al servidor.", nombredeusuario, playerid);
    forEach(i, Players)
    {
        SendClientMessage(i, -1, minicio);
    }
    return 1;
}
  • Antes: se hacia un bucle por el mбximo posible de jugadores y se iba "preguntando" si estos estaban conectados para poder enviarles el mensaje.
  • Ahora: harб un bucle por las repeticiones deacuerdo al nъmero de jugadores conectados. Si hay 15 jugadores, el bucle no serб de 500 sinу de 15, por lo que serб muchas veces mas rбpido.
Descripciуn

  • que necesidad hay de que tu servidor se congele durante unos momentos para que un bucle pueda hacer su trabajo si tienes la posibilidad de aumentar la velocidad notablemente utilizando un pequeсo script?!.
Porque usarlo?

  • Con un script como este, puedes reducir enormemente el peso que tiene la CPU de la mбquina que hostea tu servidor, esto harб que funcione mas rбpido y haya menos lag ya que el servidor terminarб mas rбpido los procesos para dedicarse libremente al envio y recibo de paquetes que manejan los usuarios.
  • Es el ъnico sistema de bucles que soporta nъmeros negativos (menores al cero) aunque este tiene un costo un poco alto que es la velocidad de procesamiento que requieren estos dнgitos, son mucho mayor a los que necesitan los nъmeros que van desde 0 (cero) hasta el tamaсo mбximo del bucle.
  • Es el ъnico sistema de bucles que soporta nъmeros mas altos al tamaсo del bucle. Esto se debe a que a_bucles no trabaja con un valor directo a la celda del vector, sinу que los ordena sin importar la celda.
  • Es el ъnico sistema de bucles que puede agregar 2 valores en el mismo bucle. Ademбs tiene la posibilidad, si se desea, de agregar solamente un valor ъnico dentro del bucle, sin la posibilidad de que se repita. Especial para IDs de objetos, jugadores u otros.
Velocidad

  • Solo hay 2 pruebas de velocidad comparando con otros sistemas del mismo tipo. Hasta ahora solo contra "y_iterator" de "******".
the_chaoz.

DesingMyCry - Alparkom

  • http://forum.sa-mp.com/member.php?u=113050
  • http://pastebin.com/j8L4jir4
  • Quote:

    agregar >> a_bucles >> 5000 interacciones >> 3 milisegundos
    agregar >> y_iterator >> 5000 interacciones >> 991 milisegundos

    recorrer >> a_bucles >> 5000 interacciones >> 106 milisegundos
    recorrer >> y_iterator >> 5000 interacciones >> 105 milisegundos

    azar >> a_bucles >> 5000 interacciones >> 1 milisegundos
    azar >> y_iterator >> 5000 interacciones >> 1229 milisegundos

    buscar >> a_bucles >> 5000 interacciones >> 2 milisegundos
    buscar >> y_iterator >> 5000 interacciones >> 1 milisegundos

    remover >> a_bucles >> 5000 interacciones >> 3 milisegundos
    remover >> y_iterator >> 5000 interacciones >> 6 milisegundos

    recorrer >> a_bucles >> 5000 interacciones >> 0 milisegundos
    recorrer >> y_iterator >> 5000 interacciones >> 0 milisegundos

  • Quote:

    agregar >> a_bucles >> 500 interacciones >> 1 milisegundos
    agregar >> y_iterator >> 500 interacciones >> 10 milisegundos

    recorrer >> a_bucles >> 500 interacciones >> 11 milisegundos
    recorrer >> y_iterator >> 500 interacciones >> 11 milisegundos

    azar >> a_bucles >> 500 interacciones >> 0 milisegundos
    azar >> y_iterator >> 500 interacciones >> 12 milisegundos

    buscar >> a_bucles >> 500 interacciones >> 0 milisegundos
    buscar >> y_iterator >> 500 interacciones >> 0 milisegundos

    remover >> a_bucles >> 500 interacciones >> 0 milisegundos
    remover >> y_iterator >> 500 interacciones >> 1 milisegundos

    recorrer >> a_bucles >> 500 interacciones >> 0 milisegundos
    recorrer >> y_iterator >> 500 interacciones >> 0 milisegundos

Utilizaciуn


pawn Код:
#include <aINC\a_bucles>
  • Se recomienda aсadir la libreria completa.
pawn Код:
#include <aINC>
Funciones

  • forAg;
    • agregar una nueva repeticiуn al bucle
    • parбmetros
      • Bucle:tipo
        • el bucle al que se le agregarб la repeticiуn
      • valor
        • el nuevo valor de la repeticiуn
    • NOTA: si el bucle se encuentra completo, esta funciуn pasarб por alto su funcionamiento.
  • forAgU;
    • agregar una nueva repeticiуn ъnica al bucle
    • parбmetros
      • Bucle:tipo
        • el bucle al que se le agregarб la repeticiуn
      • valor
        • el nuevo valor de la repeticiуn
    • NOTA: si el bucle se encuentra completo, esta funciуn pasarб por alto su funcionamiento.
    • NOTA: si ya existe el valor dentro del bucle, no se agregarб.
  • forEl;
    • eliminar una repeticiуn de un bucle
    • parбmetros
      • Bucle:tipo
        • el bucle al cual se le eliminarб la repeticiуn
      • valor
        • el valor a eliminar
    • NOTA: si el valor no se encuentra, la funciуn no tendrб efecto.
    • NOTA: si hay mas de una vez el mismo valor agregado, la funciуn eliminarб la primera que encuentre.
  • forLi;
    • vaciar un bucle; eliminar todas las repeticiones de un bucle
    • parбmetros
      • Bucle:tipo
        • el bucle que se vaciarб
  • forAz;
    • obtener una repeticiуn al azar
    • parбmetros
      • Bucle:tipo
        • el bucle donde se buscarб la repeticiуn
  • forTo;
    • obtener el nъmero de repeticiones de un bucle
    • parбmetros
      • Bucle:tipo
        • el bucle que se obtendrб el total de repeticiones
    • NOTA: el nъmero de retorno parte de 1. Si hay una repeticiуn, este mostrarб 1 y no 0.
  • forBu;
    • buscar un valor dentro de un bucle
    • parбmetros
      • Bucle:tipo
        • el bucle donde se buscarб el valor
      • valor
        • el valor a buscar
    • retorna
      • true; encontrу el valor
      • false; el valor no se encuentra en ninguna repeticiуn del bucle
  • forNu;
    • obtener el index de una repeticiуn
    • parбmetros
      • Bucle:tipo
        • el bucle al cual se buscarб el index
      • index
        • el index del bucle
    • NOTA: un ejemplo, serнa el index 0, con el se obtendrнa la primera repeticiуn del bucle.
    • NOTA: si se pregunta por un index que no existe, simplemente retornarб -1.
Tutorial

  • cada nuevo bucle creado, debe tener un mбximo de repeticiones.
pawn Код:
new Bucle:nuevobucle<10>;

/*
new > declaramos la variable
Bucle > tag necesario para declarar un nuevo bucle
nuevobucle > el nombre del nuevo bucle
10 > el mбximo de repeticiones que tendrб
*/
La primera repeticiуn.


pawn Код:
#include <a_samp>
//#include <aINC>
#include <aINC\a_bucles>

new Bucle:test<50>;

main()
{
    printf("Comenzando con los bucles");
   
    forEach(i, test)
    {
        printf("Repeticiуn %d del bucle 'test'", i);
    }
}
  • el cуdigo anterior no obtendria resultado alguno, ya que el bucle esta vacio.
  • este solo se repite las veces que se haya agregado una nueva repeticiуn con la funciуn "forAg".
Agregando nuevas repeticiones.


pawn Код:
#include <a_samp>
//#include <aINC>
#include <aINC\a_bucles>

new Bucle:test<50>;

main()
{
    printf("Comenzando con los bucles");
   
    forAg(test, 4);
    forAg(test, 6);
    forAg(test, 3);

    forEach(i, test)
    {
        printf("Repeticiуn %d del bucle 'test'", i);
    }
}
  • como se aprecia, se ha usado la funciуn "forAg" 3 veces antes que se ponga en marcha el bucle, por lo que, estariamos diciendo que ese bucle se repetirб solo 3 veces.
  • obtendriamos en la consola el siguiente resultado.
Quote:

Repeticiуn 4 del bucle 'test'
Repeticiуn 6 del bucle 'test'
Repeticiуn 3 del bucle 'test'

  • y para borrar un resultado, basicamente se usarнa la funciуn "forEl".
Eliminando repeticiones ya creadas.


pawn Код:
#include <a_samp>
//#include <aINC>
#include <aINC\a_bucles>

new Bucle:test<50>;

main()
{
    printf("Comenzando con los bucles");
   
    forAg(test, 4);
    forAg(test, 6);
    forAg(test, 3);

    forEach(i, test)
    {
        printf("Repeticiуn %d del bucle 'test'", i);
    }
    printf("\n");

    forEl(test, 6);

    forEach(i, test)
    {
        printf("Repeticiуn %d del bucle 'test'", i);
    }
}
  • obtendriamos en la consola.
Quote:

Repeticiуn 4 del bucle 'test'
Repeticiуn 6 del bucle 'test'
Repeticiуn 3 del bucle 'test'

Repeticiуn 4 del bucle 'test'
Repeticiуn 3 del bucle 'test'

  • como se aprecia, se borrу la repeticiуn con un valor de 6.
Obtener la primera, ъltima y penultima repeticiуn.

  • si biйn el include no tiene funciones para obtener principalmente la primer repeticiуn, cuenta con otras que hacen posible obtener la primera, la segunda y la que se desee y se encuentre dentro del bucle.
pawn Код:
#include <a_samp>
//#include <aINC>
#include <aINC\a_bucles>

new Bucle:test<50>;

main()
{
    printf("Comenzando con los bucles");
   
    forAg(test, 4);
    forAg(test, 6);
    forAg(test, 3);

    forEach(i, test)
    {
        printf("Repeticiуn %d del bucle 'test'", i);
    }
    printf("\n");

    printf("El index nъmero 1 del bucle 'test' es: %d", forNu(test, 1));
}
Quote:

Repeticiуn 4 del bucle 'test'
Repeticiуn 6 del bucle 'test'
Repeticiуn 3 del bucle 'test'

El index nъmero 1 del bucle 'test' es: 6

  • el index es simplemente el orden en el que se agregan las repeticiones con la funciуn "forAg".
  • en el ejemplo anterior, estariamos obteniendo el resultado de la segunda repeticiуn, ya que el index comienza desde 0 (cero)
  • con la funciуn "forTo" podemos saber cuantas repeticiones tiene actualmente el bucle, eso sumado a "forNu", podriamos obtener el ъltimo registro, penъltimo y asн sucesivamente.
pawn Код:
#include <a_samp>
//#include <aINC>
#include <aINC\a_bucles>

new Bucle:test<50>;

main()
{
    printf("Comenzando con los bucles");
   
    forAg(test, 4);
    forAg(test, 6);
    forAg(test, 3);
    forAg(test, 2);
    forAg(test, 9);
    forAg(test, 7);

    forEach(i, test)
    {
        printf("Repeticiуn %d del bucle 'test'", i);
    }
    printf("\n");

    printf("Repeticiones:");
    printf("\tprimera: %d", forNu(test, 0));
    printf("\tsegunda: %d", forNu(test, 1));
    printf("\tъltima: %d", forNu(test, forTo(test)));
    printf("\tpenъltima: %d", forNu(test, forTo(test)-1));
}
Quote:

Repeticiуn 4 del bucle 'test'
Repeticiуn 6 del bucle 'test'
Repeticiуn 3 del bucle 'test'
Repeticiуn 2 del bucle 'test'
Repeticiуn 9 del bucle 'test'
Repeticiуn 7 del bucle 'test'

Repeticiones:
primera: 4
segunda: 6
ъltima: 7
penъltima: 9

Repeticiones al azar.

  • para eso existe la funciуn "forAz", con ella podremos obtener el valor de una repeticiуn al azar de algun bucle.
pawn Код:
#include <a_samp>
//#include <aINC>
#include <aINC\a_bucles>

new Bucle:test<50>;

main()
{
    printf("Comenzando con los bucles");
   
    forAg(test, 2);
    forAg(test, 9);
    forAg(test, 7);

    printf("\n");

    printf("Valor al azar del bucle 'test': %d", forAz(test));
}
  • el resultado de dicho cуdigo, tendrнa que ser...
Quote:

//este
Valor al azar del bucle 'test': 2

//este
Valor al azar del bucle 'test': 7

//o este
Valor al azar del bucle 'test': 9

Buscar una repeticiуn y limpiar el bucle.

  • esta es la ъltima parte de este mini tutorial, en la que ocuparemos 2 funciones del include, estas son "forBu" y "forLi".
pawn Код:
#include <a_samp>
//#include <aINC>
#include <aINC\a_bucles>

new Bucle:test<50>;

main()
{
    printf("Comenzando con los bucles");
   
    forAg(test, 2);
    forAg(test, 9);
    forAg(test, 7);

    printf("\n");

    if(forBu(test, 9))
    {
        printf("la repeticiуn con valor de 9 existe en el bucle");
    }
    else
    {
        printf("no existe una repeticiуn con valor de 9 en 'test'");
    }

    forLi(test);

    if(forBu(test, 9))
    {
        printf("la repeticiуn con valor de 9 existe en el bucle");
    }
    else
    {
        printf("no existe una repeticiуn con valor de 9 en 'test'");
    }
}
  • el resultado de dicho cуdigo serнa.
Quote:

la repeticiуn con valor de 9 existe en el bucle
no existe una repeticiуn con valor de 9 en 'test'

  • en la primera, existe el valor 9 en el bucle ya que se agrega con anterioridad, pero en la segunda, se usa la funciуn "forLi" y borramos todas las repeticiones del bucle, por lo que al buscarlo no lo encontrariamos.
Interno

  • el include tiene 3 tipos de bucles ya creados internamente, para ser usados, existe la posibilidad de deshabilitar estos para que no se compilen al servidor y no se usen.
Bucle 'Players'.

  • este bucle guarda los ID's de los jugadores, esto hace que si hay 10 jugadores en el servidor, y el MAX_PLAYER esta definido en 500, de igual forma se haga un bucle de 10 repeticiones (1 repeticiуn por jugador) y no las 500 que se definen.
  • esa es una de las razones por las que es mas rбpido este tipo de bucle.
  • este es el ъnico bucle que viene activado dentro del include, pero si se desea desactivar, simplemente hace falta agregar una linea antes del include.
pawn Код:
#include <a_samp>
#define BUCLES_NO_PLAYERS // Le decimos al compilador que no agrege el bucle defecto Players
//#include <aINC>
#include <aINC\a_bucles>
Otros bucles pre-definidos.

  • todos los siguientes bucles, estan dentro del include deshabilitados, para habilitarlos hay que agregar una linea segъn corresponda.
  • Bucle:NPCs
    • bucle deshabilitado por defecto
    • funciona solo para los NPC's que esten conectados al servidor
    • para habilitarlo
      pawn Код:
      #include <a_samp>
      #define BUCLES_SI_NPCS // Habilitamos el bucle para NPCs
      //#include <aINC>
      #include <aINC\a_bucles>
  • Bucle:PlayersNPCs
    • bucle deshabilitado por defecto
    • funciona para NPC's y Players conectados en el servidor
    • para habilitarlo
      pawn Код:
      #include <a_samp>
      #define BUCLES_SI_NPC_PLAYERS // Habilitar bucle que cuenta NPCs y Players
      //#include <aINC>
      #include <aINC\a_bucles>
Descarga

Actualizaciones

  • 26-09-2013
    • se optimiza de tal forma que la velocidad incrementa considerablemente, tanto que en algunos casos llega a mas de 200 veces lo que era en su versiуn anterior
    • se agrega la funciуn "forValido" para verificar que una repeticiуn de un bucle es funcional, normalmente se deberia usar para cuando se usa "forEl" o "forLi" dentro de un recorrido con "forEach"
    • se agrega "forAgU" que es basicamente lo mismo que "forAg" con la ъnica diferencia a que este solo agregarб valores ъnicos, en otras palabras, si el valor ya existe, no lo volverб a agregar
    • se bloquea el uso del dнgito ((1<<31)-1) ya que es el dнgito nulo de todos los bucles
  • 14-06-2013
    • publicaciуn de la primera versiуn del include
Reply
#2

їy para que sirve esto?
Reply
#3

Grandioso (Y) Muy Bueno Bro...
Reply
#4

Goten, las repeticiones (bucles, loops o como le llames) normalmente tienen un final determinado... por ejemplo, al enviarle un mensaje a todos los administradores (solo a ellos), debes hacer un bucle para comprobar que jugador es administrador y quien no. Con este include, puedes formar "grupos" para no tener que ver que jugador es administrador y quien no, ya que solo guarda los que si son.

Esto hace que la velocidad de procesamiento sea mucho mas rбpido. Dependiendo cuantos jugadores hayan en tu servidor y en cuanto este definido el MAX_PLAYERS (o slots de tu servidor).

Si tienes el MAX_PLAYERS en 200, y tienes 20 jugadores conectados, el bucle serнa 10 veces (estimaciуn, igual dependerб de lo que incluya dicho bucle) mas rбpido de lo que serнa sin el include.
Reply
#5

muy bien , desde hoy usare este si en realidad es mejor que el de ******
si estб es la primera versiуn como serбn las demбs o_o?

igual muy increнble saludos amigo
Reply
#6

Incluya bueno, felicitaciones!
Reply
#7

їEsto no serнa lo mismo quй poner en todos los bucles for GetMaxPlayers();?
Osea asн

pawn Код:
for(new i; i < GetMaxPlayers(); i++)
{
if(IsPlayerConnected(i))
{
SendClientMessage(i, -1, "sa");
}
}
Reply
#8

JustBored, el bucle que tu dejas se repetirб el nъmero de slots de el servidor.

El tipo de bucle del include, hace que solo se repita el nъmero de veces que se establece. Como por ejemplo el bucle que ya tiene por defecto el include, el bucle "Players", dependerб de cuantos jugadores esten conectados. De acuerdo a este nъmero, se repetirб.

Por eso esta forma es mas rбpida.
Reply
#9

Es genial, ya te habia dicho que haces buenos trabajos, pero sabes lo que quiero (un plugin)
Reply
#10

El titulo estб mal, ya que TODOS los bucles son exactos, que haga iteraciones inecesarias es diferente, para eso mejor di, crea solo las repeticiones necesarias
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)