ややプログラム紀行

博士2年のプログラムに関する日記

テンプレート変えました!

10月はなるべく更新しよう(フラグ

使っていたテンプレートが壊れて表示されるようになってしまったので、これを機に新しいテンプレートにしてみました!

これのほかにもいくつか候補があったので、もしかしたらすぐ変えるかもしれないです

FPS計測クラスを作るにあたって、時間計測の関数を探していたところ「Chrono」というのを見つけました

どっかでみたことあるなーって思いましたがBoostにあった気がします

多分C++11の流れで採用された奴の1つですかね

今まではtimeGetTime関数とかを使って時間を計測してましたが、環境依存とか考えるとやっぱ標準ライブラリを使ったほうがいい気がします(自分はlinuxとかでC++使ったことはないのでよくわかりませんorz)

調べてみると、ミリ秒だとかマイクロ秒だとか、ただの秒、分、時間を意識しないで計算できるようになっていて便利らしいですが、使ってみると、コードが前よりだいぶ長くなってます

・宣言

#include <chrono>

using namespace std;

chrono::microseconds time;

前までソースコードが崩れて表示されてて気になってたので、Syntax Highlighterとかいうのを使ってみました

小なりかっこの表示がめんどくさい・・・

chronoは名前空間stdに入ってます、いちいちchronoって書くのが嫌な人はusing namespace std::chronoでもいいと思います

今回はマイクロ秒ですが、ほかにもいろいろあるので試してみてください

・時間の取得

time = chrono::duration_cast<chrono::microseconds>(chrono::system_clock::now().time_since_epoch());	// エポック時間

エポック時間?!ってなりますよねふつう、僕はそうです

エポック時間っていうのは1970年1月1日午前0時0分0秒からの時間を表しているそうです(区切りがいいからだとか、UNIXが作られた年だからとかなんとか)

なんでこんなめんどうな・・・ってなりますが、実際このchrono自体面倒で、時間差分などを計算するのは楽なんですが、現在時間の表示などはなかなか大変な仕様になってるようです

上のソースコードでは、chrono::system_clock::now()で時間を取得、しかしこのままだとtime_point型という時間の1点?を表す形になっていて扱いづらいのでtime_since_epoch関数によってduration型に変換、そこからマイクロ秒に変換という経緯になってます

本当に面倒ですね

ただ、上のような使い方はふつうしないと思います

FPS計測などで使うとしたら

chrono::system_clock::time_point StartTime, EndTime;

StartTime = chrono::system_clock::now();

// メインループ

while(1){

EndTime = chrono::system_clock::now();

if(EndTime - StartTime > chrono::seconds(1)){

// 1秒たった

}

}

これはchronoの良さがよくわかる気がします

time_point型で差をとると、duration型と比較できるので、扱いやすいです

てかそれ目的で作られてる気がしてきた

ちなみに無理やり現在時間を取得することもできます

time_t t = chrono::system_clock::to_time_t(chrono::system_clock::now() );

tm time;

localtime_s(&time, &t);

cout << time.tm_year + 1900 << endl << time.tm_mon + 1 << endl << time.tm_mday << endl;

なんで年に1900、月に1足さなきゃならんのだ・・・