28 Aralık 2016 Çarşamba

std::chrono::steady_clock Sınıfı

Giriş
Şu satırı dahil ederiz.
#include <chrono>
Bazı derleyiciler steady_clock'ı system_clock olarak sunuyorlar. Aslında bu bir hile. VS 2012'de şöyle tanımlı.
class steady_clock : public system_clock
{   // wraps monotonic clock
public:
  static const bool is_monotonic = true;    // retained
  static const bool is_steady = true;
};
Dolayısıyla insanlar kendi clock sınıflarını yazmak durumunda kalıyorlar. Şöyle yaparız.

Accuracy
VS 2012'ye kadar bu sınıf altta GetSystemTimeAsFileTime() metodunu kullanıyor. Açıklaması şöyle
GetSystemTimeAsFileTime have a precision of 10 to 15 milliseconds.
is_steady alanı
Bu sınıfın is_steady_alanı true döner.
typedef steady_clock clock;
printf("clock::is_steady: %s\n", clock::is_steady ? "yes" : "no");
now metodu
Şöyle yaparız.
std::chrono::steady_clock::time_point tend = std::chrono::steady_clock::now()
                                            + std::chrono::minutes(1);
while (std::chrono::steady_clock::now() < tend)
{
  // do your game
}
period alanı
Açıklaması şöyle. Saniyede kaç defa tick olduğunu belirtir.
A clock's ::period member is defined as "The tick period of the clock in seconds." It is a specialization of std::ratio which is a template to represent ratios at compile-time. It provides two integral constants: num and den, the numerator and denominator of a fraction, respectively.
Kendi saatimi yazarken şöyle yaparız.
struct qpc_clock {
  typedef std::chrono::nanoseconds  duration;      // nanoseconds resolution
  typedef duration::rep             rep;
  typedef duration::period          period;

  ...
};
period::num alanı 1 değerine sahiptir.

period::den alanını yazdırırsak örneğin 1000000 elde ederiz. Saniyede 1 milyon tick var anlamına gelir. Bu saatimizin mikrosaniye çözünürlüğünde olduğunu gösterir.

1000000000 (1 milyar) elde edersek saatimizin nanosaniye çözünürlüğünde olduğunu gösterir.
Kendi saatimizi yazarken şöyle yaparız. Önce Windows'taki zaman bulunur. Daha sonra bu benim saatimiz çözünürlüğüne çevrilir. Örneğin Windows'ta 1000000 nanosaniye geçmiş olsun. Benim saatim ise 1/1000000 çözünürlüğünde. Çarpma işleminden sonra döndürülen duration'daki count alanı 1 olur.
LARGE_INTEGER counter;
QueryPerformanceCounter(&counter);
return time_point(duration(static_cast<rep>((double)
  counter.QuadPart / frquency.QuadPart *
  period::den / period::num)
));


Hiç yorum yok:

Yorum Gönder