我在pygame中运行一个小游戏,我需要在主循环的每次迭代之间有一个恒定的延迟。尽管我用pygame.Clock.tick_busy_loop()将FPS计数锁定在60,我观察到延迟的变化(每个循环大约4毫秒)。我的一个功能应该被窃听,但我找不到哪个功能。
我在Ipython的主循环上使用了%prun,结果如下:
2264 function calls in 5.439 seconds
Ordered by: internal time
ncalls tottime percall cumtime percall filename:lineno(function)
322 4.401 0.014 4.401 0.014 {method 'tick' of 'Clock' objects}
322 0.730 0.002 0.730 0.002 {pygame.display.flip}
1 0.228 0.228 0.228 0.228 {pygame.base.quit}
1 0.034 0.034 0.034 0.034 {method 'blit' of 'pygame.Surface' objects}
1 0.028 0.028 5.439 5.439 main.py:9(main)
323 0.014 0.000 0.014 0.000 {pygame.event.get}
323 0.002 0.000 0.016 0.000 lib.py:26(getInput)
322 0.001 0.000 0.036 0.000 lib.py:80(checkEventType)
322 0.001 0.000 0.035 0.000 lib.py:91(instructions)
322 0.000 0.000 0.000 0.000 {method 'get_time' of 'Clock' objects}
1 0.000 0.000 5.439 5.439 <string>:1(<module>)
1 0.000 0.000 0.000 0.000 {pygame.mixer.stop}
1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}
2 0.000 0.000 0.000 0.000 {ord}
这里有什么东西可以解释每次迭代之间延迟2-5毫秒的变化吗?
答案 0 :(得分:1)
您的程序不是计算机上唯一的程序。系统必须同时运行其他程序。有时它会更快,有时更慢。 2-5毫秒是不用担心的。
答案 1 :(得分:1)
您可能还想查看使用pygame.time.Clock.tick()而不是pygame.Clock.tick_busy_loop():
http://www.pygame.org/docs/ref/time.html#pygame.time.Clock.tick
请注意,此函数使用SDL_Delay函数,该函数在每个平台上都不准确,但不会使用太多cpu。如果你想要一个准确的计时器,请使用tick_busy_loop,并且不介意咀嚼cpu。
当然,除非你非常严格地保持帧率为60。