我目前正在开始使用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