[eside-ghost] extensiones C/C++ para Python
Jon Valdés
juanval en gmail.com
Vie Mayo 2 12:00:48 CEST 2008
2008/5/2 altern <altern2 en gmail.com>:
> efectivamente en este caso no me sirve de nada pq los objetos pueden de
> posicion en cuaquier momento. Yo entiendo que lo de las listas tiene sentido
> en un mundo 3D donde estas moviendo la camara y puede que un objeto pero el
> mundo en si no se mueve. Pero no estoy seguro. en este caso todo puede
> moverse asi que no hay ninguna ventaja en usar esto.
(disclaimer: ahora mismo tengo el teclado en yankee y no puedo poner
acentos ni enyes)
Las display lists se pueden usar aunque los objetos cambien de
posicion, tamanyo o rotacion. Solo tienes que hacer las llamadas de
translate, rotate y scale, y luego llamar a la display list. El asunto
es que para llamar a una display list de un unico poligono, no te va a
salir rentable hacerlo.
> bueno el codigo es medianamente complicado pq es parte de una libreria que
> gestiona los eventos, abre la ventana ... Os adjunto la parte donde se
> concentra las funciones OpenGL y la lista del render. Como vereis las
> funciones son bastante abstractas, puede servir para muchos casos, esto
> supongo que no es muy adecuado pero la cuestion es que las uso mientras
> desarollo protopipos y luego una vez tengo todo claro sobre escribo la
> funcion render de los objetos haciendo las llamadas OpenGL a pelo para sacar
> mas rendimiento. Creo que este modulo es el que tendria que pasar a C. Por
> cierto que antes era una clase dentro del modulo graphics.py pero despues de
> los emails de esta semana se me ocurrio que era mas sencillo tenerlo como un
> modulo con funciones. Siempre ayuda hablar con otra gente de los problemas
> de uno, se te ocurren soluciones.
Mirando el codigo por encima, si que veo un par de cosillas que pueden
estar dandote problemas.
Primero: los quadrics, en mi experiencia, son horriblemente poco
optimos. Recuerdo una libreria que hice que con quadrics iba a 10 fps,
y despues de reimplementar el dibujado de circulos a mano, iba a 40
fps. Si tienes muchos objetos de tipo circulo, te recomiendo que
pruebes a reimplementar el dibujado de circulos usando
GL_TRIANGLE_FANs por ejemplo, y a ver si mejora.
Segundo: Hacer muchas llamadas a glEnable/glDisable se come el
rendimiento bastante rapido. Una tecnica para mejorar esto es ordenar
los objetos de forma que todos los que lleven textura (o line stipple,
o blending, o lo que sea) se dibujen seguidos, sin tener que hacer
glEnables y glDisables entre ellos. Haces un glEnable antes de dibujar
el primero, y haces el glDisable despues de dibujar el ultimo. Pierdes
un poco de cpu al tener que ordenar los objetos, pero si tu cuello de
botella esta en las llamadas a OpenGL, esto las mejorara bastante.
De todas formas, esto son palos de ciego porque no he pasado el codigo
por un profiler. Te recomiendo que lo primero pases el programa por un
profiler de python, y si te dice que el cuello de botella esta en las
llamadas a OpenGL, le pases un profiler de OpenGL a ver :)
Suerteeeee
Un saludo,
Jon Valdes
Más información sobre la lista de distribución eside-ghost