web-dev-qa-db-fra.com

pygame clock.tick () vs framerate dans la boucle principale du jeu

Chaque pygame a une boucle de jeu qui ressemble à ceci:

while running:
    for event in pygame.event.get():        
        if event.type == pygame.QUIT:
            running = False   
    pygame.display.flip()
    print("tick " + str(pygame.time.get_ticks()))
    clock.tick(1)

Selon l'api forget_ticks():

Renvoie le nombre de millisecondes depuis l'appel de pygame.init (). Avant que pygame ne soit initialisé, ce sera toujours 0.

Mais clock.tick():

Cette méthode doit être appelée une fois par trame. Il calculera combien. des millisecondes se sont écoulées depuis l'appel précédent.

Si vous passez l'argument de fréquence d'images facultatif, la fonction retardera le fonctionnement du jeu plus lentement que les ticks donnés par seconde. Cela peut être utilisé pour limiter la vitesse d'exécution d'un jeu. En appelant Clock.tick (40) une fois par image, le programme ne fonctionnera jamais à plus de 40 images par seconde.

Je suis un peu confus, cela signifie-t-il que clock.tick() affecte directement le nombre de millisecondes écoulées depuis le début du jeu?

Donc clock.tick(40) signifie que j'émets 40 images par seconde et le alors que la boucle s'exécute 40 fois par seconde?

Je ne vois pas la relation entre fps et ticks.

MISE À JOUR: Je viens de le tester et get_ticks() renvoie toujours le temps réel en ml, peu importe les fps que vous donnez à tick() - 0.1 ou 30 Ou 60.

Il semble donc que clock.tick() définit simplement la vitesse à laquelle le jeu doit s'exécuter ou à quelle fréquence la boucle doit se mettre à jour, s'exécuter à travers elle-même.

Cependant je suis encore un peu confus, les autres réponses sont les bienvenues.

9
ERJAN

FPS , Images par seconde , est le nombre d'images affichées par unité de temps.
1/FPS est le temps qui doit s'écouler entre chaque image.
Cochez n'est qu'une mesure du temps dans PyGame.

clock.tick(40) signifie que pour chaque seconde au plus 40 images doivent passer.

8
ModoUnreal

J'ai configuré des fps élevés - clock.tick (30) ou 60, et le jeu se déroule rapidement, et get_ticks () imprime le temps écoulé très rapidement, mais le temps d'exécution réel de pygame.init () n'a pas changé!

Je pensais que le temps passe plus vite à cause des FPS élevés! Ce n'est pas le cas, j'ai essayé clock.tick (0.1) - alias 1 image par 10 secondes, et get_ticks () a imprimé son temps écoulé uniquement NE FOIS PAR 10 secondes! Parce que la boucle while était en cours d'exécution à travers elle-même à fps = 0,1.

Mais si fps était plus élevé, le le taux de mise à jour serait plus élevé -pas le temps total écoulé

Maintenant, je l'ai compris.

3
ERJAN

Je sais que c'est déjà répondu mais je voulais expliquer quelque chose que je fatiguais

import pygame

pygame.init()

gameDisplay = pygame.display.set_mode((800,600))
clock = pygame.time.Clock()

crashed = False

counter = 1
while not crashed:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            crashed = True

    pygame.display.update()
    print(counter)
    counter += 1
    clock.tick(1) # will be 10 in the next run 

donc ce que nous allons faire, c'est que nous allons faire deux runs un avec frame par seconde est égal à 1 et l'autre avec 10, et nous allons exécuter le code pendant 10 secondes "J'ai utilisé mon chronomètre de téléphone pour ce faire".

donc mathématiquement 1 fps pour 10sec est 10 à droite et 10 fps en 10sec est 100 "duuh" donc ce que vous devriez obtenir en cours d'exécution la première manche "1 fps" est la variable de compteur devrait être d'environ 10 "dépend de votre timing" et la deuxième manche à la fin de la variable de compteur de 10 secondes dans votre console devrait être d'environ 100

donc, en bref, nous pourrions dire que la boucle contrôle l'affichage de votre jeu et clock.tick () spécifie la vitesse à laquelle vous souhaitez modifier l'affichage du jeu en d'autres termes, la vitesse à laquelle la boucle s'exécute

1
Sam