我做了一個簡單的程序與pygame的那基本上是一個滾動的背景,發現週期性的滯後峯值。經過很長時間的代碼搞亂之後,我發現調用pygame.display.update()有時需要很長時間才能執行。pygame.display.update()導致週期性的滯後尖峯
要真正剝離下來並複製問題,我寫了下面的代碼:
import pygame
import sys
import time
FRAME_RATE = 30
# don't mind the screen and time_passed variables; they aren't used in this script
def run_game():
pygame.init()
clock = pygame.time.Clock()
screen = pygame.display.set_mode((500, 500))
prev_spike = 0
time_passed = 0
while 1:
start = time.clock()
pygame.display.update()
timenow = time.clock()
time_spent = timenow - start
if time_spent > 0.01:
print time_spent
if prev_spike:
print "Last spike was: {} seconds ago".format(timenow - prev_spike)
prev_spike = timenow
time_passed = clock.tick(FRAME_RATE)
if __name__ == "__main__":
run_game()
在那個幀率輸出的一個片段:
0.0258948412828
Last spike was: 1.01579813191 seconds ago
0.0186809297657
Last spike was: 0.982841934526 seconds ago
0.0225958783907
Last spike was: 2.01697784257 seconds ago
0.0145269648427
Last spike was: 1.01603407404 seconds ago
0.0186094554386
Last spike was: 2.01713885195 seconds ago
0.0283046020628
Last spike was: 1.03270104172 seconds ago
0.0223322687757
Last spike was: 1.01709735072 seconds ago
0.0152536205013
Last spike was: 1.01601639759 seconds ago
我真的不知道是什麼繼續前進,並會真正喜歡一些見解。
更多的細節:
在每一個循環迭代打印time_spent(而不是僅當它是> 0.01)當輸出的一個片段:
0.000204431946257
0.000242090462673
0.000207890381438
0.000272447838151
0.000230178074828
0.0357667523718 <-- update taking two orders of magnitude longer than normal
0.000293582719813
0.000343153624075
0.000287818661178
0.000249391603611
當以60fps運行的每個峯值之間的間隔幾乎總是1秒,很少2秒(峯值會持續兩倍左右)。在較低的幀率下,峯值之間的間隔開始變化更多,但總是接近整數值。
我試圖在另一臺計算機上運行腳本,但沒有複製的問題; pygame.display.update()上的執行時間相當快速且一致。然而,當我跑這臺機器上我原來的計劃,在1秒間隔滯後峯值保持(我可能會尋找其他的機器上測試...)
我測試在兩臺機器上運行Windows 7 。
編輯:
我抓住舉辦Pygame的網站上的一些隨機的遊戲,我得到類似的行爲 - 調用pygame.display.update
(或flip
)10之間定期進行 - 40毫秒,而他們通常需要較少比2毫秒。
沒有其他人似乎有這個問題(或抱怨,至少這可能是因爲大多數遊戲運行速度低於30 FPS這個問題不太明顯),所以有可能是我的東西環境。我(有點)重現該問題的第二臺機器上,但(如上所述),所以我寧願不忽視的問題,並希望最終用戶不會遇到它......
我沒有直接回答,但這些都是時間步長的問題很好的資源:http://gafferongames.com/game-physics/fix-your-timestep/,HTTP://gamedev.stackexchange .com/questions/1589/fixed-time-step-vs-variable-time-step – ninMonkey 2012-07-10 20:48:38
@monkey感謝您的聯繫。使用dt可以防止這個問題影響遊戲/模擬,但問題本身仍然沒有解決。我想我可以只是希望用戶不會注意到口吃或什麼。 – mizzinx 2012-07-11 03:33:35
由於你使用pygame,你可以從'pygame.time.get_ticks()'http://www.pygame.org/docs/ref/time.html#pygame.time.get_ticks – ninMonkey 2012-07-11 07:29:27