J'ai un problème de performance en pygame

MEZIANE002 - 8 juin 2023 à 23:32
patla8640 Messages postés 1 Date d'inscription vendredi 9 juin 2023 Statut Membre Dernière intervention 14 juin 2023 - 14 juin 2023 à 18:31

Bonjour, j'ai un problème au niveau de l'affichage de mes tiles (j'essaye de créer un rpg), plus il y a de tiles dans mon jeu, moins les performances sont bonnes, normal vous allez me dire ? Mais les drops de FPS arrivent très rapidement et je ne peut pas dans l'état faire de rpg. Voilà mon code :

class Map:
    def __init__(self, PROPRIETIES : dict):
        self.tilesize = PROPRIETIES['tilesize']
        self.level = PROPRIETIES['level']
        self.background = PROPRIETIES['background']
        self.name = PROPRIETIES['name']
        self.slicing = PROPRIETIES['slicing']
        level = module.Sprite(PROPRIETIES["tileset"])
        self.w, self.h = self.tilesize
        level.slice_(self.slicing[0], self.slicing[1])
        self.tiles = [pygame.transform.scale(module.convert_PIL_pygame(i), self.tilesize) for i in level.slices]    
        
    def draw_tileset(self, camera, screen):
        self.x = -camera.x+screen.get_size()[0]/2
        self.y = -camera.y+screen.get_size()[1]/2
        cursor = [self.x, self.y]

        for i in self.background:
            for j in i:
                    if cursor[0]>-self.w and cursor[0]<screen.get_size()[0]+self.w and cursor[1]>-self.h and cursor[1]<screen.get_size()[1]+self.h:
                        if j!= None:
                            screen.blit(self.tiles[j-1].convert_alpha(), cursor) 
                    cursor[0] += self.w
            cursor[0] = self.x
            cursor[1] += self.h 

        cursor = [self.x, self.y]

        for i in self.level:
            for j in i:
                    if cursor[0]>-self.w and cursor[0]<screen.get_size()[0]+self.w and cursor[1]>-self.h and cursor[1]<screen.get_size()[1]+self.h:
                        if j!= None:
                            screen.blit(self.tiles[j-1].convert_alpha(), cursor)

                    cursor[0] += self.w

            cursor[0] = self.x
            cursor[1] += self.h  
A voir également:

6 réponses

Salut.

Tu devrais mesurer les temps d'exécution de chacune des parties de ton code, avec time() du module time ou encore avec le module timeit.

Il y a déjà les convert_alpha() qui doivent seulement être fait une seule et unique fois (à la création de l'image), c'est une opération lourde à réaliser en terme de performances.

Il faudrait aussi voir ce que contient la classe Sprite de ton module « module » et comment est appelée ta classe Map.

0

Bonjour, j'ai fait ce que tu m'a dit, et ça m'a effectivement amélioré mes performances de peu, mais ce n'est pas le coeur du problème, y'a il un moyen d'éviter de passer par des boucles comme je le fais, je sais pas avec un sprite Group par exemple, enfin bref, ce serait cool de trouver un moyen de vraiment améliorer les performances.

0

Combien y a-t-il d'éléments dans self.tiles ?

Oui, tu peux te servir de sprites et groups pygame, mais ce n'est pas ça qui va résoudre ton manque de performances.

Sans voir l'entièreté de ton programme et éventuellement de pouvoir tester, difficile comme ça de dire ce qui bouffe les perfs.

Y a besoin de plus d'infos en ce qu'il se passe dans ton programme.

0

Si tu soupçonnes que tes boucles nuisent à tes performances, tu pourrais essayer de simplifier tes tests dans la boucle intérieure:
    if [...] < cursor < [...]:
Si tu juges que tu compares cursor beaucoup plus souvent que tu le modifies, définis le comme un tuple au lieu d'une liste.
    if (...) < cursor < (...):
C'est peut-être de la micro-optimisation, mais on ne sait jamais ...
Sort de tes boucles ce qui est constant dans ces boucles. Remplaces-les par de simples variables.

0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question

Convert_alpha y est sûrement pour beaucoup 

0
patla8640 Messages postés 1 Date d'inscription vendredi 9 juin 2023 Statut Membre Dernière intervention 14 juin 2023
14 juin 2023 à 18:31

Oui, tu peux te servir de sprites et groups pygame, mais ce n'est pas ça qui va résoudre ton manque de performances.  Spotiflyer

0