8.13.2008

Caché Opengl con Python

Los decorators en python son tremendamente útiles, cada día veo cosas más interesantes creadas con decoratos. Últimamente sobretodo relacionadas con Django (me imagino que por su pronta 1.0), para temas de cachés.

Como python es bastante más lento que C++, cuando renderizo geometría estático con python la máquina tiende a morirse donde con c++ iría suavemente. Lo habitual en OpenGL es usar listas precompiladas para optimizar geometría estática, una especie de caché que deja en gpu los datos a renderizar.

tenemos el siguiente método:


def draw_complex_geometry():
glBegin(GL_QUADS);
for x in vertex:
....
glEnd();


Nada impide hacer el siguiente decorator:

def list_compiler(fn):
    fn.__gl_compiled = -1;
    def render():
        if(fn.__gl_compiled < 0):
            fn.__gl_compiled = glGenLists(1);
            glNewList(fn.__gl_compiled,GL_COMPILE);
            fn();
            glEndList();
        else:
            glCallList(fn.__gl_compiled);
    return render;

de esta forma decoramos el método:
@list_compiler
def draw_complex_geometry()...

De forma que la primera vez que se llame compilará ls lista opengl y las siguientes veces símplemente llamará a la geometría "cacheada"