今回はunityやゲーム開発で使用されるdeltaTimeをC++の標準ライブラリのみで実装する方法を紹介したいと思います。
deltaTimeとは
直前のフレームから現在のフレームまでに経過した時間を表すもののことです。
ゲーム開発ではdeltaTimeに厳密に時間を計ることで、フレームレートに左右されない実装を行うことが可能になります。
実装方法
C++では<chrono>
をincludeすることでdeltaTimeの実装が可能になります。
deltaTime1.cpp
#include <iostream>
#include <chrono>
int main() {
// 初期化
auto previousTime = std::chrono::high_resolution_clock::now();
while (true) { // ゲームやアプリケーションのメインループ
// 現在の時間を取得
auto currentTime = std::chrono::high_resolution_clock::now();
// デルタタイムを計算 (ミリ秒単位に変換)
auto deltaTime = std::chrono::duration_cast<std::chrono::milliseconds>(currentTime - previousTime).count();
// 現在の時間を次のループの基準時間に更新
previousTime = currentTime;
// デルタタイムを利用して処理を行う
std::cout << "deltaTime: " << deltaTime << " ms" << std::endl;
}
system("pause");
return 0;
}
std::chrono::high_resolution_clock::now()
は、現在の時刻を取得する関数です。
以上のコードは、コンソール上で毎ループdeltaTimeを出力するだけのコードですが、この方法でdeltaTimeでのタイマーを実装できることが分かると思います。
今度はカウント用変数に毎秒足していくことでタイマー実装を実現しましょう。
deltaTime2.cpp
#include <iostream>
#include <chrono>
float timer_count = 0.0f; // タイマーのカウント変数
int main() {
// 初期化
auto previousTime = std::chrono::high_resolution_clock::now();
while (true) { // ゲームやアプリケーションのメインループ
// 現在の時間を取得
auto currentTime = std::chrono::high_resolution_clock::now();
// デルタタイムを計算 (ミリ秒単位に変換)
auto deltaTime = currentTime - previousTime;
// 現在の時間を次のループの基準時間に更新
previousTime = currentTime;
//デルタタイムをタイマーに加算
timer_count += std::chrono::duration<float>(deltaTime).count();
// デルタタイムを利用して処理を行う
std::cout << "経過秒数" << timer_count << std::endl;
}
system("pause");
return 0;
}
以上のコードも、コンソール上で出力をループするソースコードですが、実行すると経過時間をfloat
で扱えることが分かると思います。
総括
- ゲーム開発などではdeltaTimeに厳密に時間を計ることで、フレームレートに左右されない実装を行うことが可能にな
- C++では
<chrono>
をincludeすることで標準ライブラリのみでdeltaTimeの実装が可能になる。