私は現在、Allegroクロスプラットフォームライブラリを使用して、Cでインディーゲームの開発を始めています。プログラムの堅牢性を高めるために、入力、サウンド、ゲームエンジン、グラフィックスなどをそれぞれのスレッドに分離することにしました。マルチスレッドの経験がまったくないので、私の質問は次のとおりです。
メモリ内にデータのセクション(たとえば、データ構造へのポインター)がある場合、1つのスレッドが自由に書き込み、別のスレッドが自由に読み取ることができますか、それとも各スレッドがミューテックスを使用する必要がありますか?メモリをロックしてから読み取りまたは書き込みをしてからロックを解除するには?
特に、ゲームエンジンとビデオレンダラーの相互作用について考えていました。(これは2Dです。)私の計画は、エンジンがユーザー入力を処理し、スピーカーとモニターに供給される適切なオーディオとビデオを吐き出すことでした。画面に描画される次のビットマップへのグローバルポインタがあると思っていました。ゲームエンジンとレンダラーのコードは次のようになります。
ALLEGRO_BITMAP *nextBitmap;
boolean using;
void GameEngine ()
{
ALLEGRO_BITMAP *oldBitmap;
while (ContinueGameEngine())
{
ALLEGRO_BITMAP *bitmap = al_create_bitmap (width, height);
MakeTheBitmap (bitmap);
while (using) ; //The other thread is using the bitmap. Don't mess with it!
al_destroy_bitmap (nextBitmap);
nextBitmap = bitmap;
}
}
void Renderer ()
{
while (ContinueRenderer())
{
ALLEGRO_BITMAP *bitmap = al_clone_bitmap (nextBitmap);
DrawBitmapOnScreen (bitmap);
}
}
これは不安定なようです...への呼び出しで何かが起こるかもしれませんal_clone_bitmap
が、私はこのようなものを処理する方法がよくわかりません。ビットマップでミューテックスを使用しますが、ミューテックスはロックとロック解除に時間がかかるようです。これらのスレッド(特にゲームエンジンスレッド)の両方をできるだけ高速に実行したいと思います。条件と呼ばれるものについても読みましたが、条件がどのように適用可能または有用であるかは確かですが、まったくわかりません。誰かが私にミューテックスと条件(できればWindowsではなくPOSIX)に関するチュートリアルを教えてもらえますか?それで私はこれをすべて理解しようと試みることができますか?