質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

4412閲覧

C++ 標準ライブラリで処理をミリ秒待機させたい。std::this_thread::sleep_forは待機する関数として正しいのか?

退会済みユーザー

退会済みユーザー

総合スコア0

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2021/09/14 06:31

編集2021/09/15 10:46

#現状
極端に動作重たい

質問内容

提示コードのコメント部のコードですがこれは処理を待機する関数とした正しいのでしょうか?実際下記のテキストファイル等に待機するミリ秒が表示されるのですがこれは60フレームでの待機ミリ秒のため問題なと思うんですが動作が極端に遅くなります。
std::this_thread::sleep_for(std::chrono::milliseconds(wait)); 関数はミリ秒待機する関数ですがこれが悪いのでしょうか?
原因がわかりません。

参考サイトA: https://marycore.jp/prog/objective-c/sleep-process/#sleep%E9%96%A2%E6%95%B0

参考サイトB: https://cpprefjp.github.io/reference/chrono.html

textfile

117 217 316 417 517 615 717 817 916 1017 11

cpp

1#ifndef ___FPS_H_ 2#define ___FPS_H_ 3 4 5#include <iostream> 6#include <chrono> 7#include <thread> 8#include <time.h> 9#include <fstream> 10 11 12 13class Fps 14{ 15public: 16 Fps(); 17 ~Fps(); 18 19 void Wait(); 20 void Update(); 21 22private: 23 24 long long getMilliSeconds(); 25 26 27 long long count; 28 long long start; 29 long long wait; 30 long long fps = 60; 31 32}; 33 34 35 36#endif
#include <iostream> #include <chrono> #include "../header/Fps.hpp" #include "../lib/ncurses/include/curses.h" #include "../header/Log.hpp" Fps::Fps() { wait = 0; start = 0; count = 0; } //ミリ秒を取得 long long Fps::getMilliSeconds() { std::chrono::system_clock::time_point time = std::chrono::system_clock::now(); std::chrono::milliseconds tp_msec = std::chrono::duration_cast<std::chrono::milliseconds>(time.time_since_epoch()); long long all_msec = tp_msec.count();//経過時間を総ミリ秒(整数値)に変換 return all_msec; } void Fps::Wait() { long long t = getMilliSeconds() - start; //Print("t %lld",t); //Print("(count * 1000 / fps) %lld",(count * 1000 / fps)); wait = (count * 1000 / fps) - t; //Print("%lld\n",wait); if(wait > 0) { //Print("%lld\n",wait); std::this_thread::sleep_for(std::chrono::milliseconds(wait)); } } void Fps::Update() { if(count == 0) { start = getMilliSeconds(); } else if(count == fps) { start = getMilliSeconds(); count = 0; } count++; } Fps::~Fps() { }
//Main.cpp while (true) { fps->Update(); entry->Update(); //更新 entry->Renderer(); //描画 if(entry->getChangeScene() == Scene::SceneType::Exit) { break; } fps->Wait(); }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

std::this_thread::sleep_forは関数が呼ばれてから指定秒数sleepします。

fpsを固定する目的の場合、1frame分の処理を始める前から指定秒数sleepしてほしいと思うので不適当です。代わりにstd::this_thread::sleep_untilを用います。これはあらかじめsleepを解除したいtimepointを計算しておきそれを指定します。

つまり、1frame分の処理を始める前に現在時刻を取得し、処理を開始し、処理を終えたらstd::this_thread::sleep_untilでsleepします。

C++11からC++17を駆け抜けるC++講座 - Qiita#リテラル演算子

投稿2021/09/14 16:18

yumetodo

総合スコア5852

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fana

2021/09/15 04:16

最も肝心な Fps::Wait() の呼び出し部分が示されていないので実情は謎ですが,例えば, 1frame分の処理 を終えた後で, count をインクリメントし, 次frameの処理を開始すべき時刻までsleepする目的で Fps::Wait() を呼ぶ (Fps::Wait() は,sleep_forの引数に sleep すべき時間を指定していると見える) のであれば,sleep_for でも良いように思えます.
退会済みユーザー

退会済みユーザー

2021/09/15 10:45 編集

提示コードを修正しました。 質問ですがtimepointを用いる場合どうやって計算を行えばいいのでしょうか?
yumetodo

2021/09/15 17:21

単に足し算すれば良いです。operatorがoverloadされてます。
yumetodo

2021/09/15 17:28

using clock = std::chrono::steady_clock; using namespace std::chrono_literals; auto t0 = clock::now(); //do something std::this_thread::sleep_until(t0 + 1.0s / 60); 多分こんなかんじ
退会済みユーザー

退会済みユーザー

2021/09/16 00:38

質問ですが以下ように挑戦したのですがオペレーターがありません等のエラーでなかなかコンパイル出来ませんどうしたらいいのでしょうか? void Fps::Wait() { std::chrono::_V2::steady_clock::time_point t = std::chrono::_V2::steady_clock::now() - start; // std::this_thread::sleep_until(); using clock = std::chrono::steady_clock; using namespace std::chrono_literals; auto t0 = clock::now(); //do something std::this_thread::sleep_until(t0 + 1.0s / 60); } void Fps::Update() { start = std::chrono::_V2::steady_clock::now(); } Fps::~Fps() { }
yumetodo

2021/09/17 07:57

`std::chrono::_V2::steady_clock` あとこれいったい何をつかおうとしているんですか、やめましょう
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問