Saya mencoba menggunakan perpustakaan chrono untuk pengatur waktu dan durasi.
Saya ingin dapat memiliki Duration frameStart;
(dari awal aplikasi) dan Duration frameDelta;
(waktu antar frame)
Saya harus bisa mendapatkan frameDelta
durasi sebagai milidetik dan detik mengambang.
Bagaimana Anda melakukan ini dengan <chrono>
pustaka c ++ 11 yang baru ? Saya telah mengerjakannya dan melakukan googling (informasinya jarang). Kode ini memiliki template yang berat dan membutuhkan cast dan hal-hal khusus, saya tidak tahu cara menggunakan library ini dengan benar.
count
...duration_cast
Jawaban:
Apakah ini yang kamu cari?
#include <chrono> #include <iostream> int main() { typedef std::chrono::high_resolution_clock Time; typedef std::chrono::milliseconds ms; typedef std::chrono::duration<float> fsec; auto t0 = Time::now(); auto t1 = Time::now(); fsec fs = t1 - t0; ms d = std::chrono::duration_cast<ms>(fs); std::cout << fs.count() << "s\n"; std::cout << d.count() << "ms\n"; }
yang bagi saya mencetak:
6.5e-08s 0ms
sumber
auto
padafs
dand
?auto
akan baik-baik sajad
, karenaduration_cast<ms>
adalahms
. Namun untukfs
auto
tidak akan sesuai karena hasil darit1-t0
memiliki tipehigh_resolution_clock::duration
yang belum tentu sama dengan tipeduration<float>
. Misalnya di sistem sayaduration<long long, nano>
. Jadi ada konversi implisit dari berbasis integralnanoseconds
ke berbasis floatseconds
terjadi di baris itu, hanya karena jenis tujuan ditentukan denganfsec
.auto fs = std::chrono::duration_cast<fsec>(t1 - t0);
terlalu berlebihan?Menebak apa yang Anda minta. Saya berasumsi dengan pewaktu bingkai milidetik Anda mencari sesuatu yang bertindak seperti berikut,
double mticks() { struct timeval tv; gettimeofday(&tv, 0); return (double) tv.tv_usec / 1000 + tv.tv_sec * 1000; }
tetapi menggunakan
std::chrono
sebagai gantinya,double mticks() { typedef std::chrono::high_resolution_clock clock; typedef std::chrono::duration<float, std::milli> duration; static clock::time_point start = clock::now(); duration elapsed = clock::now() - start; return elapsed.count(); }
Semoga ini membantu.
sumber
Saya tidak tahu apa artinya "milidetik dan detik float", tapi ini bisa memberi Anda gambaran:
#include <chrono> #include <thread> #include <iostream> int main() { auto then = std::chrono::system_clock::now(); std::this_thread::sleep_for(std::chrono::seconds(1)); auto now = std::chrono::system_clock::now(); auto dur = now - then; typedef std::chrono::duration<float> float_seconds; auto secs = std::chrono::duration_cast<float_seconds>(dur); std::cout << secs.count() << '\n'; }
sumber
count
sebagaifloat
?Dalam gaya AAA menggunakan idiom penginisialisasi yang diketik secara eksplisit :
#include <chrono> #include <iostream> int main(){ auto start = std::chrono::high_resolution_clock::now(); // Code to time here... auto end = std::chrono::high_resolution_clock::now(); auto dur = end - start; auto i_millis = std::chrono::duration_cast<std::chrono::milliseconds>(dur); auto f_secs = std::chrono::duration_cast<std::chrono::duration<float>>(dur); std::cout << i_millis.count() << '\n'; std::cout << f_secs.count() << '\n'; }
sumber