Blue Flower

游戏编程权威指南 第4版是一本经典的游戏编程入门读物,由美国程序员麦克沙福瑞和格雷海姆两人共同编著。本书探讨了整个游戏开发过程和与创建游戏相关的挑战。在对游戏框架的介绍中,作者探讨了现代游戏引擎的主要子系统以及可用于实际游戏中的专业技术。全书内容包括可以帮助你组装编程工具箱的游戏开发基础知识;可靠、可运行的代码示例;核心游戏技术,例如3D编程、脚本和游戏音频;高级话题和游戏AI、网络编程、C#工具等技术。第4版还扩充了前一版的章节,添加了游戏主体、AI、着色器编程、Lua脚本、C#编辑器和其他重要的更新。所有的代码和示例都经过了仔细的测试,可以用于商业级游戏中,欢迎游戏架构设计人员阅读。
202209171944274003570000

内容介绍

游戏编程的用户需求和发展速度近年来很快,阅读游戏开发类图书的需求也越来越大。本书是一本游戏开发指南,是开发、部署、运行商业游戏的读物。
《游戏编程权威指南 第4版》分为4个部分共24章。首部分是游戏编程基础,主要介绍了游戏编程的定义、游戏架构等基础知识。第二部分是让游戏跑起来,主要介绍了初始化和关闭代码、主循环、游戏主题和用户界面等。第三部分是核心游戏技术,主要介绍了一些更为复杂的代码示例,如3D编程、游戏音频、物理和AI编程等。第四部分是高级知识和综合应用,主要介绍了网络编程、多道程序设计和用C#创建工具等,并利用前面所讲的知识开发出一款简单的游戏。本书适合游戏开发人员、游戏架构设计人员和游戏引擎用户参考阅读,也适合想要进入游戏开发领域的读者阅读。
202209171944276782780001

章节目录

第1章 什么是游戏编程 11.1 好的方面 11.1.1 工作 21.1.2 游戏玩家 21.1.3 同事 31.1.4 工具—软件开发工具包(SDK) 41.1.5 硬件 51.1.6 平台 61.1.7 展会 91.2 不好的地方 91.2.1 游戏编程很难 101.2.2 零碎文件 101.2.3 那不是bug—而是特性 111.2.4 工具 121.3 黑暗的一面 131.3.1 命中移动的目标 131.3.2 加班模式(和加班大餐) 131.3.3 呸!胡扯 151.3.4 操作系统地狱 151.3.5 雇员流动的性质 161.4 这一切都是值得的,对吗 16第2章 游戏中有什么 182.1 游戏架构 182.2 使用游戏架构 202.3 应用层 222.3.1 读取输入 222.3.2 文件系统和资源缓存 222.3.3 内存管理 232.3.4 初始化、主循环和关闭 232.3.5 其他应用层代码 242.4 游戏逻辑 252.4.1 游戏状态和数据结构 252.4.2 物理学和碰撞 262.4.3 事件 262.4.4 进程管理器 272.4.5 命令解释器 282.5 人类玩家的游戏视图 282.5.1 图形显示 292.5.2 音频 302.5.3 用户界面表示 312.5.4 进程管理器 312.5.5 选项 312.5.6 多人游戏 312.6 AI代理的游戏视图 312.7 网络游戏架构 322.7.1 远程游戏视图 332.7.2 远程游戏逻辑 332.8 必须使用DirectX吗 342.8.1 DirectX的设计理念 342.8.2 Direct3D或OpenGL 352.8.3 DirectSound还是 352.8.4 DirectInput或自己实现 362.9 其他内容 362.10 补充书目 36第3章 拯救了我的编码趣闻和风格 373.1 通用编码风格 383.1.1 大括号 383.1.2 一致性 393.2 智能代码设计实践 403.2.1 避免隐藏代码和重要操作 413.2.2 类结构:保持简单 423.2.3 继承VS.组合 423.2.4 变坏的虚函数 433.2.5 使用接口类 443.2.6 考虑使用工厂 453.2.7 封装变化的组件 463.2.8 使用流来初始化对象 463.3 智能指针和裸指针 473.3.1 引用计数 483.3.2 C++的shared_ptr 493.4 正确使用内存 523.4.1 了解不同类型的内存 533.4.2 优化内存访问 553.4.3 内存对齐 563.4.4 虚拟内存 573.4.5 编写自己的内存管理器 583.5 各种有用的东西 593.5.1 一个很棒的随机数生成器 603.5.2 集合的伪随机遍历 613.5.3 内存池 623.6 开发出适合自己的风格 673.7 补充书目 68第4章 生成游戏 694.1 一个小动机 694.2 创建项目 704.2.1 生成配置 704.2.2 创建坚不可摧的 结构 714.2.3 将游戏引擎和工具放在何处 734.2.4 设置Visual Studio生成选项 744.2.5 多平台项目 764.3 源代码库和版本控制 774.3.1 微软Visual SourceSafe的相关历史 794.3.2 Subversion和TortoiseSVN 794.3.3 Perforce软件的Perforce 804.3.4 Avid的AlienBrain 814.3.5 使用源代码控制分支 814.4 生成游戏:一门黑色艺术 844.4.1 自动化生成 854.4.2 生成计算机 854.4.3 自动化生成脚本 854.5 创建生成脚本 874.5.1 标准生成 874.5.2 里程碑生成 884.5.3 多个项目和共享代码 904.5.4 最后的建议 91第5章 游戏初始化和关闭 925.1 初始化101 925.2 C++初始化的一些陷阱 935.3 游戏的应用层 955.3.1 WinMain:Windows入口点 955.3.2 应用层:GameCodeApp 975.3.3 InitInstance():检查系统资源 975.3.4 检查游戏的多个实例 985.3.5 检查硬盘空间 995.3.6 检查内存 995.3.7 计算CPU速度 1005.3.8 你拥有的是个垃圾袋吗 1015.3.9 初始化资源缓存 1015.3.10 加载文本字符串 1025.3.11 脚本管理器和事件系统 1045.3.12 初始化DirectX并创建 窗口 1045.3.13 创建游戏逻辑和游戏视图 1055.3.14 设置游戏保存 1055.3.15 预加载从缓存中选定的 资源 1065.4 收尾工作:干净漂亮地退出 1075.4.1 我怎样才能离开呢 1075.4.2 强制关闭模态对话框 1095.4.3 关闭游戏 1105.4.4 游戏机怎么样 1105.5 进入和退出 111第6章 游戏主体和组件架构 1126.1 初次尝试创建游戏主体 1126.2 组件架构 1156.3 创建主体和组件 1166.4 定义主体和组件 1206.5 存储并访问主体 1226.6 将它们组合起来 1236.7 数据共享 1246.7.1 直接访问 1256.7.2 事件 1256.7.3 两全其美 126第7章 主循环的控制 1277.1 组织主循环 1277.1.1 硬编码的更新 1277.1.2 多线程主循环 1287.1.3 一种混合技术 1297.1.4 简单的协同式多任务处理器 1317.1.5 非常简单的进程示例:DelayProcess 1357.1.6 Process派生类的使用 1377.2 良好地适应操作系统 1377.3 使用DirectX 11框架 1387.3.1 渲染和呈现显示 1387.3.2 用于更新和渲染的回调函数 1397.4 我现在可以制作游戏了吗 141第8章 游戏数据的加载与缓存 1428.1 游戏资源:格式和存储要求 1438.1.1 3D对象网格和环境 1438.1.2 动画数据 1458.1.3 地图/关卡数据 1468.1.4 纹理数据 1468.1.5 位图颜色深度 1478.1.6 声音和音乐数据 1498.1.7 视频和预渲染的过场动画 1508.2 资源文件 1528.2.1 将资源打包到一个文件中 1538.2.2 打包资源的其他好处 1538.2.3 数据压缩和性能 1548.2.4 Zlib:开源压缩 1548.3 资源高速缓存 1588.3.1 IResourceFile接口 1618.3.2 ResHandle:跟踪加载的资源 1618.3.3 IResourceLoader接口和DefaultResourceLoader 1638.3.4 ResCache:简单的资源高速缓存 1638.3.5 将资源缓存入DirectX等 1698.3.6 世界设计和高速缓存预测 1708.4 我的缓存不够用了 173第9章 输入设备编程 1749.1 获取设备状态 1749.2 使用XInput或DirectInput 1779.3 一些安全提示 1799.4 使用双轴控制器 1829.4.1 捕获桌面上的鼠标 1829.4.2 使用鼠标拖拽 1849.5 使用游戏控制器 1869.5.1 非灵敏区 1879.5.2 正常输入 1899.5.3 单杆、双杆、红色拉杆和蓝色拉杆 1909.5.4 增加控制值 1909.6 使用键盘 1919.6.1 Mike的键盘窥探器 1919.6.2 GetAsyncKeyState()和其他函数 1959.6.3 处理Windows中的Alt键 1959.7 什么?没有跳舞毯 195第10章 用户界面编程 19710.1 DirectX的文本助手和对话框资源管理器 19710.2 人类的游戏视图 19810.3 WASD移动控制器 20610.4 屏幕元素 20810.5 自定义的MessageBox对话框 21010.6 模态对话框 21510.7 控件 21810.8 控件识别 21910.9 命中测试和焦点顺序 22110.10 控件状态 22210.11 更多控件属性 22310.11.1 热键 22310.11.2 工具提示 22310.11.3 上下文相关帮助 22410.11.4 可拖拽 22410.11.5 声音和动画 22410.12 最后的用户界面提示 225第11章 游戏事件管理 22611.1 游戏事件 22611.1.1 事件和事件数据 22711.1.2 事件监听器委托 23011.1.3 事件管理器 23111.1.4 示例:将所有内容整合在一起 23811.2 哪些游戏事件是重要的 23911.3 事件和进程的区别 24111.4 补充书目 241第12章 使用Lua编写脚本 24212.1 游戏编程语言的简史 24212.1.1 汇编语言 24312.1.2 C/C++ 24412.1.3 脚本语言 24512.2 使用脚本语言 24612.2.1 快速原型法 24612.2.2 专注于设计 24712.2.3 速度和内存成本 24712.2.4 它们之间的界限是什么 24712.3 脚本语言集成策略 24812.3.1 自己进行编写 24812.3.2 使用现有的语言 24812.3.3 选择一种脚本语言 24912.3.4 Python 24912.3.5 Lua 24912.4 Lua速成课程 25012.4.1 注释 25012.4.2 变量 25012.4.3 函数 25212.4.4 表 25312.4.5 流程控制 25512.4.6 操作符 25712.4.7 接下来是什么 25712.5 Lua中的面向对象编程 25812.5.1 元表 25912.5.2 创建一个简单的类抽象 26112.6 内存管理 26312.7 将Lua绑定到C++ 26312.7.1 Lua C API 26312.7.2 tolua++ 26312.7.3 luabind 26412.7.4 LuaPlus 26412.8 LuaPlus速成课程 26412.8.1 LuaState 26412.8.2 LuaObject 26512.8.3 表 26612.8.4 全局 26712.8.5 函数 26812.8.6 从Lua调用C++函数 26912.9 将所有内容整合在一起 27112.9.1 管理Lua状态 27112.9.2 脚本导出 27312.9.3 进程系统 27412.9.4 事件系统 28212.9.5 脚本组件 28712.10 Lua开发和调试 28912.11 结语 28912.12 补充书目 289第13章 游戏音频 29013.1 声音的工作原理 29013.1.1 数字录音和重现 29113.1.2 声音文件 29313.1.3 线程和同步的简介 29313.2 游戏语音系统架构 29413.2.1 声音资源和句柄 29513.2.2 IAudioBuffer接口和AudioBuffer类 30313.2.3 IAudio接口和Audio类 30513.2.4 DirectSound实现 30813.2.5 声音进程 31713.2.6 启动音效 32113.3 其他技术难题 32213.3.1 声音和游戏对象 32213.3.2 定时和同步 32213.3.3 混合问题 32413.4 一些随记 32613.4.1 数据驱动的声音设置 32613.4.2 背景环境声音和音乐 32713.4.3 语音 32813.5 结语 330第14章 3D图形基础 33114.1 3D图形流水线 33114.2 3D数学101 33214.2.1 坐标和坐标系 33314.2.2 向量数学 33514.3 C++数学类 34014.3.1 向量类 34014.3.2 矩阵数学 34114.3.3 四元数数学 35114.3.4 变换 35814.3.5 几何体 36014.3.6 光照、法线和颜色 36114.3.7 材质 36314.3.8 贴有纹理的顶点 36514.3.9 纹理 36514.3.10 二次采样 36514.3.11 mip映射 36714.3.12 ID3D11Device和ID3D11DeviceContext简介 36714.3.13 在D3D11中加载纹理 36814.3.14 三角形网格 37014.4 你还在吗 373第15章 3D顶点和像素着色器 37415.1 顶点着色器和着色器语法 37515.2 编译顶点着色器 37915.3 顶点着色器的C++辅助类 38015.4 像素着色器 38615.5 像素着色器的C++辅助类 38715.6 使用着色器辅助类进行渲染 39015.7 着色器—这只是一个开始 39115.8 补充书目 391第16章 3D场景 39216.1 场景图基础 39216.1.1 ISceneNode接口类 39216.1.2 SceneNodeProperties和 RenderPass 39416.1.3 SceneNode—一切都是从这里开始的 39616.1.4 Scene类 40116.2 特殊的场景图节点 40816.2.1 独立渲染通道的实现 40816.2.2 一个简单的摄像机 41116.2.3 在场景中放入灯光 41316.2.4 天空的渲染 41616.2.5 在场景中使用网格 42016.3 遗漏的内容 42416.4 还没满足 42516.5 补充书目 425第17章 碰撞和简单的物理学 42617.1 物理学中的数学知识 42717.1.1 米、英尺、肘尺还是Kellicam 42717.1.2 距离、速度和加速度 42717.1.3 质量、加速度和力 42817.1.4 转动惯量、角速度和扭矩 43117.1.5 距离和交集的计算 43117.2 选择一种物理SDK 43217.3 对象属性 43417.4 碰撞体 43517.4.1 良好的碰撞几何体的要求 43617.4.2 可见几何体VS碰撞几何体 43717.4.3 人类角色的碰撞体 43717.4.4 特殊对象:楼梯、门道和树 43917.5 碰撞系统的使用 43917.6 集成一个物理SDK 44117.6.1 Bullet SDK的组件 44417.6.2 初始化 44517.6.3 关闭 44617.6.4 物理系统的更新 44717.6.5 创建简单的物理对象 44917.6.6 凸面网格的创建 45117.6.7 触发器的创建 45217.6.8 力和力矩的应用 45317.6.9 物理调试渲染器 45417.6.10 接收碰撞事件 45517.6.11 物理SDK集成的最后内容 45717.7 等一下,我还有话要说 458第18章 游戏AI简介 45918.1 AI技术 45918.1.1 硬编码AI 46018.1.2 随机化 46118.1.3 加权随机 46218.2 有限状态机 46318.3 决策树 46718.4 模糊逻辑 47118.5 效用理论 47418.6 以目标为导向的行动计划 47718.7 路径查找 47818.7.1 A* (A-Star) 47918.7.2 动态规避 48118.8 补充书目 482第19章 多玩家游戏的网络编程 48319.1 互联网的工作原理 48319.1.1 Winsock还是Berkeley 48419.1.2 Internet地址 48419.1.3 域名系统 48619.1.4 有用的程序和文件 48719.2 套接字API 48819.2.1 套接字效用函数 48819.2.2 域名服务(DNS)函数 49019.2.3 套接字初始化和关闭 49119.2.4 创建套接字和设置套接字选项 49119.2.5 服务器函数 49519.2.6 套接字读取和写入 49819.3 使用套接字制作一款多玩家游戏 49919.3.1 数据包类 50019.3.2 核心套接字类 50119.3.3 用于监听的套接字类 50619.3.4 套接字管理器类 50819.4 核心客户端类 51519.5 核心服务器端类 51619.6 将套接字连接到事件系统中 51719.7 如果真的这么简单就好了 522第20章 多道程序设计简介 52320.1 多道程序设计是什么 52320.2 创建线程 52520.3 进程同步 52720.3.1 测试与置位、信号量和互斥 52820.3.2 Windows临界区 52820.4 有趣的线程问题 53020.5 线程安全 53120.6 GameCode4中的多线程类 53120.6.1 RealtimeProcess类 53220.6.2 从实时进程发送事件 53420.6.3 接收实时进程中的事件 53720.7 Zip文件的后台解压缩 53820.8 进一步工作 54020.9 关于硬件 54120.10 关于未来 54120.11 补充书目 542第21章 “茶壶大战”游戏 54321.1 制作游戏 54421.2 核心类的创建 54521.2.1 茶壶大战的应用层 54521.2.2 游戏逻辑 54621.2.3 人类玩家的游戏视图 55321.3 游戏事件 55621.4 游戏玩法 55621.4.1 关卡的加载 55721.4.2 主体管理器 55821.4.3 发送和接收事件 56021.4.4 进程 56221.5 留给读者的练习 563第22章 C#中简单的游戏编辑器 56522.1 为什么要使用C# 56522.2 如何将编辑器组合起来 56522.3 编辑器架构 56622.3.1 应用层 56622.3.2 编辑器的逻辑类 56722.3.3 编辑器视图 56822.3.4 访问游戏引擎的函数 56922.3.5 创建DLL 57822.3.6 编辑器架构的封装 57822.4 C#编译器应用程序 57922.4.1 托管代码和非托管代码之间的区别 58022.4.2 NativeMethods类 58122.4.3 Program类 58222.4.4 MessageHandler类 58322.5 C#编辑器用户界面 58522.5.1 EditorForm类 58522.5.2 ActorComponentEditor类 59522.6 后续工作 60322.7 补充材料 604第23章 对游戏进行调试和分析 60523.1 处理错误的艺术 60623.2 调试基础 60723.2.1 调试器的使用 60923.2.2 安装Windows符号文件 61123.2.3 对全屏游戏进行调试 61223.2.4 远程调试 61323.2.5 对小存储器转储文件(Minidump)进行调试 61523.3 图形调试和着色器调试 61623.4 调试技术 61723.4.1 调试是一次实验 61723.4.2 重现bug 61923.4.3 降低复杂度 62023.4.4 设置下一条语句 62023.4.5 汇编级调试 62123.4.6 给代码添加调料 62323.4.7 提取调试信息 62423.4.8 Lint和其他代码分析器 62523.4.9 Nu-Mega的BoundsChecker和运行时分析器 62523.4.10 消失的bug 62523.4.11 调整数值 62623.4.12 caveman调试 62623.4.13 当一切方法都失败时 62723.5 创建错误日志系统 62823.6 不同类型的bug 63323.6.1 内存泄漏和堆损坏 63423.6.2 游戏数据损坏 63723.6.3 堆栈损坏 63823.6.4 剪切和粘贴bug 63923.6.5 空间不足 63923.6.6 只在发布模式(Release Mode)中出现的bug 64023.6.7 惹是生非的多线程 64023.6.8 奇怪的bug 64123.7 性能分析 64223.7.1 性能的测量 64223.7.2 代码的优化 64223.7.3 折中方案 64323.7.4 过度优化 64423.8 结束小思 64423.9 补充书目 644第24章 驶向结束 64524.1 问题的整理 64524.1.1 质量 64624.1.2 代码 65024.1.3 内容 65324.2 应付大麻烦 65524.2.1 项目进度严重拖延 65524.2.2 人事相关问题 66124.2.3 竞争对手会置你于死地 66224.2.4 到底有没有出路 66324.2.5 最后一个建议: 不要惊慌 66424.3 光明就在前方—毕竟这不是一场训练 66424.3.1 测试存档 66424.3.2 补丁build或产品演示 66524.3.3 事后分析 66524.3.4 如何利用你的时间 666

使用说明

1、下载并解压,得出pdf文件
2、如果打不开本文件,请务必下载pdf阅读器
3、安装后,在打开解压得出的pdf文件
4、双击进行阅读>

下载仅供下载体验和测试学习,不得商用和正当使用。

下载体验

请输入密码查看内容!

如何获取密码?

 

点击下载