《游戏编程权威指南 第4版》PDF下载

  • 购买积分:19 如何计算积分?
  • 作  者:(美)MIKE MCSHAFFRY DAVID“REZ”GRAHAM著;师蓉,李静,李青翠译
  • 出 版 社:北京:人民邮电出版社
  • 出版年份:2016
  • ISBN:7115410344
  • 页数:666 页
图书介绍:

第1章 什么是游戏编程 1

1.1 好的方面 1

1.1.1 工作 2

1.1.2 游戏玩家 2

1.1.3 同事 3

1.1.4 工具——软件开发工具包(SDK) 4

1.1.5 硬件 5

1.1.6 平台 6

1.1.7 展会 9

1.2 不好的地方 9

1.2.1 游戏编程很难 10

1.2.2 零碎文件 10

1.2.3 那不是bug——是特性 11

1.2.4 工具 12

1.3 黑暗的一面 13

1.3.1 命中移动的目标 13

1.3.2 加班模式(和加班大餐) 13

1.3.3 呸!胡扯 15

1.3.4 操作系统地狱 15

1.3.5 雇员流动的性质 16

1.4 这一切都是值得的,对吗 16

第2章 游戏中有什么 18

2.1 游戏架构 18

2.2 使用游戏架构 20

2.3 应用层 22

2.3.1 读取输入 22

2.3.2 文件系统和资源缓存 22

2.3.3 内存管理 23

2.3.4 初始化、主循环和关闭 23

2.3.5 其他应用层代码 24

2.4 游戏逻辑 25

2.4.1 游戏状态和数据结构 25

2.4.2 物理学和碰撞 26

2.4.3 事件 26

2.4.4 进程管理器 27

2.4.5 命令解释器 28

2.5 人类玩家的游戏视图 28

2.5.1 图形显示 29

2.5.2 音频 30

2.5.3 用户界面表示 31

2.5.4 进程管理器 31

2.5.5 选项 31

2.5.6 多人游戏 31

2.6 AI代理的游戏视图 31

2.7 网络游戏架构 32

2.7.1 远程游戏视图 33

2.7.2 远程游戏逻辑 33

2.8 必须使用DirectX吗 34

2.8.1 DirectX的设计理念 34

2.8.2 Direct3D或OpenGL 35

2.8.3 DirectSound还是 35

2.8.4 DirectInput或自己实现 36

2.9 其他内容 36

2.10 补充书目 36

第3章 拯救了我的编码趣闻和风格 37

3.1 通用编码风格 38

3.1.1 大括号 38

3.1.2 一致性 39

3.2 智能代码设计实践 40

3.2.1 避免隐藏代码和重要操作 41

3.2.2 类结构:保持简单 42

3.2.3 继承VS.组合 42

3.2.4 变坏的虚函数 43

3.2.5 使用接口类 44

3.2.6 考虑使用工厂 45

3.2.7 封装变化的组件 46

3.2.8 使用流来初始化对象 46

3.3 智能指针和裸指针 47

3.3.1 引用计数 48

3.3.2 C++的shared_ptr 49

3.4 正确使用内存 52

3.4.1 了解不同类型的内存 53

3.4.2 优化内存访问 55

3.4.3 内存对齐 56

3.4.4 虚拟内存 57

3.4.5 编写自己的内存管理器 58

3.5 各种有用的东西 59

3.5.1 一个很棒的随机数生成器 60

3.5.2 集合的伪随机遍历 61

3.5.3 内存池 62

3.6 开发出适合自己的风格 67

3.7 补充书目 68

第4章 生成游戏 69

4.1 一个小动机 69

4.2 创建项目 70

4.2.1 生成配置 70

4.2.2 创建坚不可摧的目录结构 71

4.2.3 将游戏引擎和工具放在何处 73

4.2.4 设置Visual Studio生成选项 74

4.2.5 多平台项目 76

4.3 源代码库和版本控制 77

4.3.1 微软Visual SourceSafe的相关历史 79

4.3.2 Subversion和TortoiseSVN 79

4.3.3 Perforce软件的Perforce 80

4.3.4 Avid的AlienBrain 81

4.3.5 使用源代码控制分支 81

4.4 生成游戏:一门黑色艺术 84

4.4.1 自动化生成 85

4.4.2 生成计算机 85

4.4.3 自动化生成脚本 85

4.5 创建生成脚本 87

4.5.1 标准生成 87

4.5.2 里程碑生成 88

4.5.3 多个项目和共享代码 90

4.5.4 最后的建议 91

第5章 游戏初始化和关闭 92

5.1 初始化101 92

5.2 C++初始化的一些陷阱 93

5.3 游戏的应用层 95

5.3.1 WinMain:Windows入口点 95

5.3.2 应用层:GameCodeApp 97

5.3.3 InitInstance():检查系统资源 97

5.3.4 检查游戏的多个实例 98

5.3.5 检查硬盘空间 99

5.3.6 检查内存 99

5.3.7 计算CPU速度 100

5.3.8 你拥有的是个垃圾袋吗 101

5.3.9 初始化资源缓存 101

5.3.10 加载文本字符串 102

5.3.11 脚本管理器和事件系统 104

5.3.12 初始化DirectX并创建窗口 104

5.3.13 创建游戏逻辑和游戏视图 105

5.3.14 设置游戏保存目录 105

5.3.15 预加载从缓存中选定的资源 106

5.4 收尾工作:干净漂亮地退出 107

5.4.1 我怎样才能离开呢 107

5.4.2 强制关闭模态对话框 109

5.4.3 关闭游戏 110

5.4.4 游戏机怎么样 110

5.5 进入和退出 111

第6章 游戏主体和组件架构 112

6.1 初次尝试创建游戏主体 112

6.2 组件架构 115

6.3 创建主体和组件 116

6.4 定义主体和组件 120

6.5 存储并访问主体 122

6.6 将它们组合起来 123

6.7 数据共享 124

6.7.1 直接访问 125

6.7.2 事件 125

6.7.3 两全其美 126

第7章 主循环的控制 127

7.1 组织主循环 127

7.1.1 硬编码的更新 127

7.1.2 多线程主循环 128

7.1.3 一种混合技术 129

7.1.4 简单的协同式多任务处理器 131

7.1.5 非常简单的进程示例:DelayProcess 135

7.1.6 Process派生类的使用 137

7.2 良好地适应操作系统 137

7.3 使用DirectX 11框架 138

7.3.1 渲染和呈现显示 138

7.3.2 用于更新和渲染的回调函数 139

7.4 我现在可以制作游戏了吗 141

第8章 游戏数据的加载与缓存 142

8.1 游戏资源:格式和存储要求 143

8.1.1 3D对象网格和环境 143

8.1.2 动画数据 145

8.1.3 地图/关卡数据 146

8.1.4 纹理数据 146

8.1.5 位图颜色深度 147

8.1.6 声音和音乐数据 149

8.1.7 视频和预渲染的过场动画 150

8.2 资源文件 152

8.2.1 将资源打包到一个文件中 153

8.2.2 打包资源的其他好处 153

8.2.3 数据压缩和性能 154

8.2.4 Zlib:开源压缩 154

8.3 资源高速缓存 158

8.3.1 IResourceFile接口 161

8.3.2 ResHandle:跟踪加载的资源 161

8.3.3 IResourceLoader接口和DefaultResourceLoader 163

8.3.4 ResCache:简单的资源高速缓存 163

8.3.5 将资源缓存入DirectX等 169

8.3.6 世界设计和高速缓存预测 170

8.4 我的缓存不够用了 173

第9章 输入设备编程 174

9.1 获取设备状态 174

9.2 使用XInput或DirectInput 177

9.3 一些安全提示 179

9.4 使用双轴控制器 182

9.4.1 捕获桌面上的鼠标 182

9.4.2 使用鼠标拖拽 184

9.5 使用游戏控制器 186

9.5.1 非灵敏区 187

9.5.2 正常输入 189

9.5.3 单杆、双杆、红色拉杆和蓝色拉杆 190

9.5.4 增加控制值 190

9.6 使用键盘 191

9.6.1 Mike的键盘窥探器 191

9.6.2 GetAsyncKeyState()和其他函数 195

9.6.3 处理Windows中的Alt键 195

9.7 什么?没有跳舞毯 195

第10章 用户界面编程 197

10.1 DirectX的文本助手和对话框资源管理器 197

10.2 人类的游戏视图 198

10.3 WASD移动控制器 206

10.4 屏幕元素 208

10.5 自定义的MessageBox对话框 210

10.6 模态对话框 215

10.7 控件 218

10.8 控件识别 219

10.9 命中测试和焦点顺序 221

10.10 控件状态 222

10.11 更多控件属性 223

10.11.1 热键 223

10.11.2 工具提示 223

10.11.3 上下文相关帮助 224

10.11.4 可拖拽 224

10.11.5 声音和动画 224

10.12 最后的用户界面提示 225

第11章 游戏事件管理 226

11.1 游戏事件 226

11.1.1 事件和事件数据 227

11.1.2 事件监听器委托 230

11.1.3 事件管理器 231

11.1.4 示例:将所有内容整合在一起 238

11.2 哪些游戏事件是重要的 239

11.3 事件和进程的区别 241

11.4 补充书目 241

第12章 使用Lua编写脚本 242

12.1 游戏编程语言的简史 242

12.1.1 汇编语言 243

12.1.2 C/C++ 244

12.1.3 脚本语言 245

12.2 使用脚本语言 246

12.2.1 快速原型法 246

12.2.2 专注于设计 247

12.2.3 速度和内存成本 247

12.2.4 它们之间的界限是什么 247

12.3 脚本语言集成策略 248

12.3.1 自己进行编写 248

12.3.2 使用现有的语言 248

12.3.3 选择一种脚本语言 249

12.3.4 Python 249

12.3.5 Lua 249

12.4 Lua速成课程 250

12.4.1 注释 250

12.4.2 变量 250

12.4.3 函数 252

12.4.4 表 253

12.4.5 流程控制 255

12.4.6 操作符 257

12.4.7 接下来是什么 257

12.5 Lua 中的面向对象编程 258

12.5.1 元表 259

12.5.2 创建一个简单的类抽象 261

12.6 内存管理 263

12.7 将Lua绑定到C++ 263

12.7.1 Lua C API 263

12.7.2 tolua++ 263

12.7.3 luabind 264

12.7.4 LuaPlus 264

12.8 LuaPlus速成课程 264

12.8.1 LuaState 264

12.8.2 LuaObject 265

12.8.3 表 266

12.8.4 全局 267

12.8.5 函数 268

12.8.6 从 Lua调用C++函数 269

12.9 将所有内容整合在一起 271

12.9.1 管理 Lua状态 271

12.9.2 脚本导出 273

12.9.3 进程系统 274

12.9.4 事件系统 282

12.9.5 脚本组件 287

12.10 Lua开发和调试 289

12.11 结语 289

12.12 补充书目 289

第13章 游戏音频 290

13.1 声音的工作原理 290

13.1.1 数字录音和重现 291

13.1.2 声音文件 293

13.1.3 线程和同步的简介 293

13.2 游戏语音系统架构 294

13.2.1 声音资源和句柄 295

13.2.2 IAudioBuffer接口和AudioBuffer类 303

13.2.3 IAudio接口和Audio类 305

13.2.4 DirectSound实现 308

13.2.5 声音进程 317

13.2.6 启动音效 321

13.3 其他技术难题 322

13.3.1 声音和游戏对象 322

13.3.2 定时和同步 322

13.3.3 混合问题 324

13.4 一些随记 326

13.4.1 数据驱动的声音设置 326

13.4.2 背景环境声音和音乐 327

13.4.3 语音 328

13.5 结语 330

第14章 3D图形基础 331

14.1 3D图形流水线 331

14.2 3D数学101 332

14.2.1 坐标和坐标系 333

14.2.2 向量数学 335

14.3 C++数学类 340

14.3.1 向量类 340

14.3.2 矩阵数学 341

14.3.3 四元数数学 351

14.3.4 变换 358

14.3.5 几何体 360

14.3.6 光照、法线和颜色 361

14.3.7 材质 363

14.3.8 贴有纹理的顶点 365

14.3.9 纹理 365

14.3.10 二次采样 365

14.3.11 mip映射 367

14.3.12 ID3D11Device和 ID3D11DeviceContext简介 367

14.3.13 在D3D11中加载纹理 368

14.3.14 三角形网格 370

14.4 你还在吗 373

第15章 3D顶点和像素着色器 374

15.1 顶点着色器和着色器语法 375

15.2 编译顶点着色器 379

15.3 顶点着色器的C++辅助类 380

15.4 像素着色器 386

15.5 像素着色器的C++辅助类 387

15.6 使用着色器辅助类进行渲染 390

15.7 着色器——这只是一个开始 391

15.8 补充书目 391

第16章 3D场景 392

16.1 场景图基础 392

16.1.1 ISceneNode接口类 392

16.1.2 SceneNodeProperties和 RenderPass 394

16.1.3 SceneNode——一切都是从这里开始的 396

16.1.4 Scene类 401

16.2 特殊的场景图节点 408

16.2.1 独立渲染通道的实现 408

16.2.2 一个简单的摄像机 411

16.2.3 在场景中放入灯光 413

16.2.4 天空的渲染 416

16.2.5 在场景中使用网格 420

16.3 遗漏的内容 424

16.4 还没满足 425

16.5 补充书目 425

第17章 碰撞和简单的物理学 426

17.1 物理学中的数学知识 427

17.1.1 米、英尺、肘尺还是 Kellicam 427

17.1.2 距离、速度和加速度 427

17.1.3 质量、加速度和力 428

17.1.4 转动惯量、角速度和扭矩 431

17.1.5 距离和交集的计算 431

17.2 选择一种物理SDK 432

17.3 对象属性 434

17.4 碰撞体 435

17.4.1 良好的碰撞几何体的要求 436

17.4.2 可见几何体VS碰撞几何体 437

17.4.3 人类角色的碰撞体 437

17.4.4 特殊对象:楼梯、门道和树 439

17.5 碰撞系统的使用 439

17.6 集成一个物理SDK 441

17.6.1 Bullet SDK的组件 444

17.6.2 初始化 445

17.6.3 关闭 446

17.6.4 物理系统的更新 447

17.6.5 创建简单的物理对象 449

17.6.6 凸面网格的创建 451

17.6.7 触发器的创建 452

17.6.8 力和力矩的应用 453

17.6.9 物理调试渲染器 454

17.6.10 接收碰撞事件 455

17.6.11 物理SDK集成的最后内容 457

17.7 等一下,我还有话要说 458

第18章 游戏AI简介 459

18.1 AI技术 459

18.1.1 硬编码AI 460

18.1.2 随机化 461

18.1.3 加权随机 462

18.2 有限状态机 463

18.3 决策树 467

18.4 模糊逻辑 471

18.5 效用理论 474

18.6 以目标为导向的行动计划 477

18.7 路径查找 478

18.7.1 A*(A-Star) 479

18.7.2 动态规避 481

18.8 补充书目 482

第19章 多玩家游戏的网络编程 483

19.1 互联网的工作原理 483

19.1.1 Winsock还是Berkeley 484

19.1.2 Internet地址 484

19.1.3 域名系统 486

19.1.4 有用的程序和文件 487

19.2 套接字API 488

19.2.1 套接字效用函数 488

19.2.2 域名服务(DNS)函数 490

19.2.3 套接字初始化和关闭 491

19.2.4 创建套接字和设置套接字选项 491

19.2.5 服务器函数 495

19.2.6 套接字读取和写入 498

19.3 使用套接字制作一款多玩家游戏 499

19.3.1 数据包类 500

19.3.2 核心套接字类 501

19.3.3 用于监听的套接字类 506

19.3.4 套接字管理器类 508

19.4 核心客户端类 515

19.5 核心服务器端类 516

19.6 将套接字连接到事件系统中 517

19.7 如果真的这么简单就好了 522

第20章 多道程序设计简介 523

20.1 多道程序设计是什么 523

20.2 创建线程 525

20.3 进程同步 527

20.3.1 测试与置位、信号量和互斥 528

20.3.2 Windows 临界区 528

20.4 有趣的线程问题 530

20.5 线程安全 531

20.6 GameCode4 中的多线程类 531

20.6.1 RealtimeProcess类 532

20.6.2 从实时进程发送事件 534

20.6.3 接收实时进程中的事件 537

20.7 Zip文件的后台解压缩 538

20.8 进一步工作 540

20.9 关于硬件 541

20.10 关于未来 541

20.11 补充书目 542

第21章 “茶壶大战”游戏 543

21.1 制作游戏 544

21.2 核心类的创建 545

21.2.1 茶壶大战的应用层 545

21.2.2 游戏逻辑 546

21.2.3 人类玩家的游戏视图 553

21.3 游戏事件 556

21.4 游戏玩法 556

21.4.1 关卡的加载 557

21.4.2 主体管理器 558

21.4.3 发送和接收事件 560

21.4.4 进程 562

21.5 留给读者的练习 563

第22章 C#中简单的游戏编辑器 565

22.1 为什么要使用C# 565

22.2 如何将编辑器组合起来 565

22.3 编辑器架构 566

22.3.1 应用层 566

22.3.2 编辑器的逻辑类 567

22.3.3 编辑器视图 568

22.3.4 访问游戏引擎的函数 569

22.3.5 创建DLL 578

22.3.6 编辑器架构的封装 578

22.4 C#编译器应用程序 579

22.4.1 托管代码和非托管代码之间的区别 580

22.4.2 NativeMethods类 581

22.4.3 Program类 582

22.4.4 MessageHandler类 583

22.5 C#编辑器用户界面 585

22.5.1 EditorForm类 585

22.5.2 ActorComponentEditor类 595

22.6 后续工作 603

22.7 补充材料 604

第23章 对游戏进行调试和分析 605

23.1 处理错误的艺术 606

23.2 调试基础 607

23.2.1 调试器的使用 609

23.2.2 安装Windows符号文件 611

23.2.3 对全屏游戏进行调试 612

23.2.4 远程调试 613

23.2.5 对小存储器转储文件(Minidump)进行调试 615

23.3 图形调试和着色器调试 616

23.4 调试技术 617

23.4.1 调试是一次实验 617

23.4.2 重现bug 619

23.4.3 降低复杂度 620

23.4.4 设置下一条语句 620

23.4.5 汇编级调试 621

23.4.6 给代码添加调料 623

23.4.7 提取调试信息 624

23.4.8 Lint和其他代码分析器 625

23.4.9 Nu-Mega的BoundsChecker和运行时分析器 625

23.4.10 消失的bug 625

23.4.11 调整数值 626

23.4.12 caveman调试 626

23.4.13 当一切方法都失败时 627

23.5 创建错误日志系统 628

23.6 不同类型的bug 633

23.6.1 内存泄漏和堆损坏 634

23.6.2 游戏数据损坏 637

23.6.3 堆栈损坏 638

23.6.4 剪切和粘贴bug 639

23.6.5 空间不足 639

23.6.6 在发布模式(Release Mode)中出现的bug 640

23.6.7 惹是生非的多线程 640

23.6.8 奇怪的bug 641

23.7 性能分析 642

23.7.1 性能的测量 642

23.7.2 代码的优化 642

23.7.3 折中方案 643

23.7.4 过度优化 644

23.8 结束小思 644

23.9 补充书目 644

第24章 驶向结束 645

24.1 问题的整理 645

24.1.1 质量 646

24.1.2 代码 650

24.1.3 内容 653

24.2 应付大麻烦 655

24.2.1 项目进度严重拖延 655

24.2.2 人事相关问题 661

24.2.3 竞争对手会置你于死地 662

24.2.4 到底有没有出路 663

24.2.5 最后一个建议:不要惊慌 664

24.3 光明就在前方——毕竟这不是一场训练 664

24.3.1 测试存档 664

24.3.2 补丁build或产品演示 665

24.3.3 事后分析 665

24.3.4 如何利用你的时间 666