Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Cambio en el sistema de render

Iniciado por Prompt, 01 de Septiembre de 2008, 12:43:48 AM

« anterior - próximo »

Prompt

Hola a todos!  ::)

Bueno he tenido que pararme a optimizar el motor de render y limpiar llamadas al fixed pipelines para poder tener un buen frame rate en modo DEBUG.



La textura del suelo la he hecho yo! de ahi la eleccion de colores magistral xD, menudo azul me ha salido... pero bueno.

Este post tiene como motivo llevaros a todos los que lo leais a una reflexión sobre vuestras implementaciones en motores 3D. Muchas veces hacemos convivir el fixed pipeline con el programmable pipeline, con cosas pequeñas, escenarios poco complejos suele rendir bien la tarjeta, pero cuando tienes muchos objetos o geometria que necesitas controlar para mover, o hacer un path finding, la cosa ya se complica. Acabas teniendo 600 objetos en un escenario que parece pequeño, centenares de bounding boxes, instancias y dios sabe que más.

Pues bien, que se hace en estos casos, pensar y optimziar aquello que sabes que hiciste un poco regular. Pero y si ese no era el problema?
Me encontré con una sorpresa enorme al crearme una pequeña clase para medir tiempos. La pasada de GL_SELECT tardaba 2 veces o más que la de render. Dios! xD intenté quitar muchas porquerias del medio pero aquello aún iba fatal.

Busqué y busqué por internet hasta leer en el foro de nVidia a un "tipo" que le recomendaba a otro que para usar GL_SELECT se trucara los drivers de las QUADRO FX. Decía basicamente que en los drivers de OpenGL a partir de cierta versión, nVidia y ATI habian decidido desactivar la aceleracion por HARDWARE. Me quedé de piedra, claro decian que lo normal era usar esa extensión en workstations y tal. Y yo pensando, serán!!... Y me dije a mi mismo, que les den! cogi mi calculo de ray tracing y usé mis BBOX por instancia. Para optimizarlo, organicé la función para que solo mirara en las listas del Resource Manager aquello que yo queria "encontrar".

El resultado fue espectacular, los FPS no se caian y todo iba fluido, sin contar que aquella logica de orden me da muchisima ventaja a la hora de hacer ciertas cosas.

Resumen:
Paso 1: acabar con la pasada de GL_SELECT
Paso 2: borrar todo atisbo de glPush y glPop Matrix y aquello de pintar lineas de debug y cosas similares. Fixed pipelines los justos. Para asignar entre sentencia begin y end de cada shader.
Paso 3: hacer como "read only" todas las pasadas de render. Esto es que, no se tenga que tocar nada de información de ninguna clase. Simplemente renderizar.

Hasta aqui una experiencia más sobre optimizacion. Cada vez que en modo DEBUG va a bajos FPS, toca optimizar. Llegará el momento en el que tenga que pasar a un estado HYBRID, que para quien no lo sepa es como configurar la compilación en modo RELEASE con información de debug. Esto es util sobre todo cuando tienes skinning, animaciones y tal, mucha multiplicación de matriz, eso asesina a la CPU :P y hace un cuello de botella enorme.

Un saludo.






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.