Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





UNa AYUDA CON LA VELOCIDAD.

Iniciado por xeex, 23 de Octubre de 2007, 12:51:09 AM

« anterior - próximo »

xeex

Hola a todos.
Estoy haciendo un programa.
En el creo figuras 3d, con planos, poligonos y cilindros,etc.
a la hora de crear una superficie curva doy la posibilidad de elegir con cuantos lados se desea que se cree, un cilindro, por ejemplo.
Cuando se acumulan las superficies cilindricas o esfericas el numero de lados crece muy rapido lo que pondria el programa lento.
Estaba tratando de que en el momento de crear las superficies, ya sean planas cilindricas o esfericas, se cree un display list asociado para cada una de ellas , de esta forma mi cilindro,por ejemplo, de n(muchos) lados es precompilado y asi no se tendrian que hacer los costosos calculos que se requieren.
Pero al parecer no se puede crear un display list en tiempo de ejecucion.
Mi pregunta es como hacen los programas "grandes" para que no se ponga lento  a medida qie se crean mas y mas objetos mientras trabajamos en ellos.

Es posible crear un display list en tiempo de ejecucion?, por que lo que es a mi no me funciona.
GRACIAS
Y SALUDOS.

Pogacha

Es posible crear un display list en tiempo de ejecucion?
Definitivamente.

Ahora sobre tu problema de velocidad existen muchisimos factores a tener en cuenta y generalmente un display list no soluciona muchos de ellos.

¿Estas usando aceleracion por hardware?
¿Estas dibujando lineas en ves de caras llenas?
¿Estas calculando cada elemento en cada frame?
¿Estas usando fan o strips para acelerar?
¿De cuantos poligonos hablas?
¿De cuantos vertices hablas?
¿Estas usando vbo para evitar trafico por el canal agp?

Saludos

xeex

GRACIAS POGACHA.
Mira si estoy usando caras llenas en vez de lineas.
Estoy usando acceleracion por hardware.
calculo cada elemento en cada frame
¿Estas usando vbo para evitar trafico por el canal agp? eso no lo entendi.
¿Estas usando fan o strips para acelerar? eso no lo entendi.

Bueno mi caso es que si se soluciona con un displaylist, por ejemplo en ese tiempo , yo creaba un cilindro de digamos 32 caras=128 vertices con lo que ya andaba lento. Entonces para probar, lo
que hice fue hacer un displaylist, claro no en el loop principal(osea no en tiempo de ejecucion), y luego llamarlo con el calllist desde la funcion de dibujado en el loop principal. Lo que paso fue es que se le quito lo lento, osea el call list me funciono.

Pero lo que quiero es crear la cantidad de listas que yo quiera pero no lo logro, osea funciona, crea el cilindro en un displaylist y lo llamo con un calllist pero todo se pone ultralento a ,digamos, 1fps.
Mi duda era que a lo mejor si se creaba en tiempo de ejecucion se producia un error de memoria o algo por el estilo ya que el display list hace una reserva de memoria, pero tu me dices que no es asi.

que estare haciendo mal?
lo que hago es:
-en el programa doy a elegir que tipo de objeto se quiere crear:
        -plano
        -cilindro
        -esfera
        -cono
        -etc
-pregunto el acho y el alto deseado
-pregunto por la texura que lo cubrira
-pregunto por el nro de veces que la texura se repetira en alto y ancho
-pregunto,en el caso de las superficies curvas,el numero d lados q tendra
-los objetos los creo por defecto en el origen, luego doy la posivilidad de rotarlos, escalarlos, moverlos, eliminarlos,etc.

-estos datos(ancho,alto,posicion,tipo,etc) los trasformo en coordenadas
x, y, z  que representan los vertices de cada objeto y los dejo en un archivo que llamo objetos.txt

-luego otra seccion del programa a la cual llamo escena(), se encarga de leer si el archivo de objetos a aumentado, es decir, si hay algun nuevo objeto.

en el caso de que se haya ingresado, por ejemplo, un cilindro, esta funcion crea un display list asociado a ese objeto es decir
para el caso de un cilindro seria algo como

            lista[x]=glGenList(1);
            glNewList(lista[x],GL_COMPILE);
            dibujar_objeto(cilindro);
            glEndList();

donde x es el numero de objetos, y "cilindro", en la funcion, dibujar_objeto(cilindro) se dibuja a partir de las coordenas de los vertices
que se encuentra en al archivo objetos.txt

luego llamo al glCallList(lista
  • );


    y eso seria.... pero no funciona... todo se pone hiperlento.
    ¿QUE SERA?

    el codigo en general seria asi:

         
    void dibujar_objeto(cilindro o esfera o lado o etc etc etc)
      {
         leer_vertices_desde_archivo();//aki leo los vertices desde un txt
         gl_Begin(...);//aki dibujo el objeto
         .
         .
         .
         gl_end();
      }


    void escena()
      {
         .
         .
         .
         if( si_hay_algun_objeto_nuevo_en_el_archivo_txt_de_objetos)
            {
                lista[x]=glGenList(1);
                glNewList(lista[x],GL_COMPILE);
                if(hay_un_cilindro)            
                   dibujar_objeto(cilindro);
                if(hay_un_plano)            
                   dibujar_objeto(plano);
                if(hay_una_esfera)            
                   dibujar_objeto(esfera);
                glEndList();
         .
         .
         .
         for(int i=0;i<nro_de_x;++i)
            callList(lista[i]);
      }
    main()
      {
         do
            {
              .
              .
              .
              teclado();
              mouse();
              escena();
              .
              .
              .
            }
         while(!ESC)
      }



    GRACIAS POR LA AYUDA

Pogacha

1ro no deberias leer desde un archivo eso seguro que ralentiza todo.
Tienes que crear una estructura de datos llamada por ejemplo "Escena" la que sea un contenedor de objetos y dar la opción de grabar esta "Escena"

Te escribo un codigo incompleto cosa que te hagas una idea de como se me ocurre a mi seria lo mejor para vos. Si lo entiendes no tendras problemas, sino pregunta.


enum {
 TIPO_CILINDRO,
 TIPO_ESFERA,
 TIPO_CUBO,
 ....
};

struct Objeto {
  int tipo;
  int caras;
  int otras_propiedades;
  glint display_list_id;

// para la lista enlazada
  struct Object* Siguiente;
  struct Object* Anterior;
};

typedef struct Object* ObjetoPtr;

void Crear_DisplayList(ObjetoPtr objeto)
{
  objeto->display_list_id = glGenList(1);
  switch(objeto->Tipo)
  {
      case TIPO_CILINDRO:
        ...
    // aqui creo la lista segun el tipo de objeto y sus propiedades
  };
}


struct Escena {
   ObjetoPtr Lista;
};


typedef struct Escena* EscenaPtr;

void Guardar_Escena(char* filename, Escena* escena)
{
 FILE* f= fopen(filename,"wb"); // o wt dependiendo de como los guardes
  // acá guardo los objetos
 
}


EscenaPtr Cargar_Escena(char* filename)
{
  FILE* f= fopen(filename,"rb"); // o rt dependiendo de como los guardes
  EscenaPtr escena = malloc( sizeof(Escena) );

  // acá leo y reconstruyo los objetos
 return escena;
}

void Dibujar_Objeto(ObjetoPt objeto)
{
  //esta te queda facil solo llamas al list id
}

xeex

muchas gracias por tomarte el tiempo de responder.
Voy a pobar a ver que me resulta
SALUDOS






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.