їEsto puede causar lag?
#1

En sqlite hago que se muestren todos los miembros conectados y desconectados de un clan especifico en un dialogo, por ejemplo uso /miembrosclan 50 y aparece un dialogo con todos los jugadores del clan ID 50,,, y se empieza a extraer el nick de la base de datos de todos esos miembros que sean de ese clan, que incluso a veces son 70 jugadores,,, osea 70 jugadores en el dialogo puede dar lag eso??
Reply
#2

Eso depende del script que estйs utilizando. Tal vez estб mal optimizado, consumiendo asн muchos recursos y ocasionando el "lag". O puede que sea el servidor, quien no rinde a nivel recursos la capacidad requerida.

Pasa el script del comando /miembrosclan para echar un vistazo.
Reply
#3

Algo debe andar mal porq por mбs grande que sea la consulta y aunque tengas el servidor mysql remoto te debe andar en ms , te recomiendo usar el MySQL en el mismo host de tu sv SA-MP
Reply
#4

No tiene sentido mostrar todo los miembros en una sola vez, muestralos en paginas con LIMIT %d, %d.
Reply
#5

En el caso de que sean 70 jugadores... cada nombre contiene un mбximo de 24 carбcteres (MAX_PLAYER_NAME) en SA-MP 0.3.7, osea que el diбlogo debe contener 70*24 celdas (1680).


pawn Код:
new tmp[1680];
Si te refieres a la consulta a la base de datos, no deberнa demorar mas de unos cuantos mili-segundos.

Lo otro que te debes preguntar es si dicha funciуn se ocuparб bastante. Crees que vean demasiado todos los miembros de un clan? Lo dudo.
Reply
#6

Gracias por responder a todos...
de esta forma hice el codigo, funciona bien pero no se si sera la manera correcta

Код:
new DBResult:result, query[256], nombremiembro[30], string[100 * MAX_PLAYER_NAME];
format(query,sizeof(query),"SELECT * FROM `USERS` WHERE `clan` = '%d' LIMIT 100", ClanSeleccionado[playerid]);

result = db_query(base,query);
for(new a;a<db_num_rows(result);a++)
{
     db_get_field_assoc(result, "nombre", nombremiembro, 30);
     format(string, sizeof(string), "%s%s\n",string, nombremiembro);
     db_next_row(result);
}
db_free_result(result);
ShowPlayerDialog(playerid, D_NADA, DIALOG_STYLE_LIST, "Todos los miembros", string, "Cerrar", "");
Reply
#7

Si quieres saber cuanto tiempo demora en ejecutarse el cуdigo ese que publicaste, cбmbialo por este:

pawn Код:
new tick = GetTickCount();

new DBResult:result, query[256], nombremiembro[30], string[100 * MAX_PLAYER_NAME];
format(query,sizeof(query),"SELECT * FROM `USERS` WHERE `clan` = '%d' LIMIT 100", ClanSeleccionado[playerid]);

result = db_query(base,query);
for(new a;a<db_num_rows(result);a++)
{
     db_get_field_assoc(result, "nombre", nombremiembro, 30);
     format(string, sizeof(string), "%s%s\n",string, nombremiembro);
     db_next_row(result);
}
db_free_result(result);
ShowPlayerDialog(playerid, D_NADA, DIALOG_STYLE_LIST, "Todos los miembros", string, "Cerrar", "");

printf("Demorу %d milisegundos en ejecutarse.", GetTickCount()-tick);
De todas formas, puedes utilizar un mйtodo de optimizaciуn en cuanto a procesador, pero ocupa mas memoria RAM; aunque eso en SA-MP prбcticamente no importa ya que un script por mucho cуdigo que tenga no superarб los 15mb de RAM que utiliza. Y esto, es nada en comparaciуn a lo normal que tienen los computadores hoy en dнa.

Cual es ese mйtodo? Generar las cadenas solo una vez, y mostrar lo generado... Osea:


pawn Код:
#define MAXIMO_CLANES 64 // Nъmero mбximo de clanes que soporta el servidor
#define MAXIMO_CLAN_MIEMBROS 128 // Nъmero mбximo de miembros que podrб tener cada clan
//#define MAX_PLAYER_NAME 24 // Longitud mбxima que tendrбn los nombres de usuarios
#define DIALOGO_MIEMBROS_CLAN 1001

enum _@dialogosClanes
{
    iclan_clanid,
    iclan_clandialog[MAXIMO_CLAN_MIEMBROS*MAX_PLAYER_NAME],
}
new infoClanes[MAXIMO_CLANES][_@dialogosClanes];

stock showPlayerClanDialog(playerid, cclanid = -1, ccelda = -1)
{
    // Obtener la celda que ocupa el clan
    new celda = ccelda == -1 ? celdaClanDialog(cclanid) : ccelda;

    // Saber si ya ha sido cargado el clan
    if(!infoClanes[celda][iclan_clanDialog][0])
        // Si no ha sido cargado el diбlogo de clanes
        actualizarClanDialog(.ccelda = celda);

    // Muestra el diбlogo
    return ShowPlayerDialog(playerid, DIALOGO_MIEMBROS_CLAN, DIALOG_STYLE_LIST, "Miembros del clan...", infoClanes[celda][iclan_clanDialog], "Cerrar", "");
}

stock celdaClanDialog(cclanid)
{
    // Recorrido por todos los clanes
    for(new i = 0; i < MAXIMO_CLANES; i++)
        // Encontrу el clan
        if(infoClanes[i][iclan_clanid] == cclanid) return i;

    // No hay clan con dicho ID
    return -1;
}

stock actualizarClanDialog(cclanid = -1, ccelda = -1)
{
    // Obtener el ID del clan
    new clanid = cclanid == -1 ? infoClanes[ccelda][iclan_clanid] : cclanid;

    // Contenedores
    new
        query[52+12]; // Query

    // Forma la consulta
    format(query, sizeof(query),"SELECT * FROM `USERS` WHERE `clan` = '%d' LIMIT "#MAXIMO_CLAN_MIEMBROS, clanid);

    // Envia la query
    new DBResult:resultado = db_query(base, query);

    // Ocurriу un error durante la ejecuciуn de la query
    if(!resultado) return false;

    // Obtener los resultados encontrados
    new encontrados = db_num_rows(resultado);

    // Contenedores
    new
        nombreMiembro[MAX_PLAYER_NAME],
        nuevaLinea[MAX_PLAYER_NAME+4];

    // Celda que ocupa el clan
    new celda = ccelda == -1 ? celdaClanDialog(clanid) : ccelda;

    // Reinicia el contenido del diбlogo
    infoClanes[celda][iclan_clanDialog][0] = EOS;

    // Encontrу miembros
    if(encontrados)
    {
        // Recorrido por los resultados
        for(new i = 0; i < encontrados; i++)
        {
            // Obtener el nombre del miembro
            db_get_field_assoc(resultado, "nombre", nombreMiembro, sizeof nombreMiembro);

            // Forma la nueva lнnea
            format(nuevaLinea, sizeof nuevaLinea, "%s\n", nombreMiembro);

            // Concatena la nueva lнnea al diбlogo final
            strcat(infoClanes[celda][iclan_clanDialog], nuevaLinea, MAXIMO_CLAN_MIEMBROS*MAX_PLAYER_NAME);

            // Siguiente resultado
            db_next_row(resultado);
        }
    }
    // No tiene miembros el clan
    else
    {
        //
        format(infoClanes[celda][iclan_clanDialog], MAXIMO_CLAN_MIEMBROS*MAX_PLAYER_NAME, "Este clan no tiene miembros.");
    }

    // Libera resultados de la consulta
    db_free_result(result);

    return true;
}
Donde muestras el diбlogo con la funciуn "showPlayerClanDialog" de la forma:

pawn Код:
showPlayerClanDialog(playerid, .cclanid = 16);
Y cada vez que ingresa o sale algun miembro del clan, debes usar "actualizarClanDialog", de la misma forma:

pawn Код:
actualizarClanDialog(.cclanid = 16);
Para la prueba de velocidad, debes usar esto:

pawn Код:
new tick = GetTickCount();
showPlayerClanDialog(playerid, .cclanid = 16);
printf("Demorу %d milisegundos.", GetTickCount()-tick);
Muestra los resultados.
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)