web-dev-qa-db-ja.com

ゲームのメインループでのpygame clock.tick()対フレームレート

すべてのpygameには、次のようなゲームループがあります。

_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)
_

API forget_ticks()によれば:

Pygame.init()が呼び出されてからのmilliscondsの数を返します。 pygameが初期化される前、これは常に0になります。

しかしclock.tick()

このメソッドは、フレームごとに1回呼び出す必要があります。それはいくつ計算します。前回の呼び出しからミリ秒が経過しました。

オプションのフレームレート引数を渡すと、関数は、ゲームの実行を指定された1秒あたりのティックよりも遅く維持するために遅延します。これは、ゲームのランタイム速度を制限するために使用できます。 Clock.tick(40)をフレームごとに1回呼び出すことにより、プログラムは毎秒40フレームを超えて実行されることはありません。

少し混乱していますが、clock.tick()は、ゲームの開始から経過したミリ秒数に直接影響するということですか?

したがって、clock.tick(40)は、毎秒40フレームを「発行」し、whileループを毎秒40回実行することを意味しますか?

Fpsとティックの関係がわかりません。

更新:実際にテストしたところ、get_ticks()は、tick() - 0.1または_30_または_60_に与えたfpsに関係なく、実際の時間をミリ秒で返します。

したがって、clock.tick()は、ゲームの実行速度またはループがそれ自体を更新する頻度を設定するだけで、それ自体を実行するようです。

しかし、私はまだ少し混乱していますが、他の回答を歓迎します。

9
ERJAN

[〜#〜] fps [〜#〜]1秒あたりのフレーム数は、1単位あたりのフレーム数です。時間。
1/FPSは、各フレーム間で経過する必要のある時間です。
Tickは、PyGameにおける時間の測定にすぎません。

clock.tick(40)は、毎秒最大で40フレームが通過することを意味します。

8
ModoUnreal

私は高いfpsを設定しました-clock.tick(30)または60、そしてゲームは速く実行され、get_ticks()は経過時間を非常に速く出力しますが、pygame.init()からの実際のランタイム変更されませんでした!

FPSが高いので時間が速くなると思いました!それはしません、私はclock.tick(0.1)-別名1フレームを10秒ごとに試しました、そしてget_ticks()はその経過時間のみを出力しましたONCE PER 10秒! whileループがそれ自体を実行していたためfps = 0.1で。

しかし、fpsがより高い場合、更新率はより高くなります -合計経過時間ではありません

今私はそれを理解しました。

3
ERJAN

すでに回答済みですが、疲れたところを説明したいと思います

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 

したがって、1秒あたりのフレーム数が1であるものと、10であるものを2回実行し、コードを10秒間実行します。「電話のストップウォッチを使用してこれを実行します」。

したがって、数学的には1秒あたり10 fpsは10で10秒あたり10 fpsは100 "duuh"なので、最初の実行を実行する必要があるのは "1 fps"で、カウンタ変数は約10 "タイミングに依存します"と2番目の実行です。コンソールの10秒のカウンター変数の最後で約100

つまり、簡単に言うと、ループはゲームの表示を制御しており、clock.tick()はゲームの表示を変更する速さ、つまりループの実行速度を指定します。

1
Sam