[Python] Conso CPU/Chargement Image

Conso CPU/Chargement Image [Python] - Python - Programmation

Marsh Posté le 13-02-2008 à 15:36:17    

Bonjour,
 
Je développe actuellement un petit jeu 2D (pour me faire la main surtout) sous Python et Pygame.
Après avoir vu quelques autres codes sources de jeux vidéos 2D (OhMummy, Asteroids), j'ai remarqué qu'ils chargeaient les images pour les animations de la manière suivante :
 

Code :
  1. ImageOhMummy = {}
  2. ImageOhMummy['Gargou'] = {}
  3. ImageOhMummy['Gargou']['Left'] = pygame.image.load("./Image/GargouLeft.png" )
  4. ImageOhMummy['Gargou']['MoveLeft'] = pygame.image.load("./Image/GargouMoveLeft.png" )
  5. ImageOhMummy['Gargou']['Right'] = pygame.image.load("./Image/GargouRight.png" )
  6. ImageOhMummy['Gargou']['MoveRight'] = pygame.image.load("./Image/GargouMoveRight.png" )
  7. ImageOhMummy['Gargou']['MoveDownLeft'] = pygame.image.load("./Image/GargouMoveDownLeft.png" )
  8. ImageOhMummy['Gargou']['MoveDownRight'] = pygame.image.load("./Image/GargouMoveDownRight.png" )
  9. ImageOhMummy['Gargou']['MoveUpLeft'] = pygame.image.load("./Image/GargouMoveUpLeft.png" )
  10. ImageOhMummy['Gargou']['MoveUpRight'] = pygame.image.load("./Image/GargouMoveUpRight.png" )
  11. i = ImageOhMummy['Gargou']
  12. ImageOhMummy['Gargou']['Face'] = [i['Right'], i['MoveRight'], i['MoveUpLeft'], i['MoveUpRight'],
  13.                                   i['Left'], i['MoveLeft'], i['MoveDownLeft'], i['MoveDownRight']]


 
ou encore :  
 

Code :
  1. BombPowerUpImages = [pygame.image.load("Bomb_Power_Up/Bomb.png" ).convert_alpha(),
  2.                   pygame.image.load("Bomb_Power_Up/Bomb2.png" ).convert_alpha(),
  3.                   pygame.image.load("Bomb_Power_Up/Bomb3.png" ).convert_alpha(),
  4.                   pygame.image.load("Bomb_Power_Up/Bomb4.png" ).convert_alpha(),
  5.                   pygame.image.load("Bomb_Power_Up/Bomb5.png" ).convert_alpha(),
  6.                   pygame.image.load("Bomb_Power_Up/Bomb6.png" ).convert_alpha(),
  7.                   pygame.image.load("Bomb_Power_Up/Bomb7.png" ).convert_alpha(),
  8.                   pygame.image.load("Bomb_Power_Up/Bomb8.png" ).convert_alpha(),
  9.                   pygame.image.load("Bomb_Power_Up/Bomb9.png" ).convert_alpha(),
  10.                   pygame.image.load("Bomb_Power_Up/Bomb10.png" ).convert_alpha(),
  11.                   pygame.image.load("Bomb_Power_Up/Bomb11.png" ).convert_alpha(),
  12.                   pygame.image.load("Bomb_Power_Up/Bomb12.png" ).convert_alpha(),
  13.                   pygame.image.load("Bomb_Power_Up/Bomb13.png" ).convert_alpha(),
  14.                   pygame.image.load("Bomb_Power_Up/Bomb14.png" ).convert_alpha(),
  15.                   pygame.image.load("Bomb_Power_Up/Bomb15.png" ).convert_alpha()]


 
En faisant incrémenter les indices des listes/dictionnaires dans le code source afin de faire défiler les différentes images à chaque update.
Au final, leur méthode se résume à cela :
On charge tout de manière brutale dans une liste ou dictionnaire, que l'on définit en global, et l'on y accède en incrémentant les indices durant le jeu.
 
J'ai décidé de faire autrement (ça prend trop de place dans le code, et l'on m'a appris que les variables globales c'est caca  :D )
Voici donc le principe :
Je définis dans le constructeur d'une classe personnage un indice self.imageCourante, ainsi qu'un indice self.sensMouvement

Code :
  1. self.sensMouvement = 0
  2.         self.mouvements = [["MoveDownRight", "MoveRight", "MoveUpRight", "MoveLeft"],["MoveDownLeft", "Right", "MoveUpLeft", "Left"]]
  3.         self.imageActuelle = 0
  4.         self.changerImage = 10


 
Ensuite, lors de l'appel de la fonction update de cette classe, je vérifie que le self.changerImage est égal à 0 (sorte de timer) pour changer de mouvement comme ceci :
 

Code :
  1. self.imageActuelle = (self.imageActuelle+1)%4
  2.             self.image, self.rect = insa_multimedia.load_image("civil"+str(self.mouvements[self.sensMouvement][self.imageActuelle])+".png", -1)


 
On repasse alors self.changerImage à 1O et on le décrémente.
self.sensMouvement indique juste dans quelle liste de self.mouvements on se situe (en gros pour le faire marcher sur place) et change tous les 10 self.changerImage
 
--------------------------------------
 
On arrive donc à mon problème (si vous êtes toujours là  :bounce: )
 
Est-ce qu'il vaut mieux stocker toutes les images (image_load pour chaque) comme une brute dans un dictionnaire global, et y accèder ensuite pendant le jeu ?
Ou réaliser un code plus clair et moins dense (ma méthode se résume en 5 lignes maximum) mais fait appel à image_load à chaque update ?
Est-ce qu'au niveau CPU/Ressources ma méthodes n'est-elle pas carrément plus gourmande ?
 
J'ai réalisé des tests à petite échelle avec une deux-centaines de bonhommes affichés sur l'écran en train de bouger, la conso CPU est passée de 2% à 50% pour les 3 méthodes.
Je n'ai donc pas senti trop de différences entre ces techniques.
 
J'imaginais que loader une image à chaque update (si l'on imagine laisser le pc allumé avec le programme tournant à l'infini pendant 30h) serait bien plus consommateur en ressource non ?
Ou alors peut être que le fait de stocker les images chargées dans un dictionnaire (première méthode) ne change pas le fait d'appeler à chaque update la fonction load_image ?
 
 
Merci par avance de m'éclairer sur la meilleure méthode, et ainsi de chasser mes doutes  :hello:  (et aussi d'avoir lu jusque là  :pt1cable: )


Message édité par Mister_Pingouin76 le 13-02-2008 à 15:38:10
Reply

Marsh Posté le 13-02-2008 à 15:36:17   

Reply

Marsh Posté le 13-02-2008 à 22:18:39    

Un petit up ? :)
Personne n'a aucune idée ?


Message édité par Mister_Pingouin76 le 13-02-2008 à 22:18:52

---------------
Goldbarre [Gains:23€] | Eurobarre [Gains:18€]
Reply

Marsh Posté le 14-02-2008 à 09:51:26    

Si. Faire un chargement d'image a chaque frame sera forcement plus lent que de les avoir préchargées. Accès disque, allocation mémoire, déallocation, etc.
Tu n'es pas non plus obligé de faire appel a une globale crados. Une instance de classe chargée de gérer une animation peut tres bien avoir les images concernées. Tu peux aussi avoir une banque d'image sous forme de singleton. Les idées ne manquent pas, il faut juste prendre ce qui correspond le mieux a ton projet.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed