提示コードですが1000倍することによってミリ秒を取得してそれを使ってフレームレート制御してwait変数の数値の分プログラムを停止するコードを作りたいのですがなぜかint t の値が段々増えてしまし困っています。何が原因なのでしょうか?
cpp
1 2//待機フレームを計算 3void FrameWork::Window::FrameUpdate() 4{ 5 6 if (count == 60) 7 { 8 int t = ((int)(glfwGetTime() * 1000.0f)) - startCount; 9 10 11 12// std::cout << "glfwGetTime(): " << (int)(glfwGetTime() * 1000.0f) << std::endl; 13// std::cout << "startCount: " << startCount << std::endl; 14 // std::cout <<"t: "<< t << std::endl; 15 16 wait = t / 60; 17 //std::cout << wait << std::endl; 18 //startCount = 0; 19 count = 0; 20 //glfwSetTime(0); 21 } 22 23 24 25 if (count == 0) 26 { 27 startCount = ((int)(glfwGetTime() * 1000.0f)); 28 std::cout << "startCount: " << startCount << std::endl; 29 30 31 } 32 33 34 count++; 35 36} 37 38 39 40//待機 41void FrameWork::Window::Wait() 42{ 43 std::this_thread::sleep_for(std::chrono::milliseconds(wait)); // 3 ミリ秒 44 45} 46
デバッグプリントの痕跡が見えますが、それではわからなかったのでしょうか?
わからないので質問しました。なぜtの値が増え続けるのでしょうか?
startCountがおかしくはなかったですか?
どんどん値が増えていく。これがおかしいのでしょうか?
void FrameWork::Window::FrameUpdate()
{
std::cout << "glfwGetTime(): " << (int)(glfwGetTime() * 1000.0f) << std::endl;
と、ログだすとどんな値がでるのでしょうか?10回ぐらい分ぐらい値を見てみたいです。コメントアウトしたログ用の値も一緒にみれると何かわかるかもしれません。
glfwGetTime()のreturn値は、秒なので、*1000してもmsec単位の時刻がとれず、FrameUpdate()がコールしても時間の更新がないのでは。と想像しています。
ログありがとうございます。このログだと、FrameUpdateの関数は想定どおりで、waitにはだいたい16がはいってそうです。
どのあたりを直したいのか教えてくれるとアドバイスできるかもしれません。
waitの値がどんどん増えてしまっているのでt変数にどんどん大きな値が入っているのですがこれはどうすればいいのでしょうか?startCount 変数でその分の値を引いてるはずなのでこんな値になるはずないのですが
質問に貼られた画像では t: 999 前後でほぼ一定ですよね。
「int t の値が段々増えて」とはなっていないようですが。
何が問題なのですか。
そう、ログだとtは一定みたい。FrameUpdateは、正しく実装されてそうー。
wait()はいつ、どう言う時に呼ばれるのでしょうか?
毎フレームです。
すいません、ちょっと間違っていました。
userisgodさんの言うとおり、実装するのがよいと思います。
例でFrameUpdate()を実装してみました。
1秒単位で調整するのは難しそうだったので、毎Frame時間を調整するようにしました。
void UpdataFrame(void)
{
static double lasttime = 0;
double nowtime = 0;
double deltatime = 0;
double limittime = 1.0/60;
if (count == 0) {
lasttime = glfwGetTime();
} else {
nowtime = glfwGetTime();
deltatime = nowtime - lasttime;
}
if (deltatime > limittime) {
wait--;
} else {
wait++;
}
lasttime = nowtime;
count++;
return;
}
これより良い実装があるような気がしますが。。。
こちらの内容も参考になると思います。
https://stackoverflow.com/questions/20390028/c-using-glfwgettime-for-a-fixed-time-step
tの時間が増えるのは、毎フレーム処理何か処理をしていると思いますが、その処理時間が考慮されていないので、tがだんだん増えていくと思いますー。
毎フレームの処理が一定でなければ、以下の方がよいかもしれません。
void UpdataFrame(void)
{
static double lasttime = 0;
double nowtime = 0;
double deltatime = 0;
double limittime = 1.0/60;
if (count == 0) {
lasttime = glfwGetTime();
} else {
nowtime = glfwGetTime();
deltatime = nowtime - lasttime;
}
wait = (2 * limittime) - deltatime;
lasttime = nowtime;
count++;
return;
}
質問と矛盾する画像を貼られても困ると思いますが。
せめて、現象が再現している画像を貼るべきかと。
1000の次に999と増えていないのは、1フレームで行われる処理が十分に軽く、
「wait」の計算時に切り捨てられた部分によって減ったという感じでしょうか。
なるほど。
//待機
void FrameWork::Window::Wait()
{
if ((int)(wait * 1000.0f) > 0)
{
std::this_thread::sleep_for(std::chrono::milliseconds((int)(wait * 1000.0f))); // 3 ミリ秒
std::cout << wait * 1000.0f << std::endl;
}
}
こうしましたがこれは正しいのでしょうか?
何が「なるほど」なのかわかりませんが、該当の「Wait()」だけを修正したのであれば、
意味の分からない修正を行っているのではないでしょうか。
誰も、「Wait()」に関して、指摘は行っていないと思います。
私の回答も理解できなかったということでしょうか。
> こうしましたがこれは正しいのでしょうか?
あなたの想定した通りに動くのであれば正しいのではないでしょうか。
ミリ秒の取得にwait * 1000.0fという処理は正しいのでしょうか?
それは動かしてみた上で聞いてるのですか?
私の回答は読んでないんですか?
Kesoki4さんのコードで対応したなら、自己解決で質問を閉じたらどうでしょうか。
回答1件
あなたの回答
tips
プレビュー
