我目前正在開始使用Allegro跨平臺庫在C上進行獨立遊戲開發。我想我會將諸如輸入,聲音,遊戲引擎和圖形之類的東西分離到各自的線程中,以提高程序的穩健性。沒有多線程的經驗,我的問題是:多線程和互斥鎖
如果我在內存中有一段數據(比如指向數據結構的指針),一個線程可以隨意寫入,從中隨意讀取,還是每個線程都必須使用互斥鎖來鎖定內存,然後讀取或寫入,然後解鎖?
特別是,我在考慮遊戲引擎和視頻渲染器之間的交互。 (這是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
的電話中發生,但我不太確定如何處理這樣的事情。我會在位圖上使用互斥鎖,但互斥鎖似乎需要時間鎖定和解鎖,我希望這兩個線程(特別是遊戲引擎線程)儘可能快地運行。我也讀了一些叫做條件的東西,但我完全不知道一個條件如何適用或有用,儘管我確定它們是。有人能指點我一個關於互斥體和條件的教程(最好是POSIX,而不是Windows),所以我可以試着弄明白這一切嗎?
一些Allegro說明:Allegro已經在特定平臺所需的不同線程上運行各種組件。還要注意,給定顯示的所有繪圖操作都需要從創建顯示的同一個線程發生。如果從輔助線程加載位圖,則可以在顯示線程上調用'al_clone_bitmap()',但不應該在每個幀上都這樣做。國際海事組織,你不應該因爲使用更多線程的理由而釣魚。 – Matthew