⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 g02.htm

📁 一本介绍如何开发游戏,如何进行游戏编程的非常值得一看的好书.
💻 HTM
📖 第 1 页 / 共 5 页
字号:
<SCRIPT LANGUAGE="JavaScript" SRC="/-fs0/sys/pop-up.js"></SCRIPT><SCRIPT LANGUAGE="JavaScript" SRC="/-fs0/sys/pop-up-all.js"></SCRIPT><html><head><title>易都网--Windows游戏编程大师技巧</title><LINK rel="stylesheet" href="../../_public/javaa.css"><meta http-equiv="Content-Type" content="text/html; charset=GBK"><script language="JavaScript" src="../../_public/javaa.js"></script><meta name="keywords" content="Java,JSP,ASP,PHP,J2EE,EJB,JavaScript,C/C++,ASM,CSS,HTML,XML,网络安全,MySQL,ACCESS"></head><body bgcolor="#FFFFFF"><table border=0 cellpadding=0 cellspacing=0 width="100%">  <tbody>   <script language="javascript">print2()</script>  <tr>     <td width="100%">       <table bgcolor=#EEEEEE border=0 cellpadding=3 cellspacing=0 width="100%">        <tbody>         <tr>           <td class=f1 id=thetd width="100%">             <p>[<a href="index.html">目录</a>][<a href="g01.htm">上一页</a>][<a href="g03.htm">下一页</a>]</p>            <p align="center"><b>第二章 Windows编程模型</b></p>            <p>  Windows编程就像去看牙科医生:明知道对你有好处,但就是没有人乐意去。是不是这样?在本章中,我将要使用“禅”的方法——或者换句话说,就是深入浅出地向你介绍Windows编程基础。我可不能保证在阅读了本章后你就会“去见牙科医生”,但是我也保证你会比以往更喜欢Windows编程。下面是本章的内容:<br>                ·Windows的历史<br>                ·Windows的基本风格<br>                ·Windows的类<br>                ·创建Windows<br>                ·Windows事件句柄<br>                ·事件驱动编程和事件循环<br>                ·打开多个窗口</p>            <p> <b>Windows的历史</b></p>            <p>  读者可能会因为我要解放你的思想而感到十分恐惧(特别是钟情于DOS的顽固分子)。让我们迅速浏览一下Windows的发展历程以及与游戏发展的关系,好吗?</p>            <p> <b>早期的Windows版本</b></p>            <p>   Windows的发展始于Windows1.0版本。这是Microsoft公司在商业视窗操作系统的第一次尝试,当然是一个非常失败的产品。Windows1.0完全建立在DOS基础上(这就是一个错误),不能执行多任务,运行速度很慢,看上去也差劲。它的外观可能是其失败的最重要原因。除了讽刺以外,问题还在于Windows1.1与那个时代的80286计算机(或更差劲的8086)所能提供的相比需要更高的硬件、图像和声音性能。<br>                然而,Microsoft稳步前进,很快就推出了Windows2.0。我记得获得Windows2.0的测试版时我正在软件出版公司工作。在会议室中,挤满了公司的行政官员和董事长(像往常一样,他正拿着一不鸡尾酒)。我们运行Windows               2.0测试演示版,装载了多个应用程序,看上去似乎还在工作。但是,那IMB推出了PM。PM看上去要好得多,它是建立在比Windows2.0先进得多的操作系统OS/2的基础上的,而Windows               2.0依然是建立在DOS基础上的视窗管理器。那天会议室中的结论是“不错,但还不是一个可行的操作系统,如果我们仍然留恋在DOS上,那我还能有鸡尾酒喝吗?”</p>            <p><b>Windows 3.x</b></p>            <p>  1990年,终于发生了翻天覆地的变化,因为Windows 3.0出世了,而且其表现的确非常出色!尽管它仍然赶不上Mac OS的标准,但是谁还在意呢?(真正的程序员都憎恨Mac)。软件开发人员终于可以在PC机上创建迷人的应用程序了,而商用应用程序也开始脱离DOS。这成了PC机的转折点,终于将Mac完全排除在商用程序之外了,而后也将其挤出台式机出版业。(那时,Apple公司每5分钟就推出一种新硬件)。<br>                尽管Windows3.0工作良好,却还是存在许多的问题、软件漏洞,但从技术上说它已是Windows2.0之后的巨大突破,有问题也是在所难免。为了解决这些问题,Microsoft推出了Windows3.1,开始公关部和市场部打算称之为Windows4.0,但是,Microsoft决定只简单地称之为Windows3.1,因为它不足以称之为升级的换代版本。它还没有做到市场部广告宣传的那样棒。<br>                Windows3.1非常可靠。它带有多媒体扩展以提供音频和视频支持,而且它还是一个出色的、全面的操作系统,用户能够以统一的方式来工作。另外,还存在一些其他版本。如可以支持网络的Windows3.11(适用于工作的Windows)。唯一的问题是Windows3.1仍然是一个DOS应用程序,运行DOS扩展器上。</p>            <p><b>Windows95</b></p>            <p>  另一方面,游戏编程行业还在唱“DOS永存!”的赞歌,而我则已经开始热衷于使用Windows3.1。但是,1995年世界开始冷却——Windows95终于推出。它是一个真正32位的、多任务、多线程的操作系统。诚然,其中还残存一些16位代码,但在极大程度上,Windows95是PC机的终极度开发和发布平台。               <br>                (当然,Windows NT 3.0也同时推出,但是NT对于大多数用户来讲还是不可用的,因此这里也就不再赘述)。<br>                当Windows95推出后,我才真正开始喜欢Windows编程。我一直痛恨使用Windows1.0、2.0、3.0和3.1来编程,尽管随着每一种版本的推出,这种憎恨都越来越少。当Windows95出现时,它彻底改变了我的思想,如同其他被征服的人的感觉一样——它看上去非常酷!那正是我所需要的。<br>                提示:游戏编程行业中最重要的事情是游戏表现如何,游戏的画面如何,同时还要尽可能减轻审阅人的工作。<br>                因此几乎一夜间,Windows95就改变了整个计算机行业。的确,目前还有一些公司仍然在使用Windows3.1(你能相信吗?),但是Windows95使得基于Intel的PC成为除游戏之外 的所有应用程序的选择。不错,尽管游戏程序员知道DOS退出游戏编程行业只是个时间的问题了,但是DOS还是它们的核心。<br>                1996年,Microsoft公司发布了Game SDK(游戏软件开发工具包),这基本上就是DirectX的第一个版本。这种技术仅能在Window95环境下工作,但是它的确太慢了,甚至竞争不过DOS游戏(如DOOM和Duke               Nukem等)。游戏开发人员继续使用DOS32来开发游戏,但是他们知道DirectX具有足够快的速度,从而能使游戏能够流畅地运行在PC机上已为时不远。<br>                到了3.0版,DirectX的速度在同样计算机上已经和DOS32一样快了。到了5.0版,DirectX已经相当完美,实现了该技术最初的承诺。现在要意识到:Win32/DirectX是PC机上开发游戏的唯一方式。这是历史的选择。</p>            <p><b>Windows 98</b></p>            <p>  1998年中期,Windows 98推出了。这至多是一个改进的版本,而不像Windows95那样是一个换代的产品,但毫无疑问它也占有很重要的地位。Windows98像一辆旧车改装的高速汽车——实际上它是一头皮毛圆润光滑、脚力持久、飞奔跳动的驴。它是全32位的,能够支持你想做的所有事情,并具有无限扩充能力。它很好地集成了DirectX、3D图形、网络以及Internet。<br>                Windows98和Window95相比也非常稳定。当然Windows98仍然经常死机,但可以相信的是,这比Windows95少了许多。对即插即用支持得很好,并且能够很好地运行——这只是个时间问题。</p>            <p><b>Windows NT</b></p>            <p>  现在我们来讨论一下Windows NT。在本书编写期间,Windows NT正在推出5.0版本。我所能说的是,它最终将取代Windows               9X成为每个人的操作系统选择。NT要比Windows9X严谨得多;而且绝大多数游戏程序员都将在NT上开发游戏,这将使Windows               9X退出历史舞台。Windows NT 5.0最酷的是它完全支持即插即用和Win32/DirectX,因此使用DirectX为Windows               9X编写的应用程序可以在WindowsNT5.0或更高版本上运行。这可是个好消息。因为从历史上看,编写PC游戏的开发人员现在具有最大的市场潜力。<br>                那么最低标准是什么呢?如果你使用DirectX(或其他工具)编写了一个Win32应用程序,它完全可以在Windows 95、98、和NT               5.0或更高版本上运行。这可是件好事情。因此你在本书中所学到的任何东西至少可以应用到三种操作系统上,也可以运行于安装NT和DirectX的其他计算机上,如DEC的Alphas。还有Windows               CE——DirectX和Win32衍生的运行于其他系统上的操作系统。</p>            <p><b>Windows的基本风格:Win9X/NT</b></p>            <p>  和DOS不同,Windows是一个多任务的操作系统,允许许多应用程序和更小的程序同时运行,可以最大限度的发挥硬件的性能。这表明Windows是一个共享的环境——一个应用程序不可能独占整个系统。尽管Windows               95、98、和NT很相似,但仍然存在许多技术上的差别。但是就我们所涉及的,不可能去详细归纳。这里所参照的Windows机器一般是指Win9X/NT或Windows环境。让我们开始吧!             </p>            <p> <b>多任务和多线程</b></p>            <p>  如我所说,Windows允许不同的应用程序以轮流的方式同时执行,每一个应用程序都占用一段很短的时间段来运行,下一个应用程序轮换运行。如图2.1所示,CPU由几个不同的应用程序以轮流的方式共享。判断出下一个运行的应用程序、分配给每个应用程序的时间量是调度程序的工作。<br>                调度程序可以非常简单——每个应用程序分配固定的运行时间,也可以非常复杂——将应用程序设定为不同的优先级和抢先性或低优先级的事件。就WinX/NT而言,调度程序采用基于优先级的抢先占用方式。这就意味着一些应用程序要比其他的应用程序占用处理器更多的时间,但是如果一个应用程序需要CPU处理的话,在另一任务运行的同时,当前的任务可以被锁定或抢先占用。<br>                但是不要对此有太多的担心,除非你正在编写OS(操作系统)或实时代码——其细节事关重大。大多数情况下,Windows将执行和调度你的应用程序,无需你参与。<br>                深入接触Windows,我们可以看到,它不仅是多任务的,而且还是多线程的。这意味着程序由许多理简单的多个执行线程构成。这些线程(像更重要的进程)如程序一样被调度。实际上,在你的计算机上可同时运行30~50个线程,执行不同的任务。所以事实上你可能只运行一个程序,但这个程序由一个或多个执行线程构成。<br>                Windows实际的多线程示意图如图2.2所示,从图中可以看到,每一个程序实际上都是由一个主线程和几个工作线程构成。<br>              ————————————————<br>              ————————————————</p>            <p><b>获取线程的信息</b></p>            <p>  下面让我们来看一下你的计算机现在正在运行多少个线程。在Windows机器上,同时按Ctrl+ALt+Delete键,弹出显示正在运行的任务(过程)的当前程序任务管理器。这和我们所希望的不同,但也很接近。我们希望的是一个显示正在执行的实际线程数的工具或程序。许多共享软件和商用软件工具都能做到这一点,但是Windows内嵌了这几个工具。<br>                在安装Windows的目录(一般是Windows)下,可以发现一个名字为SYSMON.EXE(Windows 95/98)或PREFMON.EXE程序。图中除了正在运行的线程外还有大量的信息,如:内存使用和处理器装载等。实际上在进行程序开发时,我喜欢使SYSMON.EXE运行,由此可以了解正在进行什么以及系统如何加载程序。<br>                你可能想知道能否对线程的创建进行控制,答案是能够!!!实际上这是Windows游戏编程最令人激动的事情之一——就像我们所希望的那样除了游戏主进程外,还能够执行其他的任务,我们也能够创建像其他任务一样多的线程。<br>                注意:在Windows98/NT环境下,实际上还有一种叫fiber的新型执行对象,它比线程还简单(明白吗?线程是由fiber构成的)。<br>                这和DOS游戏程序的编写有很大不同。DOS是单线程操作系统,也就是说一旦你的程序开始运行,就只能运行该程序(不时出现的中断管理除外)。因此,如果想使用任何一种多任务或多线程,就必须自己来模拟(参阅《Sams               Teach Yourself Game Programming in 21 Days》中关于一个完整的基于DOS多任务核心部分)。这也正是游戏程序员在这么多年中所作的事。的确,模拟多任务和多线程远远不能和拥有一个完整的支持多任务和多线程的操作系统相提并论。但是对于单个游戏来讲,它足可以良好地工作。<br>                在我们接触到真正的Windows编程和那些工作代码之前,我想提及一个细节。你可能在想,Windows真是一个神奇的操作系统,因为它允许多个任务和程序立即执行。请记住,实际上并不是这样的。如果不有一个处理器的话。那么一次也只能执行一个执行流,线程、程序或你所调用的任何对象。Windows相互之间的切换太快了,以至于看上去就像几个程在同时运行一样。另一方面,如果有几个处理器的话,可以同时运行多个程序。例如,我有一个双CPU的PentiumⅡ处理器在运行WindowsNT5.0。使用这种配置,可以同时执行两个指令流。<br>                我希望在不远的将来,个人计算机的新型微处理器结构能够允许多个线程或fiber同时执行,将这样一个目标作为处理器设计的一部分。例如,Pentium具有两个执行单元——U管和V管。因此它能够立即执行两个指令。但是,这两个指令都是来自同一个线程,类似的是PentiumⅡ能够立即执行5个简单的指令,但也是来自同一个线程。</p>            <p><b>事件模型</b></p>            <p>  Windows是个多任务/多线程的操作系统,并且还是一个事件驱动的操作系统。和DOS程序不同的是,Windows程序都是等着用户去使用,由此而触发一个事件,然后Windows对该事件发生响应,进行动作。请看图2.4所示的示意图,图中描述了大量的应用程序窗口,每个程序都向Windows发送待处理的事件和消息。Windows对其中的一些进行处理,大部分的消息和事件被传递给应用程序来处理。<br>                这样做的好处是你不必去关心其他的正在运行的应用程序,Windows会为你处理它们。你所要关心的就是你自己的应用程序和窗口中信息的处理。这在Windows3.0/3.1中是根本不可能的。Windows的那些版本并不是真正的多任务操作系统,每一个应用程序都要产生下一个程序,也就是说,在这些版本的Windows下运行的应用程序感觉相当粗糙、缓慢。如果有其他应用程序干扰系统的话,这个正在“温顺地”运行的程序将停止工作。但这种情况在Windows9X/NT下就不会出现。操作系统将会适当的时间终止你的应用程序——当然,运行速度非常快,你根本就不会注意到。<br>                到目前为止,读者已了解了所有有关操作系统的概念。幸运的是,有了Windows这个目前最好的编写游戏操作系统,读者根本就不必担心程序调度——你所要考的就是游戏代码和如何最大限度地发挥计算机的性能。<br>                在本章后面内容中,我们要接触一些实际的编程工作,便于读者了解Windows编程有多容易。但是(永远都有但是)在进行实际编程之前我们应当了解一些Microsoft程序员喜欢使用的约定。这样你就不会被那些古怪的函数和变量名弄得不知所措。</p>            <p><b>按照Microsoft方式编程:匈牙利符号表示法</b></p>            <p>    如果你正在动作一个像Microsoft一样的公司,有几千个程序员都在干不同的项目,在某一点上就应当提出一个编写代码的标准方式。否则,结果将是一片混乱。因此一个名字叫Charles               Simonyi的人被委托创立了一套编写Microsoft代码的规范。这个规范已经用作编写代码的基本指导说明书。所有Microsoft的API、界面、技术文件等等都采用这些规范。<br>                这个规范通常被称为匈牙利符号表示法,可能是因为创立这个规范工作很长时间,弄得他饥肠辘辘的原因吧(英文中饥饿和匈牙利谐音),或者可能他是匈牙利人。对我们根本不知道,关键是你必须了解这个规范,以便于你能够阅读Microsoft代码。匈牙利符号表示法包括许多与下列命名有关的约定:<br>                ·变量<br>                ·函数<br>                ·类型和常量<br>                ·类<br>                ·参数<br>                表2.1给出了匈牙利符号表示法使用的前缀代码。这些代码在大多数情况下一半用于前缀变量名,其他约定根据名称确定。其他解释可以参考本表。</p>            <p>      <b>表2.1 匈牙利符号表示法的前缀代码指导说明书</b><br>                ━━━━━━┯━━━━━━━━━━━━━━━━━━━━━━━━<br>                前缀    │数据类型(基本类型)<br>                ──────┼────────────────────────<br>                c     │字符<br>                by    │字节(无符号字符)<br>                n     │短整数和整数(表示一个数)<br>                i     │整数<br>                x,y   │短整数(通常用于x坐标和y坐标)<br>                cx,cy │短整数(通常用于表示x和y的长度:c表示计数)<br>                b     │布尔型(整数)<br>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -