2009-11-23 2 views
0

Je dessine sur une dynamique des fluides en Python. Après un moment, je cherche un peu plus de vitesse, donc j'ai réécrit la logique actuelle en C et mis en place des liaisons Python (en utilisant SWIG).C lib avec les bindings Python où les deux veulent rendre

Mon problème maintenant est que je ne sais pas comment le rendre dans le bon sens. La logique est exécutée pixel par pixel afin que les pixels soient ce que je veux suivre et rendre.

Python donne mon un TypeError si je tente de faire une fonction dans le répertoire C lib qui accepte un SDL_Surface*, je suis sans doute un peu naïf de penser que PyGame mappé facilement que directement à SDL. Python semble également pas sûr de ce qu'il faut faire si je fais que les librairies "init" de C retournent un SDL_Surface*.

Quelle est une bonne façon de faire cela? Ce ne serait pas un problème si je restituais tout dans le C lib. Mais je veux y mettre une interface graphique (en utilisant Python). Le C lib garde déjà la trace des pixels qui sont "sales". Devrais-je exposer cette liste et laisser Python la boucler, appeler une fonction pour chaque pixel sale? Semble mal, car ce genre de boucles énormes sont la raison exacte que je voulais réécrire une partie de l'application en C.

Et avant que quiconque ne l'indique, Boost.Python est un peu lourd à installer en ce moment (depuis que je suis sur Windows), donc je vais m'en tenir à SWIG pour le moment (à moins que quelqu'un ait une façon intelligente d'installer "juste" boost.python?). Je souhaite une solution miracle ici. Comment créer un C lib, exécuter SDL, partager une cible de rendu avec Python, lancer PyGame?

Répondre

0

Avez-vous essayé quelque chose comme ce qui suit pour obtenir SDL_Surface* de l'objet python?

PySurfaceObject *obj; 
SDL_Surface *surf; 
if (!PyArg_ParseTuple(args, 'O!', &PySurface_Type, &obj) { 
    return NULL; # or other action for error 
} 
surf = PySurface_AsSurface(obj); 
+0

I a fini par la création de la surface dans le python, et de rendre le C lib retourner un tuple trois articles (x, y, PALETTEINDEX) des pixels dans le besoin de repeindre. J'ai en fait de très bonnes performances avec ça, je suppose que c'est parce que j'utilise PyGame (SDL), de bonnes liaisons apparemment. Bien que je pensais que les appels seraient plus chers. – Mizipzor

+0

'PySurface_AsSurface' est juste une macro pour l'accès des membres struct, donc c'est très chip. –