私はperlでオブジェクト指向OpenGLフレームワークを書いていますが、各フレーム間のDeltaTimeを測定すると、奇妙な問題が発生します。デルタ時間は時々(〜.5秒ごとに)負になるようです。これがgettimeofdayの問題なのか、GLUTがコールバックを呼び出す方法の問題なのかはわかりませんが、スプライトの動きが0.5秒ごとにわずかにジャンプするため、かなり面倒です。
これが私の過剰なメインループ関数です:
# This is called everytime in the main glut loop
sub Tick
{
my $this = shift;
my ($now, $dt);
$now = gettimeofday;
$dt = $now - $this->{_oldTime};
if ($dt < 0)
{
my $dterr;
$dterr = $now - $this->{_oldErrorTime};
print "WTF! We just encountered a time paradox! " .
"This function was last called $dt seconds ago...\n" .
"Current time: $now, Last call: $this->{_oldTime}\n" .
"We already encountered this error $dterr seconds ago.\n\n";
$this->{_oldErrorTime} = $now;
}
$this->{_oldTime} = $now;
$this->{FPS} = 1.0 / $dt;
$this->Update($dt);
$this->DrawFrame($dt);
}
そして、これが出力です:
WTF!時間のパラドックスに遭遇しました!この関数の最後の呼び出しは-0.0171449184417725秒前です...現在の時刻:1340196716.27624、最後の呼び出し:1340196716.29339このエラーは0.482785940170288秒前に発生しました。
WTF!時間のパラドックスに遭遇しました!この関数の最後の呼び出しは-0.0132658481579秒前です...現在の時刻:1340196716.74632、最後の呼び出し:1340196716.75959すでに0.470081090927124秒前にこのエラーが発生しました。
WTF!時間のパラドックスに遭遇しました!この関数は、最後に-0.011317 9683685303秒前に呼び出されました...現在の時刻:1340196717.21836、最後の呼び出し:1340196717.22968このエラーは0.472035884857178秒前に発生しました。
WTF!時間のパラドックスに遭遇しました!この関数の最後の呼び出しは-0.0152010917663574秒前です...現在の時刻:1340196717.68649、最後の呼び出し:1340196717.70169このエラーは0.468127012252808秒前に発生しました。