27

皆さん、私のアプリケーションでは、clock_gettime(CLOCK_MONOTONIC)フレーム間のデルタ時間を測定するために使用しています (gamedev の典型的なアプローチ) clock_gettime(..)は現在の時間よりも大きい)。

現在、このようなパラドックスが発生した場合、現在のフレームをスキップして次のフレームの処理を開始するだけです。

問題は、これがどのように可能になるのかということです。の Linux POSIX 実装のバグclock_gettimeですか? Ubuntu Server Edition 10.04 (カーネル 2.6.32-24、x86_64)、gcc-4.4.3 を使用しています。

4

5 に答える 5

23

man clock_gettime言います:

CLOCK_MONOTONIC_RAW (Linux 2.6.28 以降; Linux 固有)

CLOCK_MONOTONIC に似ていますが、NTP 調整の影響を受けない生のハードウェア ベースの時間へのアクセスを提供します。

NTP 調整の対象ではないので、可能性はあるCLOCK_MONOTONIC_RAWと思いCLOCK_MONOTONICます。

2.6.18 カーネルと特定の Itanium プロセッサを搭載した Redhat Enterprise 5.0 でも同様の問題がありました。同一OSの他のプロセッサでは再現できませんでした。これは、わずかに新しいカーネルといくつかの Redhat パッチを使用して RHEL 5.3 で修正されました。

于 2010-09-07T09:23:30.217 に答える
21

のインスタンスのように見えます

commit 0696b711e4be45fa104c12329f617beb29c03f78
Author: Lin Ming <ming.m.lin@intel.com>
Date:   Tue Nov 17 13:49:50 2009 +0800

timekeeping: Fix clock_gettime vsyscall time warp

Since commit 0a544198 "timekeeping: Move NTP adjusted clock
multiplier to struct timekeeper" the clock multiplier of vsyscall is updated with
the unmodified clock multiplier of the clock source and not with the
NTP adjusted multiplier of the timekeeper.

This causes user space observerable time warps:
new CLOCK-warp maximum: 120 nsecs,  00000025c337c537 -> 00000025c337c4bf

パッチについては、こちらを参照してください。これは 2.6.32.19 に含まれていましたが、Debian チーム (?) によってバックポートされていない可能性があります。あなたはそれをチェックアウトする必要があります。

于 2010-09-07T09:29:49.150 に答える
6

試してみてくださいCLOCK_MONOTONIC_RAW

于 2010-09-07T09:15:27.030 に答える
4

確かに私にはバグのように聞こえます。おそらく、 Ubuntu のバグ トラッカーで報告する必要があります。

于 2010-09-07T09:16:05.423 に答える
0

Linux のバグです。単調な時計を調整しても、逆戻りすることはありません。非常に古いカーネルと非常に古いディストリビューションを使用しています。

編集: フレームをスキップする必要がありますか? もう一度 clock_gettime を呼び出すとどうなりますか?

于 2013-03-16T15:24:38.537 に答える