blog.monophile.net

Takaaki Yamamoto

東京工業大学において計算機科学と応用数学を学び、情報科学芸術大学院大学[IAMAS]においてメディア表現を専攻し修了。 現在は digitiminimi Inc. において、インフラエンジニアとして生計をたててている。 また、計算を主題に制作を行い、現代音楽作品や公共インスタレーション作品など技術提供を行う。 三輪眞弘に師事する。

List

c++11でフレームレートを調整するための関数

GLFWでフレームレートを調整するための関数を書いてみた。

fps.cpp

#include <iostream>
#include <ctime>
#include <tuple>
#include <functional>
#include <chrono>
#include <thread>

void periodic(double periodic, std::function<void(void)> func) {
    using namespace std;
    chrono::time_point<chrono::system_clock> start, end;
    while (true) {
        start = chrono::system_clock::now();
        func();
        end = chrono::system_clock::now();
        chrono::duration<double> elapsed_seconds = end - start;
        start = end;
        if (elapsed_seconds.count() < periodic) {
            double _sleep = periodic - elapsed_seconds.count();
            this_thread::sleep_for(chrono::duration<double>(_sleep));
        }
    }
}

void showfps(std::function<void(float)> show_func) {
    using namespace std::chrono;
    const int INTERVAL = 60;
    static int count = -2;
    count++;
    static time_point<system_clock> start = system_clock::now();
    if (count % INTERVAL == INTERVAL - 1) {
        time_point<system_clock> end = system_clock::now();
        duration<double> elapsed_seconds = end - start;
        show_func((float) 1. / (elapsed_seconds.count() / (INTERVAL)));
        start = end;
    }
}

int main(void) {
    using namespace std;
    int fps = 60;
    auto func = []() {
        showfps([](float fps) {cout << fps << endl;});
    };
    thread([fps, func] {periodic(1./fps, func);}).detach();
    this_thread::sleep_for(chrono::minutes(1));
    return EXIT_SUCCESS;
}

compile

$ g++ -std=c++11 -pthread -o fps fps.cpp

exec

$ ./fps

以下のようにFPSが標準出力に書かれます。

59.5678
59.6696
59.6809
59.696
59.6591
59.6614
59.6951
59.6623
 :