Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Acelerar Lo Fps De Tu Aplicacion 3d

Iniciado por AGONY, 19 de Julio de 2003, 03:35:27 AM

« anterior - próximo »

AGONY

 Hola, he estado probando formas de acelerar los FPS de mi proyecto es en primera persona ,bueno ahi va el asunto tengo una lista doblemente enlazada en la que cada nodo es un objeto3D. He estado mirando alguna forma de hacer zonas como en el bsp. Como yo hago el diseño de mis mapas tengo la posibilidad de decidir si estoy en la zona A no renderizo las zonas F,G,Z etc... ya que estoy seguro que desde ese punto no se ve. Esta forma es un poco guarri, pero es para evitar hacerme un arbol binario es que me gusta descubrir nuevas formas de hacer las cosas. Bueno asi me evito renderizar todos los poligonos,otra cosa que he echo es a la hora de colisionar  con los objetos he usado un cubo para cubrir a todos mis objetos  y solo tengo que comparar si mi camara se intersecta con los limites de este cubo entonces es cuando compruebo la colision con ese objeto algo de tiempo gano aunque no mucho. Es que si no deberia de estar todo el rato comprobando si colisiona o no cosa que pierde mucho tiempo. Bueno si alguien tiene ideas o mejorar lo que he expuesto soy todo ojos. Uso Opengl, me han comentado algo de Vertex arrays ¿ alguien sabe que es eso y como funciona ?

tiutiu

 Los vertex arrays (mirate la extension VBO, Vertex Buffer Object) lo q hacen es reservar memoria en la tarjeta grafica, con lo cual corre q se las pela para acceder a esos datos; hay un thread q trata sobre eso aqui en stratos.

Lo de mirar la colision con las bounding boxes de cada objeto para ver si esta detras o delante pues tb se ha hablado hace poco xD Es el occlusion culling, lo que podrias hacer es 'ordenar' los objetos de delante a atras (del near al far plane) y renderizarlos por ese orden, ya q el algoritmo d occlusion se ve favorecido (como tiene por orden de proximidad, le es mas facil iterar para ver si el siguiente objeto esta tapado o no. Mirate este thread
b>:: Pandora's Box project ::
Notas e ideas sobre desarrollo de engines para juegos

DraKKaR

 Esta biene so de optimizar codigo y tecnicas para subir esos malditos FPS.

CitarComo yo hago el diseño de mis mapas tengo la posibilidad de decidir si estoy en la zona A no renderizo las zonas F,G,Z etc... ya que estoy seguro que desde ese punto no se ve.
Segun tengo entendido no haces ninguna guarrerida, creo ke esa tecnica  se llamaba "portales", y la usan juegos como blade o quake3. Supongo ke ahora lo haces a mano, lo de decidir que habitaciones se ven y cuales no, aunque creo que hay tecnicas para calcularlo ma o menos bien automaticamente.


Citarotra cosa que he echo es a la hora de colisionar con los objetos he usado un cubo para cubrir a todos mis objetos y solo tengo que comparar si mi camara se intersecta con los limites de este cubo entonces es cuando compruebo la colision con ese objeto algo de tiempo gano aunque no mucho
Bien hecho.. la colision con convex hulls, o volumenes es una buena manera de ahorrarse calculos.  Lo que yo te aconsejaria ademas de eso es que, si la colision la hace un objeto dinamico, no calcules la colision despues con todos los poligonos de ese objeto, en general con ese tipo de objetos calculando las colisiones con los volumenes que los rodean da buenos resultados.


Otra cosa ¡no has usado vertex arrays! como lo haces? a base de glBegin() glVertex... glEnd()?? Pa matarte...
básicamente con vertex arrays lo que haces es con una sola llamada pasarle a la tarjeta grafica todos los vertices de un objeto, que estan guardados en arrays. De la manera que lo haces tu, es la mas antioptimizada de como puedes hacerlo con opengl.
No voy a decirte la forma exacta de usar los vertex arrays en opengl, informate, y si aun asi no sabes te resolvere las dudas.

Supongo que para lsa texturas estaras utilizando glBindTexture no? XD Si no es asi tienes otro grave problema ed optimizacion en tu codigo.

AGONY

 Pero ¿Entonces depende de donde este situada la camara? me imagino, no lo se pero debe ser algo asi, porque yo puedo decir un ejemplo en cuanto sale la escena yo se donde esta situada la camara y puedo renderizar los objetos desde delante a atras pero si la camara se mueve(logicamente) entonces a lo mejor los que estaban delante quedan detras y los de detras quedan delante. Si estoy en lo cierto decirmelo porque no estoy muy seguro. Y por eso me imagino que comentabas esto de los bounding box ¿Creo que usando los Bounding Box se puede saber lo que esta delante ?  pues gracias a ver si la gente se anima.

AGONY

 Este post de arriba era pa responder a tiutiu es que cuando le estaba respondiendo se ve que has escrito el post DraKKaR. Bueno uso glBindTexture y tambien uso glVertex3fv para pasarle los vertices , Le hechare un vistazo a eso de los vertex arrays a ver que oño es eso.  He leido hace poco, que si usas ademas de los indices a los vertices usas los indices de las aristas deberia de ir mas rapido ya que solo dibuja una arista en donde se comparte dos caras de la forma que lo hago yo en cuanto dos caras comparten una misma arista se dibuja dos veces esto en pocos poligonos no pasa nada pero en muchos ¿Se podria notar?
 

DraKKaR

 AGONY, ten en cuenta que la solucion que te ha dado tiutiu de los Vertex Buffer Objects, y la que te he dado yo sobre los vertex arrays son diferentes. Hacer glVertexf... es lo peor del mundo... tienes que montarte un array con los datos del modelo asi con vertex arrays puedes renderizarlos con una sola llamada, y mucho mas rapidamente. Los VBO de los que habla tiutiu son una extension que te permiten meter datos en la memoria de video, solucion que es mucho mas eficiente que la que te he dado yo, ya que los vertex arrays de los ke yo hablo se guardan en la memoria local y al renderizar tienes que pasarlos a la memoria de video.

Si ademas de eso usas indices y subes los vertices necesarios, sin repetirlos y haciendo las caras con los indices sera mucho mas eficiente de lo que haces ahora, y deberia notarse mucho. Ya que ademas de pasarle menos info por el bus, al usar indices se usa la cache de indices (al menos en las geforce) que acelerara mas el proceso. Sia demas de eso usas strips para montarte los indices, ya sera la muerte XD.

Ah, otro consejo... agrupa la geometria que comparta un estado de opengl (como la textura) de forma que puedas renderizar el mayor numero de vertiecs con una sola llamada.






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.