77667


提示コードのvoid
Wait();関数部ですがwaitTime変数の値を表示させたのですが常にマイナスの値が出力されてしまい待機してくれません。なぜ待機してくれなのでしょか？待機できな程の負荷がかかってるとは到底思えないコードのため必ずこの数字はプラスの値が来ると思われるのですがなぜなのでしょうか？

確認したこと  
変数はすべてコンストラクタ部で初期化０の値

[code]

    #define FRAME_RATE 60
    
[/code]

参考サイト: <https://dixq.net/g/03_14.html>  
※ clock();関数はミリ秒を返す関数です。

追記clock()関数はCPU時間を返すの間違えていますよって以下のうにglfwGetTime()関数を使って秒をdouble型で取得してそれに1000掛けることによってミリ秒を取得しています。よって下の提示コードのclock();関数部は以下の関数に書き換えましたが  
矩形を描画して移動させていましたがなんか突っかかる感じがするのでまだ間違えています。

[code]

    int getTime()
    {
        return (int)(glfwGetTime() * 1000.0f);
    }
    
[/code]

利用ライブラリ  
glew  
glfw  
opengl  
stb 関係ありません  
glm 関係ありません  
freeType 関係ありません

[![画像の説明をここに入力](https://i.stack.imgur.com/ua15T.png)](https://i.stack.imgur.com/ua15T.png)

[code]

    // ##################################### 待機フレームを計算 ##################################### 
    void FrameWork::Window::FrameUpdate(glm::vec4 color)
    {
        float c = 1.0f / 255.0f;
        glClearColor(color.x * c, color.y * c, color.z * c, color.w * c);                                   //カラーバッファのクリア色
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT | GL_ACCUM_BUFFER_BIT);   //フレームバッファを初期化
    
        glEnable(GL_BLEND); //アルファブレンド有効
        glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);  //ブレンドタイプ
    
        //フレームレートを制御する
    
        if (count == 0)
        {
            startCount = (int)clock();
        }
    
        if (count == FRAME_RATE)
        {
            startCount = (int)clock();
            count = 0;
        }
    
        count++;
    }
    
    // ##################################### フレームを取得 ##################################### 
    int FrameWork::Window::getFrame()
    {
        return count;
    }
    
    // ##################################### フレームレート　待機 ##################################### 
    void FrameWork::Window::Wait()
    {
        int tookTime = clock() - startCount;
        int waitTime = (count * 1000 / FRAME_RATE) - tookTime;
    
    
        std::cout << waitTime << std::endl;
    
        if (waitTime > 0)
        {
            //std::cout << waitTime << std::endl;
    
            std::this_thread::sleep_for(std::chrono::milliseconds(waitTime));
        }
    }
    
[/code]


CC BY-SA 4.0
2021-06-20T04:50:21.680
77662
2021-06-20T18:57:00.557
2021-06-20T10:59:20.333
question
c++ opengl
clock();関数を使ってミリ秒を利用したフレームレートを制御の仕方が知りたい。待機するミリ秒を得たい。


何が何でも`clock()`を使う必要があるのでしょうか？
既に`<chrono>`を使われているようですので、[`std::chrono::steady_clock::now()`](https://ja.cppreference.com/w/cpp/chrono/steady_clock/now)に切り替えることをお勧めします。  
あわせて期間を指定する`sleep_for()`ではなく時刻を指定する[`std::this_thread::sleep_until()`](https://ja.cppreference.com/w/cpp/thread/sleep_until)に切り替えると更に簡単になります。

[code]

    std::chrono::steady_clock::time_point startTime;
    constexpr auto FrameInterval = 10ms;
    
[/code]

としておけば

[code]

    void FrameWork::Window::Wait() {
        std::this_thread::sleep_until(startTime + FrameInterval);
    }
    
[/code]

で済みませんか？


CC BY-SA 4.0
2021-06-20T05:25:11.773
77663
2021-06-20T05:25:11.773
4236
77662
answer


> 矩形を描画して移動させていましたがなんか突っかかる感じがするのでまだ間違えています。

回答ではないのですが、以下の環境で適当にプログラムを作成してみました(`FrameUpdate()` と `Wait()`
メソッドと同等の関数を含みます)。

[code]

    $ lsb_release -d
    Description:    Ubuntu 21.04
    
    $ apt-show-versions libglu1-mesa
    libglu1-mesa:amd64/hirsute 9.0.1-1build1 uptodate
    
    $ apt-show-versions libglfw3
    libglfw3:amd64/hirsute 3.3.2-1 uptodate
    
    $ apt-show-versions libglew-dev
    libglew-dev:amd64/hirsute 2.1.0-4 uptodate
    
    $ glmark2 --fullscreen --show-all-options
    =======================================================
        glmark2 2021.02
    =======================================================
        OpenGL Information
        GL_VENDOR:     Intel
        GL_RENDERER:   Mesa Intel(R) UHD Graphics 630 (CFL GT2)
        GL_VERSION:    4.6 (Compatibility Profile) Mesa 21.0.1
    =======================================================
    [build] duration=10.0:fps-pos=-1.0,-1.0:fps-size=0.03:fragment-precision=default,default,default,default:
    interleave=false:model=horse:nframes=:show-fps=false:title=:title-pos=-0.7,-1.0:title-size=0.03:
    use-vbo=false:vertex-precision=default,default,default,default: FPS: 1334 FrameTime: 0.750 ms
    [build] duration=10.0:fps-pos=-1.0,-1.0:fps-size=0.03:fragment-precision=default,default,default,default:
    interleave=false:model=horse:nframes=:show-fps=false:title=:title-pos=-0.7,-1.0:title-size=0.03:
    use-vbo=true:vertex-precision=default,default,default,default: FPS: 1380 FrameTime: 0.725 ms
    =======================================================
                                      glmark2 Score: 1357 
    =======================================================
    
[/code]

60 FPS では以下の様になります。こちらの環境では突っかかる感じは見受けられません。

[![moving rectangle
object](https://i.stack.imgur.com/Yl61U.gif)](https://i.stack.imgur.com/Yl61U.gif)

`WaitTime` は 15ms 〜 17ms でした。また、参考までに 30 FPS, 70 FPS での結果も載せておきます。

[code]

    $ ./moving_rectangle > record.dat
    
    # 60 FPS
    $ datamash --header-out min 1 max 1 mean 1 sstdev 1 < record.dat
     min  max     mean  sstdev
      15   17   16.317   0.636
    
    # 30 FPS
    $ datamash --header-out min 1 max 1 mean 1 sstdev 1 < record.dat
     min  max     mean  sstdev
      32   34   32.957   0.693
    
    # 70 FPS
    $ datamash --header-out min 1 max 1 mean 1 sstdev 1 < record.dat
     min  max     mean  sstdev
    -150   14  -62.016  48.470
    
[/code]


CC BY-SA 4.0
2021-06-20T18:57:00.557
77667
2021-06-20T18:57:00.557
77662
answer