問題タブ [chrono]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - chrono::high_resolution_clock::now() を使用した奇妙な動作
Glenn Fiedler や DeWitter など、さまざまなゲーム タイミング ループ メソッドを調べてきました。私自身の C++ 知識の制限により、重要な領域を理解するのが難しいことがわかりました。これで、私は自分の方法を実装しようと試み始めました....私はこれらの方法について何かを理解しようとする良い方法を考えました。
[編集 1: コンパイラとして minGW-w64 (x64-4.8.1-posix-seh-rev5) で CodeBlocks IDE を使用しています]
[edit2: 3 番目のタイマー、QueryPerformanceCounter を含めるように修正されたコードと出力ウィンドウ]
これを達成しようとして、次の問題に遭遇しました。
最小限のコード:
比較のために、上記のコードでは 2 つのタイマーを使用しています。
私のPCでは、これからの出力は次のとおりです。
duration_cast<microseconds>(finish - start).count()/1000.0
steady_clock を使用すると、次のようになります。
高解像度クロックが 0 から 15.6 ミリ秒の間で変動することに注意してください。また、steady_clock の比較にも注目してください。
私が抱えている問題は、update() コードがエンティティの位置を正確に 1000/60 (1 秒あたり 60 更新サイクル)、つまり 16.666etc ms ごとに更新する固定時間のゲーム ループを実装する場合、これは非常に返された雇用タイマーの変動値に近い!実際の問題は、1000/60 ミリ秒未満のゲーム ループ フレーム時間と、update() が完了した後の残りの時間の両方に対応するためにアキュムレータも実装すると、更新ループがより早く、不規則な時点で開始されることです。そうすべき。
上記の最小限のコードに問題がありますか?そうでない場合、適切な固定時間の実装のためにこれに関心を持つ必要がありますか? さらに、関連する場合、プログラム/スレッドを分離して、システム IRQ やその他のポーリング イベントによって中断されないようにする方法はありますか? 雇用タイマーはそのような中断の対象になる可能性があると思います。
c++ - C++: std::chrono または boost::chrono
私は自分のコードでいくつかのベンチマークを行っており、標準バージョンの chrono を使用する必要があるか、Boost が提供する元のバージョンを使用する必要があるかを判断しようとしています。
試してみたくて標準のものを使い始めたのですが、例えばBoostが提供するchronoのようなio機能がないことに気づきました。
それで、クロノに関して、一般的に、Boostライブラリまたはそれに対応する標準ライブラリを使用する必要がありますか?
c++ - C++11 std::chrono 減算 now と min
私はこれに少し夢中になっているように感じますが、それは私には意味がありません. 私の考えでは、呼び出しから返された任意の時点から最小時点を差し引くnow()
と、常に正の期間が得られるはずですが、そうはなりません。
これが正の整数ではなく負の整数を出力するのはなぜですか? (clang 3.3 または g++ 4.8.1)
c++ - このタイマーの何が間違っていますか?
クロノを使用してタイマーを実装しようとしていますが、何かが足りないように感じます。関数が反復ごとに呼び出されることが重要ですが、一部の命令は遅延後にのみ実行されます。これは、より大きなプロジェクトからの単純化された例です。私は何が欠けていますか?
出力は、通過する遅延がループのデルタ時間であることを示しています。ただし、所要時間は適切に機能します。出力例: 実行していない: 2971 3000 実行していない: 2971 3000 実行していない: 3145 3000 実行している
問題は、「DOING iT」または「NOT DOING IT」行を印刷したときにのみ機能することです私がそれをすると、「DOING IT」出力はありません。
編集
わかりました。よくあることですが、簡略化されたバージョンを作成することで、正しい方向に進むことができました。私がほのめかしたように、それは解決の問題のようです。単位をナノ秒に変更すると、期待どおりに機能しているようです。一般的なアプローチに疑問を持っている人や、より明るいアイデア/参考文献を持っている人からの連絡をお待ちしています. ここに私の作業バージョンがあります:
c++ - std::chrono::system_clock / std::chrono::high_resolution_clock との時間差
次のコードを検討してください
私たちが期待しているのは、
差は 100039989 で、およそ 100000000 のはずです
完全に正常に動作するこのデモを参照してください。
ただし、私のマシンには、スタックオーバーフローのこの回答によると、構成不良を引き起こすと思われるコンパイラがいくつかインストールされています。
したがって、私は提案された修正を試みました: 正しいLD_LIBRARY_PATH
. これらは私が試した出力との組み合わせです(特に4.4と4.6で...)
差は 100126 で、およそ 100000000 のはずです
差は 100132 で、およそ 100000000 のはずです
差は 100085953 で、およそ 100000000 のはずです
差は 100156418 で、およそ 100000000 のはずです
g++-4.8
いずれにせよ、 を使用してコンパイルすると正常に動作しますが、 を使用してlibstdc++
コンパイルすると問題がg++-4.7
発生するようです。
ここでコンパイラ/バイナリの呼び出しで何か間違ったことをしていますか、それともバグg++-4.7
ですか? (それはg++-4.7.3
、g++-4.8.1
具体的には)
(おそらく最も醜い) 回避策として、もちろん、ごくわずかな時間を測定し、それを予想される差と比較して、要因を考え出すことができます。しかし、私はこれをエレガントに解決したいと思っています。
c++ - std::chrono は期間を乗算します
次のコード例を検討してください。
これにより、経過時間が秒単位で出力されることを期待しています。しかし、実際には時間を数千秒で出力します (期待される結果に 0.001 を掛けた値)。私は何か間違ったことをしていますか?
編集
seconds
は と同等であるため、duration<some-int-type>
同じduration_cast<seconds>
結果が得られます。
gcc-4.7.3-r1 を使用しました
c++ - time_point + duration から duration へのキャストが clang で失敗する
このコードは gcc-4.8 でコンパイルされ、clang-3.3 で失敗しますか? そして、このコードをclangでコンパイル可能にする方法は? =\
エラーメッセージ:
c++ - タイムスタンプが並べ替えられないようにするにはどうすればよいですか?
私の理解では、C++ では、IO または外部関数呼び出しではないものを最適化して並べ替えることができます。これは、RAII スタイルの関数タイムスタンプを書く私の努力を挫折させ始めています。
編集
ここに自己完結型の例があります。
最適化された VS 2012 のコード