Optimiser programme pygame (python) [Résolu]

Signaler
Messages postés
45
Date d'inscription
jeudi 2 juillet 2020
Statut
Membre
Dernière intervention
8 mai 2021
-
Messages postés
45
Date d'inscription
jeudi 2 juillet 2020
Statut
Membre
Dernière intervention
8 mai 2021
-
Bonjour,
Je viens de terminer un jeu en python avec pygame et je constate que celui-ci prend 12 à 15% de mon i5 8400 et 0% de ma GTX 1060, j'ai essayé de l'optimiser mais je n'ai gagné que quelques dixième de pourcent. Y-a-t-il moyen de faire en sorte que le processeur graphique prenne un peu plus les choses en main (j'ai déjà utilisé hwsurface et doublebuf) ? comment pourrais-je optimiser le morceau de code qui pose problème ? Je suis nouveau dans la matière, il se peut que vous constatiez des erreurs ou bien des choses vraiment mal optimisées et arrangées

while gameOn:

for event in pygame.event.get():
if event.type == pygame.QUIT:
gameOn = False
Mainloop = False
gameOver = False
youWon = False
explosion = False
pygame.display.quit()
pygame.quit()
elif event.type == pygame.MOUSEMOTION:
game.player.move()
MousePos = pygame.mouse.get_pos()
MousePosX = int(MousePos[0]) - 50
MousePosY = int(MousePos[1])

elif event.type == pygame.MOUSEBUTTONUP:

if not projectilesLeft == 0:
projectilesLeft -= 1

game.player.launchMissile()

if event.type == pygame.USEREVENT:
WSec -= 1
if showFPS:
fpsText = chicken_font5.render(f"{int(clock.get_fps())} FPS", True, whiteColor)

for enemyShip in game.allEnemyShips:
if enemyShip.rect.y >= 1030:
enemyShip.rect.y = 0
enemyShip.rect.x = randint(5, 700)
enemyPassed += 1
print("Vaisseaux passés :", enemyPassed)
fire += 1
pygame.display.flip()
if enemyPassed == 3:
gameOn = False
gameOver = True
pygame.mixer.stop()
ExplosionSong.play()
ExplosionSong.set_volume(0.05)
windowSurface.blit(feuBase, [-95, 885])
pygame.display.flip()
time.sleep(3)

try:
if not MousePosX == game.player.rect.x or not MousePosY == game.player.rect.y or collision == True:

gameOn = False
explosion = True
gameOver = True

except:
pass

if Qual == 1:
clock.tick(60)
elif Qual == 2:
clock.tick(30)

if WSec == 0:
gameOn = False
youWon = True

elif WSec <= 150:
if Qual == 1:
for projectile in game.player.allProjectiles:
projectile.velocity = 15
elif Qual == 2:
for projectile in game.player.allProjectiles:
projectile.velocity = 30


if 140 >= WSec > 125:
for enemyShip in game.allEnemyShips:
enemyShip.range2 = 3 * Qual
elif 125 >= WSec and truc1:
truc1 = False
NewShip.newShip()
elif 105 >= WSec > 90:
for enemyShip in game.allEnemyShips:
enemyShip.range1 = 2 * Qual
elif 80 >= WSec and truc5:
truc5 = False
NewShip.newShip()
elif 75 >= WSec and truc2:
NewShip.newShip()
truc2 = False
elif 60 >= WSec and truc6:
truc6 = False
NewShip.newShip()
elif 35 >= WSec and truc3:
NewShip.newShip()
truc3 = False
elif 35 >= WSec:
for enemyShip in game.allEnemyShips:
enemyShip.range2 = 4 * Qual

try:

windowSurface.blit(gameEtoile, [0, 0])
windowSurface.blit(game.base.image, [game.base.rect.x, game.base.rect.y])
windowSurface.blit(game.player.image, [game.player.rect.x, game.player.rect.y])
secondsBeforeWithdrawalText()
windowSurface.blit(withdrawalText, [232, 10])

if fire >= 1:
windowSurface.blit(feu, fire1Pos)
elif fire >= 2:
windowSurface.blit(feu, fire2Pos)
elif fire >= 3:
windowSurface.blit(feu, fire3Pos)

if projectilesLeft > 0:
for projectile in game.player.allProjectiles:
projectile.move()
game.player.allProjectiles.draw(windowSurface)

for enemyShip in game.allEnemyShips:
enemyShip.moving()

#enemyShip.updateHealthBar(windowSurface)

game.allEnemyShips.draw(windowSurface)

projectilesLeftText = projectilesLeft - 1
projectilesLeftTextDef()
if showFPS:
windowSurface.blit(fpsText, [5, 5])
pygame.display.flip()
except:
pass

4 réponses

Messages postés
1711
Date d'inscription
samedi 12 septembre 2020
Statut
Membre
Dernière intervention
13 mai 2021
137
Salut,
Si tu es débutant, tu vas galérer avec la gestion de HWSURFACE. Le GPU est excellent en parallélisme, il faut que ton programme soit multi threadé. C'est galère pour un programmeur avancé, c'est une plaie pour un débutant.

Si tu actives le HWSURFACE, ton GPU va se dire : "euh, il est où le code en parallèle là ?" S'il n'y en a pas, tu ne verras aucune optimisation.
Messages postés
45
Date d'inscription
jeudi 2 juillet 2020
Statut
Membre
Dernière intervention
8 mai 2021
4
Il me semble que lorsque HWSURFACE est activé les fichiers images sont chargées dans la mémoire de la carte graphique par défaut, est-ce bien vrai ? dans le cas contraire, HWSURFACE ne sert à rien dans mon programme. Sinon, y-a-t-il moyen d'optimiser ma gestion des conditions, des for et des boucles ? Savez-vous où je pourrais essayer d'apprendre le multithreading ? Merci et bonne journée,
Silenzay
Messages postés
1711
Date d'inscription
samedi 12 septembre 2020
Statut
Membre
Dernière intervention
13 mai 2021
137
Je ne sais pas pour le stockage sur la mémoire du gpu.
Pour les tutos sur le multi threading, je n'en ai pas. Je sais juste qu'il y en a beaucoup mais ils sont pas faciles à comprendre. Préfère les tutos écrits et en anglais.
Messages postés
45
Date d'inscription
jeudi 2 juillet 2020
Statut
Membre
Dernière intervention
8 mai 2021
4
d'accord merci beaucoup je vais prendre le temps d'essayer d'apprendre le multithreading