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.

  • # Cas pratique

    Posté par  . Évalué à 1 (+0/-0). Dernière modification le 20 juillet 2025 à 08:30.

    Bonjour
    Admettons que tu ais un grand tileset , c'est plus facile de pointer des subsurfaces plutôt que de créer autant de petites surfaces ou de stocker un paramètre rect. Les modifications du tileset affecteront toutes les tuiles sans qu'il y ait besoin de modifier chaque tuile individuellement .

    • [^] # Re: Cas pratique

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

      Alors oui c'est faisable sans subsurface en stockant les rects correspond , mais c'est moins pratique quand même .

      Admettons un écran divisé en 3 parties, la zone jeu, un menu, une zone info. Et tu veux effacer la zone info , c'est plus lisible info.fill(0) que écran.fill(0,zone_info) où il faudra stocker zone_info quelque part .

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.