基本的にスクロールする背景である Pygame で簡単なプログラムを作成し、定期的なラグ スパイクに気付きました。長い間コードをいじった後、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
60 FPS で実行すると、各スパイクの間隔はほとんどの場合 1 秒で、まれに 2 秒になります (スパイクは約 2 倍長く続きます)。低いフレーム レートでは、スパイク間の間隔はより変化し始めますが、値は常に整数に近くなります。
別のコンピューターでスクリプトを実行しようとしましたが、問題は再現されませんでした。pygame.display.update() の実行時間はかなり速く、一貫していました。ただし、そのマシンで元のプログラムを実行すると、1 秒間隔のラグ スパイクが残りました (テストする他のマシンを探すことになるでしょう...)。
テストした両方のマシンで Windows 7 が実行されました。
編集:
Pygame Web サイトでホストされているいくつかのランダムなゲームを取得しましたが、同様の動作が発生しています。pygame.display.update
(またはflip
) への呼び出しは定期的に 10 ~ 40 ミリ秒かかりますが、通常は 2 ミリ秒未満かかります。
他の誰もこの問題を抱えていないようです (または、少なくとも不平を言っています。これは、ほとんどのゲームがこの問題があまり目立たない 30 FPS 未満で実行されているためかもしれません)、私の環境に問題がある可能性があります。ただし、(上記のように)2台目のマシンで問題を(ちょっと)再現したので、問題を無視せず、エンドユーザーが経験しないことを願っています...