2016-10-16 10 views
0

pygame:ゲームを実際に60fpsで実行するにはどうすればよいですか?私は私のメインループでは

clock.tick_busy_loop(60) 
pygame.display.set_caption("fps: " + str(clock.get_fps())) 

しかし、読み出しは、ゲームが62.5fpsで読んでいると言います。 私はclock.tick_busy_loop(57.5)を入力しようとしましたが、これは私に58.82 ... fpsの読み出しを与えました。 clock.tick_busy_loop(59)と設定すると、もう一度62.5fpsが得られます。私はここで克服できない58.8fpsと62.5fpsの間に閾値があるように見えます。ゲームを実際に60fpsで動作させるにはどうすればよいですか?私は音楽のタイミングに左右されるイベントを実行するので、主にこの種のコントロールを探しています。

+1

イベントを制御するためにfpsの代わりに時間を使用します。あなたのコンピュータで60fpsが得られたとしても、私は30fpsしか得られないかもしれません。あなたのプログラムは私の役に立たないでしょう。 – furas

+0

はpygame.timeのサブクラスを時計にしていませんか?または、クロックを使用せずにシステムの時間を計算することを提案していますか? –

+0

[pygame.time.get_ticks()](http://www.pygame.org/docs/ref/time.html#pygame.time.get_ticks)と 'if pygame.time.get_ticks()> = previous_execution + delay:execute_event() 'イベントを制御します。 60fpsの高速コンピュータと30fpsの低速コンピュータで動作します。 – furas

答えて

1

私はpygame.timeモジュールではなくシステム時間モジュールを使用する上記のコメントに基づいて簡単なデモを作成しました。私はちょうどスクリーン上で何かを単純にレンダリングしたいので、OpenGLのものを無視することができます。最も重要な部分は、各フレームの最後にあるタイミングコードです。このコードでは、これについてコメントしています。

import pygame 
import sys 
import time 
from OpenGL.GL import * 
from OpenGL.GLU import * 

title = "FPS Timer Demo" 
target_fps = 60 
(width, height) = (300, 200) 
flags = pygame.DOUBLEBUF|pygame.OPENGL 
screen = pygame.display.set_mode((width, height), flags) 

rotation = 0 
square_size = 50 
prev_time = time.time() 

while True: 
    #Handle the events 
    for event in pygame.event.get(): 
     if event.type == pygame.QUIT: 
      sys.exit() 

    #Do computations and render stuff on screen 
    rotation += 1 
    glClear(GL_COLOR_BUFFER_BIT) 
    glMatrixMode(GL_PROJECTION) 
    glLoadIdentity() 
    glOrtho(0, width, 0, height, -1, 1) 
    glMatrixMode(GL_MODELVIEW) 
    glLoadIdentity() 
    glTranslate(width/2.0, height/2.0, 0) 
    glRotate(rotation, 0, 0, 1) 
    glTranslate(-square_size/2.0, -square_size/2.0, 0) 
    glBegin(GL_QUADS) 
    glVertex(0, 0, 0) 
    glVertex(50, 0, 0) 
    glVertex(50, 50, 0) 
    glVertex(0, 50, 0) 
    glEnd() 
    pygame.display.flip() 

    #Timing code at the END! 
    curr_time = time.time()#so now we have time after processing 
    diff = curr_time - prev_time#frame took this much time to process and render 
    delay = max(1.0/target_fps - diff, 0)#if we finished early, wait the remaining time to desired fps, else wait 0 ms! 
    time.sleep(delay) 
    fps = 1.0/(delay + diff)#fps is based on total time ("processing" diff time + "wasted" delay time) 
    prev_time = curr_time 
    pygame.display.set_caption("{0}: {1:.2f}".format(title, fps)) 
+0

これは素晴らしいですが、理由は私がエスケープするので、私はそれが私のオーディオと同期するためにフレームレートの半分にする必要があります。しかし、動作するようです! –

+0

@NullSaladそれはあなたのためにうれしい!それは奇妙な問題のようです。あなたのサンプルでそれについての質問を投稿すれば、それを見ていきます。 – CodeSurgeon

関連する問題