User Tag List

Página 2 de 2 PrimerPrimer 12
Resultados 16 al 19 de 19

Tema: Enkonsierto, un regalito para que trabajes

  1. #16

    Fecha de ingreso
    Apr 2003
    Ubicación
    Salamanca
    Mensajes
    5,344
    Mencionado
    2 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    13
    Agradecer Thanks Received 
    35
    Thanked in
    Agradecido 29 veces en [ARG:2 UNDEFINED] posts
    Eso que mencionas se debe a la funcion clone() que duplica el arbol completo y se utiliza en append(). Bien esa funcion no se utiliza ya al cargar ficheros, ahora utiliza una funcion llamada add que evita todo eso y tambien evita los releases que requieren despues.

    De todos modos le echare un vistazo.

  2. #17

    Fecha de ingreso
    Jun 2003
    Ubicación
    Madrid
    Mensajes
    1,266
    Mencionado
    4 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    3
    Agradecer Thanks Received 
    27
    Thanked in
    Agradecido 15 veces en [ARG:2 UNDEFINED] posts
    Ya me imaginaba que algunas cosas ya estaria mejorao, pero creo que el debug/profiler este puede venir muy bien para el PROBLEMA que me tiene loco


    ¡¡¡ SUERTE !!!!

  3. #18

    Fecha de ingreso
    Jun 2003
    Ubicación
    Madrid
    Mensajes
    1,266
    Mencionado
    4 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    3
    Agradecer Thanks Received 
    27
    Thanked in
    Agradecido 15 veces en [ARG:2 UNDEFINED] posts
    Morti, este codigo parece tener el mismo sintoma que ML_Lib.

    Código:
    void gr_fill_nearest_table()
    {
            int n ;
            SDL_Color c ;
            register fillpoint * ptr ;
            fillpoint * next ;
    
    dime("gfnt 0");
            for (n = 1 ; n < 256 ; n++)
            {
                    c = palette[n] ;
                    c.r /= 8 ;
                    c.g /= 8 ;
                    c.b /= 8 ;
                    add_filling (c.r, c.g, c.b, n, DRIGHT) ;
                    if (c.r < 31) add_filling (c.r+1, c.g,   c.b,   n, DRIGHT) ;
                    if (c.r > 0)  add_filling (c.r-1, c.g,   c.b,   n, DLEFT) ;
                    if (c.g < 31) add_filling (c.r,   c.g+1, c.b,   n, DDOWN) ;
                    if (c.g > 0)  add_filling (c.r,   c.g-1, c.b,   n, DUP) ;
                    if (c.b < 31) add_filling (c.r,   c.g,   c.b+1, n, DIN) ;
                    if (c.b > 0)  add_filling (c.r,   c.g,   c.b-1, n, DOUT) ;
            }
    
    dime("gfnt 1");
    n=0;
            while (filling)
            {
    dimeNum("N",n++);
    int i=0;
                    ptr = filling ;
                    while (ptr)
                    {
    i++;
                            if (ptr->r < 31) add_filling(ptr->r+1, ptr->g,   ptr->b,   ptr->color, DRIGHT) ;
                            if (ptr->r > 0)  add_filling(ptr->r-1, ptr->g,   ptr->b,   ptr->color, DLEFT) ;
                            if (ptr->g < 31) add_filling(ptr->r,   ptr->g+1, ptr->b,   ptr->color, DUP) ;
                            if (ptr->g > 0)  add_filling(ptr->r,   ptr->g-1, ptr->b,   ptr->color, DDOWN) ;
                            if (ptr->b < 31) add_filling(ptr->r,   ptr->g,   ptr->b+1, ptr->color, DIN) ;
                            if (ptr->b > 0)  add_filling(ptr->r,   ptr->g,   ptr->b-1, ptr->color, DOUT) ;
                            next = ptr->next ;
                            del_filling (ptr) ;
                            ptr = next ;
                    }
    dimeNum("I",i);
            }
    dime("gfnt 2");
    }
    Código:
    static inline fillpoint * add_filling(int r, int g, int b, int color, int dir)
    {
            fillpoint * n ;
    
            if (nearest_table[r*2][g*2][b*2] != 0)
                    return 0 ;
    
            //printf ("%02d %02d %02d -> %d\n", r, g, b, color) ;
    
            nearest_table[r*2+0][g*2+0][b*2+0] = color ;
            nearest_table[r*2+0][g*2+0][b*2+1] = color ;
            nearest_table[r*2+0][g*2+1][b*2+0] = color ;
            nearest_table[r*2+0][g*2+1][b*2+1] = color ;
            nearest_table[r*2+1][g*2+0][b*2+0] = color ;
            nearest_table[r*2+1][g*2+0][b*2+1] = color ;
            nearest_table[r*2+1][g*2+1][b*2+0] = color ;
            nearest_table[r*2+1][g*2+1][b*2+1] = color ;
    
            n = malloc(sizeof(fillpoint)) ;
            n->r = r ;
            n->g = g ;
            n->b = b ;
            n->color = color ;
            n->dir = dir ;
            n->next = filling ;
            if (filling)
                    filling->prev = n ;
            n->prev = 0 ;
            return filling = n ;
    }
    Código:
    static inline void del_filling(fillpoint * n)
    {
            if (n->prev)
                    n->prev->next = n->next ;
            else
                    filling = n->next ;
            if (n->next)
                    n->next->prev = n->prev ;
            free (n) ;
    }

    El problema esta en el while doble de gr_fill_nearest_table: son 32703 iteracciones del while interior en total, tarda 4.1055 milisegundos la GP32 por iteraccion.... total casi 2 minutos.

    Te adjunto todo el codigo, estas funciones se encuentran en src/g_pal.c
    Archivos adjuntados Archivos adjuntados

  4. #19

    Fecha de ingreso
    Apr 2003
    Ubicación
    Salamanca
    Mensajes
    5,344
    Mencionado
    2 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    13
    Agradecer Thanks Received 
    35
    Thanked in
    Agradecido 29 veces en [ARG:2 UNDEFINED] posts
    Estoy en ello. A ver si comparando algoritmos puedo ver que problema tiene la GP32.

Página 2 de 2 PrimerPrimer 12

Permisos de publicación

  • No puedes crear nuevos temas
  • No puedes responder temas
  • No puedes subir archivos adjuntos
  • No puedes editar tus mensajes
  •