サウンド再生スレッドを別スレッドにしてみた

公開:2012-05-06 18:25
更新:2020-02-15 04:37
カテゴリ:シューティングゲーム,c++/cx,windows store apps,アプリ・ライブラリ・言語,ゲーム,ゲーム製作

XAudio2によるサウンド再生部分を別スレッドにしてみた。スレッドはstd::threadを使用した。


GameMain::GameMain() 
  : backBufferViewPort_(0.0f,0.0f,BACKBUFFER_WIDTH,BACKBUFFER_HEIGHT),
   isDestroy_(false)
{
    // サウンド再生スレッドの開始
    soundThread_ = std::thread(
    [this]() -> void 
      {
          ExecuteSoundThread();
      }
    );
}

GameMain::~GameMain()
{
  // サウンド再生スレッドの停止
    isDestroy_ = true;
    if(soundThread_.joinable())
    {
        soundThread_.join();
    }
};

// サウンド再生スレッド
void GameMain::ExecuteSoundThread()
{
    sf::com_init comInit;
    soundDriver_.reset(new sf::SoundDriver());
    while(!isDestroy_)
    {
        Concurrency::wait(50);
        soundDriver_->Update();
        soundDriver_->Render();
    }
}

threadのコンストラクタに直接メンバ関数を指定せずlambdaをかませているのは、GameMainクラスがref classなので。ref classの場合メンバ関数ポインタをどう取得すればいいのかよくわからなかった。 std::thread(&GameClass::ExecuteSoundThread,this)だとコンパイルエラーとなる。ref classだとデリゲートがあるから関数ポインタなんてそもそも存在しないかもしれないね。それにしてもややこしい。。

サウンド再生スレッドは50msほどのスリープを入れて再生している。Metro StyleではSleepが使えないのでConcurrency::wait()で代用している。

ソースコード