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.

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.