|
《Windows游戏编程大师技巧》(第二版)第11章(21) 为何要在游戏中使用线程? 现在这个答案是非常明显的了。事实上,我想你随时都可以列出1000件可以用线程来做的事情。然而,假如你无法做到这一点(比如你刚刚从Mountain Dew(或Sobe,我最近爱上了它)的宿醉中醒过来),下面我列出一些用到多线程编程的地方: • 更新动画 • 产生环绕音响效果 • 控制小对象 • 查询输入设备 • 更新全局数据结构 • 创建弹出菜单和控件 上述最后一项是我经常使用的。在游戏正在运行的时候创建菜单并允许玩家改变设置,这一直是令人头疼的事。但是用线程处理起来就简单多了。 到目前为止,我依然没有回答为什么要在游戏编程中使用线程而不使用一个庞大循环和函数调用这个问题。的确,线程完成的工作它们也能完成,但当你所创建的面向对象的程序越来越大,达到一定程度时,你就需要提出类似于自动机(Automaton)的结构。这些便是代表游戏角色的对象——你希望在创建和销毁的时候对游戏主循环没有逻辑副作用。这可以通过C++类并结合多线程编程来实现。 在开始你的第一个多线程程序前,让我们搞清楚一下事实:在单处理器机器上,一次只能运行一个线程。所以天下并没有免费的午餐,但毕竟这是适应软件的方法学,因此确保你是为了简便性和正确性而进行多线程编程。图11-17表示了一个主进程和三个线程同时执行的情况。 图11-17:主进程产生三个子线程 图中的时间表明了不同的线程对处理器的占用时间,单位是毫秒。如你所见,一次只有一个线程在运行,但它们可以打乱顺序运行,并根据优先级高低来确定运行时间。 前戏足够了。让我们看一些代码吧! 取得一个线程 在下面的例子中,你将使用控制台模式程序。再次强调,请正确地编译这些程序。(我已不堪多言,因为我每小时要收到30~60封来自我写的几本书的读者的有关错误使用VC++编译器的电子邮件。难道就没有人读前言吗?) 还有一条告诫是:对于这些例子,你必须使用支持多线程的库(Multithreaded Library)。进入MS DEV Studio的主菜单,选择Project、Setting,在C++表栏的Category: Code Generatrion选项里,将Use Run-time Library设置为Multithreaded。如图11-18所示。此外,确保将优化(Optimization)选项设为off。因为有时候该选项会影响多线程同步代码,所以最好将其关掉以防不测。 图11-18:使用多线程库创建一个控制台应用程序 注意 我有一种似曾相识的感觉。真的是似曾相识吗?还是随机的假象? 如果你没有这种感觉,你就不会知道你没有的是什么,那样倒也无所谓。:) 一切就绪,让我们开始吧。创建一个线程很简单,而防止其被损坏才是困难的部分!Win32 API调用的格式如下: HANDLE CreateThread( LPSECURITY_ATTRIBUTES lpThreadAttributes, // pointer to thread security attributes DWord dwStackSize, // initial thread stack size, in bytes LPTHREAD_START_ROUTINE lpStartAddress, // pointer to thread function LPVOID lpParameter, // argument for new thread DWORD dwCreationFlags, // creation flags
|