本书是“游戏编程精粹”系列丛书的第二本,包括70多篇全新的、探讨各种游戏编程主题的文章,每篇文章要么提供了某个编程问题的实用解决方案,要么提出了一种创造性的减少编程时间和冗余的方法。本书涵盖了开发最尖端的游戏引擎所涉及的主要主题,全书由6章组成,包括通用编程技术、数学技巧、人工智能、几何体管理、图形显示和音频编程。
\r\n 专家级开发人员可以立刻应用书中介绍的技巧,而初中级程序员通过阅读本书将增强其技能和知识。这是一本必备的参考资料,是40多位经验丰富的游戏开发人员智慧和经验的结晶。
第1章 通用编程技术\r\n 绪论\r\n Scott Bilas\r\n 1.1 优化C++游戏\r\n Andrew Kirmse\r\n 1.1.1 对象的创建和销毁\r\n 1.1.2 内存管理\r\n 1.1.3 虚拟函数\r\n 1.1.4 代码长度\r\n 1.1.5 标准模板库\r\n 1.1.6 高级特性\r\n 1.1.7 参考文献\r\n 1.2 内联函数和宏\r\n Peter Dalton\r\n 1.2.1 内联函数的优点\r\n 1.2.2 何时使用内联函数\r\n 1.2.3 何时使用宏\r\n 1.2.4 微软特有的情况\r\n 1.2.5 参考文献\r\n 1.3 抽象接口编程\r\n Noel Liopis\r\n 1.3.1 抽象接口\r\n 1.3.2 添加一个工厂(factory)\r\n 1.3.3 抽象接口特性\r\n 1.3.4 一切都是有代价的\r\n 1.3.5 结论\r\n 1.3.6 参考文献\r\n 1.4 从DLL中导出C++类\r\n Herb Marselas\r\n 1.4.1 导出函数\r\n 1.4.2 导出类\r\n 1.4.3 导出类成员函数\r\n 1.4.4 导出虚拟类成员函数\r\n 1.4.5 总结\r\n 1.5 避免DLL困境\r\n Herb Marselas\r\n 1.5.1 显式链接还是隐式链接\r\n 1.5.2 LoadLibrary和GetProcAddress\r\n 1.5.3 提防DirectX\r\n 1.5.4 使用操作系统特有的特性\r\n 1.5.5 总结\r\n 1.6 动态类型信息\r\n Scott Wakeling\r\n 1.6.1 动态类型信息类简介\r\n 1.6.2 暴露和查询DTI\r\n 1.6.3 继承的含义是“是一个”\r\n 1.6.4 处理通用对象\r\n 1.6.5 实现永久性类型信息\r\n 1.6.6 将永久性类型信息用于游戏保存数据库中\r\n 1.6.7 结论\r\n 1.6.8 参考文献\r\n 1.7 用于通用C++成员访问的属性类\r\n Charles Cafrelli\r\n 1.7.1 代码\r\n 1.7.2 其他用途\r\n 1.7.3 推荐读物\r\n 1.8 一个游戏实体工厂\r\n Franois Dominic Laramée\r\n 1.8.1 组件\r\n 1.8.2 flyweight类、行为类和导出类\r\n 1.8.3 flyweight对象\r\n 1.8.4 SAMMy,你在哪里?\r\n 1.8.5 行为类层次\r\n 1.8.6 使用模板方法模式来完成行为任务\r\n 1.8.7 导出类\r\n 1.8.8 实体工厂\r\n 1.8.9 在运行阶段选择策略\r\n 1.8.10 最后的注意事项\r\n 1.8.11 参考文献\r\n 1.9 在C++添加摒弃功能\r\n Noel Llopis\r\n 1.9.1 可能的解决方案\r\n 1.9.2 理想的解决方案\r\n 1.9.3 使用和指定被摒弃的函数\r\n 1.9.4 使用C++实现摒弃功能\r\n 1.9.5 可改进的地方\r\n 1.9.6 致谢\r\n 1.9.7 参考文献\r\n 1.10 一个插入式调试内存管理器\r\n Peter Dalton\r\n 1.10.1 内存管理器初步\r\n 1.10.2 内存管理器的记录工作\r\n 1.10.3 报告信息\r\n 1.10.4 注意事项\r\n 1.10.5 进一步的改进\r\n 1.10.6 参考文献\r\n 1.11 一个内置的游戏剖析模块\r\n Jeff Evertt\r\n 1.11.1 有关剖析的基本知识\r\n 1.11.2 商用工具\r\n 1.11.3 为何要自己开发模块\r\n 1.11.4 剖析模块(Profiling module)的需求\r\n 1.11.5 架构和实现\r\n 1.11.6 实现的细节\r\n 1.11.7 分析数据\r\n 1.11.8 有关实现的注意事项\r\n 1.12 用于Windows游戏的线性编程模型\r\n Javier F. Otaegui\r\n 1.12.1 更新背景\r\n 1.12.2 解决方案:多线程(Multithreading)\r\n 1.12.3 参考文献\r\n 1.13 栈缠绕\r\n Bryon Hapgood\r\n 1.13.1 简单的TempRet\r\n 1.13.2 TempRet链\r\n 1.13.3 Thunking\r\n 1.13.4 递归\r\n 1.14 自我修改的代码\r\n Bryon Hapgood\r\n 1.14.1 RAM代码的原理\r\n 1.14.2 一个快速的Bit Blitter\r\n 1.15 使用资源文件来管理文件\r\n Bruno Sousa\r\n 1.15.1 何为资源文件\r\n 1.15.2 设计\r\n 1.15.3 实现\r\n 1.15.4 有关实现的最后一些说明\r\n 1.15.5 结论\r\n 1.15.6 参考文献\r\n 1.16 游戏输入的记录和重放\r\n Bruce Dawson\r\n 1.16.1 记录输入有何用途\r\n 1.16.2 原理\r\n 1.16.3 测试输入记录功能\r\n 1.16.4 结论\r\n 1.16.5 参考文献\r\n 1.17 一个灵活的文本分析系统\r\n James Boer\r\n 1.17.1 分析系统\r\n 1.17.2 宏、头文件和预处理技术\r\n 1.17.3 该分析系统的结构\r\n 1.17.4 小结\r\n 1.18 一个通用的调节器\r\n Lasse Staff Jensen\r\n 1.18.1 需求分析\r\n 1.18.2 实现\r\n 1.18.3 使用\r\n 1.18.4 图形用户界面\r\n 1.18.5 附注\r\n 1.18.6 致谢\r\n 1.19 生成真正的随机数\r\n Pete Isensee\r\n 1.19.1 伪随机\r\n 1.19.2 真正随机\r\n 1.19.3 随机输入源\r\n 1.19.4 硬件源\r\n 1.19.5 混合函数\r\n 1.19.6 局限性\r\n 1.19.7 实现\r\n 1.19.8 GenRand的随机程度\r\n 1.19.9 参考文献\r\n 1.20 使用Bloom过滤器来提高计算性能\r\n Mark Fischer\r\n 1.20.1 Bloom的方式\r\n 1.20.2 可能的情形\r\n 1.20.3 工作原理\r\n 1.20.4 定义\r\n 1.20.5 范例1\r\n 1.20.6 范例2\r\n 1.20.7 最后的说明\r\n 1.20.8 结论\r\n 1.20.9 参考文献\r\n 1.21 3Ds MAX中的Skin导出器和动画工具包\r\n Marco Tombesi\r\n 1.21.1 导出\r\n 1.21.2 参考文献\r\n 1.22 在视频游戏中使用Web摄像机\r\n Nathan d''Obrenan\r\n 1.22.1 初始化Web摄像机捕获窗口\r\n 1.22.2 操纵Web摄像机数据\r\n 1.22.3 结论\r\n 1.22.4 参考文献\r\n第2章 数学技巧\r\n第3章 人工智能\r\n第4章 几何体管理\r\n第5章 图形显示\r\n第6章 音频编程
Mark Deloura是Game Developer杂志的主编,也是《游戏编程精粹1》和《游戏编程精粹2》的编辑。加入Game Developer之前,Mark在任天堂(美国)公司工作过5年,担任开发人员关系小组的主力软件工程师,从事Gamecube和Nintendo 64开发。在此之前,Mark还从事过虚拟现实方面的研究,是多个Usene虚拟现实新闻组的主持人之一。
欢迎阅读《游戏编程精粹2》. 本书精选了70篇讨论各种游戏编程主题的文章, 读者可将其中阐述的技术直接应用到游戏中. 能给读者呈现一本这样的图书, 我感到自豪.
开始策划该书时, 我的目标就是确保其内容尽可能地精彩而实用. 我不希望本书是一本充斥着理论或过时信息的图书, 因此, 在组织本书时, 我没有闭门造车, 而是邀请专家担任各章的责任编辑, 由他们负责挑选探讨相关主题的文章. 所幸的是, 给《游戏编程精粹1》撰过稿的很多开发人员都有意负责本书某章的组稿工作.
下面是本书各章的责任编辑. 他们工作繁忙, 但为确保每篇文章都值得阅读付出了大量的心血.
● 通用编程技术:Gas Powerd Games公司的Scott Bilas:
● 数学技巧:Naughty Dog公司的Eddie Edwards,
● 人工智能:任天堂(美国)公司的Steve Rabin,
● 几何体管理:C4 Engine公司的Eric Lengyel;
● 图形显示:Nvidia公司D.Sim Dietrich Jr.;
● 音频编程:Lithtech公司的James Boer.
幕后故事
组织《游戏编程精粹1》时, 我还是任天堂(美国)公司的主力软件工程师. 我很灰心, 游戏行业的公司都在制定封闭的标准. 创建封闭的API. 申请软件专利, 在自己和他人之间砌起一道无形的墙. 坦率地说, 我对整个行业极其失望. 在给出版社发送《游戏编程精粹1》稿件的前一天的凌晨3点, 我再次阅读了刚完稿的"前言". 我在其中写道, 制定开放标准并同行业中的其他人共享知识非常重要. 就在这一刻, 我意识到了自己希望致力于促进知识在游戏业中的传播, 而不是宣传另一个专用标准的强烈愿望.
不久后, 经过同E3的一次独特合作和多次深入交流后, 我决定接受Game Developer杂志的主编职务. 现在, 我每月都给读者呈上几篇精彩的文章!《游戏编程精粹2》的构思
正如前面指出的, 本书是本人同6位责任编辑合作的结晶. 我们旨在确保每章的内容对专家级游戏开发人员来说都颇有参考价值. 如果读者是初中级游戏开发人员, 请仔细阅读书中的文章, 学习其中的技巧:如果需要更详细了解某个主题, 可阅读相应的参考文献. 书中的很多文章只对复杂的技巧做了概要性的介绍, 但提供了参考文献, 读者可通过这些参考文献更深入地了解相应的主题. 当然, 网上有很多不错的游戏开发资源, 其中包括gamasutra. com. flipcode. com和gamedev. net.
我需要强调的一点是本书中APl的使用. 在《游戏编程精粹1》中, 所有的文章使用的都是C/C++和Open GL, 旨在确保代码能够在当前的各种系统上运行. 本书后退了一步. 由于当前的游戏平台非常多(包括游戏控制台. 计算机. 手持设备. Web和无线设备), 要编写能够在所有平台上运行的代码几乎是项无法完成的任务. 然而, 对于任何称职的开发人员来说, 有些语言和API是必须熟知的, 这包括C. C++. x86汇编语言(如果您是PC引擎程序员). OpenGL和Direct3D(如果您是3D程序员). 您可能还应该精通Java和一些脚本编写语言. 我们假设作为专家级游戏开发人员的读者在理解这些语言时不会有任何困难, 书中的有些地方可能还会超过以上的知识范围.
游戏行业
多年来, 游戏开发行业一直呈稳定增长的态势. 我们喜欢引用的一项统计数据是:在美国, 游戏行业的收入已超过了电影业. 这样的成绩好像是令人高兴的, 我们应暂时放下手中的编程工作, 为此狂欢. 但是别忘了, 电影票的平均价格是8美元, 而每个游戏软件差不多要40美元!因此, 实际上游戏玩家的人次只有电影观众的五分之一.
游戏行业的增长空间还很大. 将最新的Miyamoto游戏下载到宽带机顶盒中并同地球另一边的朋友一起玩的日子还未到来. 然而, 这指日可待. 也许是几年后, 这将打开通向各种新娱乐方式的大门.
世界各地的人都在玩游戏和做游戏. 我收到的来信中, 有的来自俄罗斯. 克罗地亚. 澳大利亚. 新西兰. 巴西. 欧洲和北美地区的开发人员. 游戏已成为一种全球景象, 人们通过共同的体验走到一起. 当您设计下一个游戏时, 不仅应考虑跨平台的兼容性, 还应考虑跨文化的兼容性!
随着游戏在全球的影响越来越大, 我们需要注意的一个问题是, 由于游戏玩家已非常多, 游戏已引起了文化监察人员的注意. 每当"问题少年"实施暴力犯罪时, 我们都"荣幸"地位列在某种程度上必须对此负责的媒体之一:电影. 电视. 音乐和游戏. 这虽然令人不快, 但它表明游戏已成为公众的话题之一:游戏不再只是供小孩玩的东西, 而是一种真正的艺术形式, 因此同其他艺术形式一样, 游戏也是被监督的对象.
媒体中的暴力是否会增强人们的暴力倾向这一问题也许永远不会有答案, 但在公众看来, 答案是肯定的. 作为一个对此负有责任的行业, 我们力所能及的重要工作之一就是提倡公众接受ESRB分级制度, 让父母能够选择孩子该玩什么样的游戏, 进而担负起他们应付的责任.
当然, 通过玩游戏确实能够学到一些知识, 否则, 玩家如何能够通过第20级中的怪物把守的关口?玩家学到的知识随游戏而异. 随着游戏与现实世界越来越接近, 玩家在游戏中受教育的可能性也越来越大. 您将教给玩家什么样的知识?
开放标准
当前, 语言和API越来越多, 其中很多是专用的, 这是最令我沮丧的事情之一. 独立开发人员在选择平台时面临的挑战日益严峻, 因为难以获得准确的有关开发软件包的信息. 游戏行业中对开发系统保密的潮流让我难以理解.
在PC上, 这不是什么大问题. 在PC上面, 系统正越来越开放. 然而, 令人惊讶的是, 大多数技术创新是在PC上进行的. 几个最新的游戏在发布后便立刻公开了源代码.
几年前, 哈佛商学院对施乐PARC的研究人员进行了一项调查. 调查旨在找到确保研究人员成功的最重要的品质, 结果发现交流和共享信息的能力是确保成功最重要的品质之一. 离群索居的研究人员可能干得不错, 但真正卓越的研究人员都有丰富的专业网, 经常同其他人员交流.
上述调查结果也适用于游戏行业. 当前, 一些最成功的游戏开发公司都公开其游戏, 同每一个人交流. 他们公开游戏源代码. 关卡编辑工具和API, 他们在游戏开发人员会议中发表演讲. 他们的游戏玩家得以创建如梦如幻的新关卡和游戏风格(mod), 而求知若渴的游戏开发人员得以向专家学习. 通常, 人们认为公开意味着失去, 但在游戏行业, 将您的知识产权公开, 也许是您能做出的最为明智的决策之一. 如果能让游戏玩家成为游戏开发人员, 无疑是个多赢的结局.