Forum Programmation.python pygame subsurface, dans quels cas peuvent-elles être utiles ?

Posté par  . Licence CC By‑SA.
2
12
juin
2025

Salut tout le monde,

J'essaie de comprendre à quoi peuvent bien servir les subsurfaces dans pygame que je ne connaissais pas.

Je n'arrive pas à y trouver une utilité, certains disent que cela est utile dans le cas d'animations en jeu, sauf que je ne conçois pas comment :-/

Lorsque j'ai besoin de faire une animation à partir d'une image contenant plusieurs états d'un élément, j'utilise le troisième paramètre de pygame.Surface.blit définissant la partie de l'image des états à afficher, ce qui me semble bien plus simple.

S'il y a des cadors en jeu 2d, avec SDL ou pygame qui pourraient m'expliquer, ce serait avec plaisir.

  • # p-e conso mémoire ?

    Posté par  . Évalué à 4 (+2/-0).

    disclaimer: je connais pas

    Mais, le mot "blit" est rigolo, donc ça m'incite à chercher :)

    je tombe sur https://runebook.dev/en/articles/pygame/ref/surface/pygame.Surface.subsurface

    Vers le bas de la page, il y a des comparaisons entre l'utilisation des subsurface ou d'autres méthodes.

    Je pense que la comparaison avec ce que tu fais, c'est le paragraphe "Blitting Portions of a Surface". Si c'est ça, l'intérêt des subsurfaces, ce serait de consommer moins de mémoire. Et comme les pixels sont partagés entre la subsurface et la surface, faut probablement être plus précis.

    • [^] # Re: p-e conso mémoire ?

      Posté par  . Évalué à 2 (+1/-0). Dernière modification le 13 juin 2025 à 10:41.

      Merci du lien =)

      J'ai un peu testé ce que ça peut donner en mémoire, et y a quoi ? Peut-être 1 % de plus en conso mémoire avec un blit de la zone spécifiée par rapport à une subsurface, c'est quand même très peu, je trouve, pour une image de 300 x 300 changeant 10 fois par seconde.

      J'ai simplement regardé la consommation en mémoire via le moniteur système de Mate.

      Testé avec ce simple script :

      import random
      import pygame as pg
      import itertools
      
      pg.init()
      screen = pg.display.set_mode((600, 600))
      
      surf = pg.Surface((3000, 3000)).convert()
      
      coords = tuple(
          (x, y)
          for x in range(0, 3000, 300)
          for y in range(0, 3000, 300)
      )
      
      for coord, color in zip(coords, random.sample(tuple(pg.color.THECOLORS), 100)):
          surf.fill(pg.color.THECOLORS[color], (*coord, 300, 300))
      
      cycle_anim = itertools.cycle(coords)
      subsurf_rect = pg.Rect(0, 0, 300, 300)
      EVENT_ANIM = pg.USEREVENT
      
      pg.time.set_timer(EVENT_ANIM, 100)
      clock = pg.time.Clock()
      running = True
      while running:
          for event in pg.event.get():
              if event.type == pg.QUIT:
                  running = False
              elif event.type == EVENT_ANIM:
                  subsurf_rect.topleft = next(cycle_anim)
      
                  screen.blit(surf.subsurface(subsurf_rect), (150, 150))
                  # screen.blit(surf, (150, 150), subsurf_rect)
      
                  pg.display.flip()
          clock.tick(30)
      
      pg.quit()

      Il suffit d'inverser la ligne commentée pour comparer les consommations en mémoire.

      • [^] # Re: p-e conso mémoire ?

        Posté par  . Évalué à 2 (+0/-0).

        Dans l'exemple, il utilise 2 Surface et il blit une partie d'une surface sur une autre. Mais ce n'est pas ce que tu fais dans ce code, et du coup, tu n'as pas le double de conso de Surface.

        J'atteins la limite de ce que je comprends du sujet sans vraiment mettre les mains dedans. Je ne peux pas élaborer sur l'intérêt des subsurface pour ce code.

Envoyer un commentaire

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.