Optimiser programme pygame (python)

Résolu/Fermé
Silenzay Messages postés 49 Date d'inscription jeudi 2 juillet 2020 Statut Membre Dernière intervention 15 janvier 2022 - 29 oct. 2020 à 17:29
Silenzay Messages postés 49 Date d'inscription jeudi 2 juillet 2020 Statut Membre Dernière intervention 15 janvier 2022 - 31 oct. 2020 à 12:18
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
A voir également:

4 réponses

dachiasse Messages postés 1709 Date d'inscription samedi 12 septembre 2020 Statut Membre Dernière intervention 13 mai 2021 149
30 oct. 2020 à 05:22
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.
0
Silenzay Messages postés 49 Date d'inscription jeudi 2 juillet 2020 Statut Membre Dernière intervention 15 janvier 2022 7
Modifié le 30 oct. 2020 à 11:01
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
0
dachiasse Messages postés 1709 Date d'inscription samedi 12 septembre 2020 Statut Membre Dernière intervention 13 mai 2021 149
30 oct. 2020 à 21:16
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.
0
Silenzay Messages postés 49 Date d'inscription jeudi 2 juillet 2020 Statut Membre Dernière intervention 15 janvier 2022 7
31 oct. 2020 à 12:18
d'accord merci beaucoup je vais prendre le temps d'essayer d'apprendre le multithreading
0