

### 質問内容

ゲームループでの処理の作り方が知りたいです。非同期ですのでどっちかが先に終わるわけなのですがその際どうしたらいいのでしょうか？

### 調べたこと、わかったこと

計算で描画するオブジェクトを算出してそれを次のフレームで描画実行。その間に計算スレッドで次のフレームの位置等の計算を計算して次のフレームでそれを元に描画というゲームループ

### 起きてる問題

描画している間に別のスレッドで計算が実行されるので  
例えば計算が先に終わった場合、描画は計算をした値を元に描画を行うので極端な話、一回の描画の間に計算が二回分の値が参照されその位置に描画される等の問題が発生します。

### 知りたいこと

１，描画、計算がそれぞれ独立したスレッドで動いている処理で例えば計算が描画より早く終わった際に描画が終わるまでどうしたらいいのか知りたい。その逆の場合もどうすればいいのでしょうか？※提示画像参照

２，移動等のプログラムを作る場合はデルタタイムを掛け算すると思いますがこれは描画のデルタタイムでしょうか？、計算のデルタタイムでしょうか？

### 提示コードについて

計算、描画のループです  
`std::thread`で実装しています。

### 環境、利用ライブラリ

利用ライブラリ：opengl,glew,glfw,glm  
OS: ubuntu  
言語: C++

### 提示画像

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

### 参考サイト

ブログサイト:<https://sites.google.com/site/monshonosuana/opengl%E3%81%AE%E8%A9%B1/opengl%E3%81%AE%E8%A9%B1-%E7%AC%AC5%E5%9B%9E>

### ソースコード

[code]

    #include <iostream>
    #include <thread>
    #include <future>
    #include <memory>
    #include <ctime>
    #include <unistd.h>
    #include <random>
    
    
    std::random_device rnd;     //非決定的な乱数生成器を生成
    std::mt19937 mt(rnd());     //メルセンヌ・ツイスタの32ビット版、引数は初期シード値
        
    void thread_Update()
    {
        std::uniform_int_distribution<> rand(0,10);        // [0, 99] 範囲の一様乱数
    
        for(int i = 0; i < 10; i++)
        {
            std::cout<<"thread_A"<<std::endl;
            std::this_thread::sleep_for(std::chrono::milliseconds( rand(mt) * 100));
    
        }
        
    }
    
    
    void thread_Render()
    {
        std::uniform_int_distribution<> rand(0,10);        // [0, 99] 範囲の一様乱数
    
        for(int i = 0; i < 10; i++)
        {
            std::cout<<"thread_B"<<std::endl;
            std::this_thread::sleep_for(std::chrono::milliseconds( rand(mt) * 100));
        }
    
    }
    
    int main()
    {
        try
        {
            std::thread t1(thread_Render);
            std::thread t2(thread_Update);
    
            std::cout<<"end"<<std::endl;
    
            std::this_thread::sleep_for(std::chrono::milliseconds(5000));
            t1.join();
            t2.join();
    
        }
        catch(std::exception &e)
        {
            std::cout<<e.what()<<std::endl;
        }
    
    
        return 0;
    }
    
    
[/code]


CC BY-SA 4.0
2022-12-28T09:46:17.520
93071
2022-12-30T03:08:58.190
2022-12-29T12:19:42.810
19110
55177
question
c++ opengl
マルチスレッドのゲームループで先に終わったループは次のループまで何をすればいいのか知りたい


質問1は、仕様次第で好きにすれば良いのでは。

  * 相手の処理結果を捨てて良いなら、相手の処理を待たずに自分の処理を進める。
  * 相手の処理結果を捨ててはならないなら、 
    * 相手の処理を待つ。または、
    * キューに処理結果をキューイングして、自分の処理を進める。キューが一杯になったら、 
      * キューに空きができるまで待つ。または、
      * キューのサイズを拡張する。または、
      * キュー内の古い処理結果を捨てる。※一部捨てることになるが

質問2は質問1とは関係ないので、別質問を立ててください。


CC BY-SA 4.0
2022-12-29T12:59:24.610
93093
2022-12-30T03:08:58.190
2022-12-30T03:08:58.190
7291
7291
93071
answer