2012-11-25 1 views
1

Je crée un jeu basé sur des tuiles, et la carte doit être rendue à chaque image. À l'heure actuelle, chaque tuile est de 32X32, et la carte visible est de 28X28 tuiles. La performance est horrible. Je l'ai récemment fait rendre seulement les tuiles visibles, mais cela n'a pas encore beaucoup amélioré le FPS. En ce moment je cherche un moyen d'accélérer le rendu. J'attribue la lenteur à la manière dont je rends; chaque carreau est individuellement mélangé à l'écran. Qu'est-ce qui serait plus efficace de le faire?Comment optimiser le rendu des vignettes dans pygame?

+0

Avez-vous profilé et déterminé que le rendu est le goulot d'étranglement? – delnan

+0

En ce moment, le programme ne fait que le rendu et le mouvement d'une image-objet, et le FPS est considérablement augmenté lorsque seul le sprite est rendu. –

+0

La vitesse du programme peut avoir à voir avec le rendu. Essayez de ne pas afficher le programme et imprimez simplement les images par seconde. Si c'est encore lent, postez le code afin que nous puissions voir exactement comment vous l'avez fait et si cela peut être fait plus rapidement. – PygameNerd

Répondre

2

En pygame (afaik), mettre à jour l'écran est toujours un sacré cou. Depuis que je ne pouvais pas voir votre code, je ne sais pas, comment vous mettez à jour l'écran. Le fait de ne faire que bluter les sprites qui ont changé est un début, mais vous devez seulement mettre à jour les parties qui ont changé, sur l'écran. Fondamentalement, c'est la différence entre l'utilisation de display.flip() ou l'utilisation de update_rects() avec seulement les changements modifiés. Je sais, cela n'aide pas du tout, lorsque vous faites défiler la carte. Jetez un oeil à cette question: Why is this small (155 lines-long) Pacman game on Python running so slow?, il a un sujet similaire. Une chose que j'ai essayée quand j'avais une carte compilée de carreaux et de sprites, j'ai essayé d'avoir toujours une image précompilée de la carte pour une zone contenant la partie actuellement affichée et environ 200 pixels autour de celle-ci, donc que je pourrais blit le "sol" préparé (toujours seulement dans les parties mises à jour) sans avoir besoin de blitter toutes les tuiles contenues dans celui-ci. C'est, bien sûr, un peu de réflexion que vous devez mettre en place, surtout si vous avez plusieurs couches et parties de la carte qui peuvent être au-dessus de vos sprites actifs. Il est intéressant de penser et de travailler, mais je ne peux pas vous dire combien vous en retirerez.

Une solution totalement différente: j'ai commencé avec pygame une fois (puisque j'avais déjà fait du SDL en C++). Récemment, j'ai été dirigé vers une autre bibliothèque de jeux python: pyglet. Cela ne souffre pas des problèmes de mise à jour de l'ensemble de l'écran autant que pygame (je pense que c'est à cause de l'utilisation de l'accélération OpenGL, ça marche toujours sur mon eee-netbook pas du tout accéléré). Si vous n'êtes pas lié au pygame de quelque façon que ce soit, il pourrait être intéressant de jeter un oeil à pyglet.