有了煤矿多媒体信息发布系统统硬件,如何让屏幕活起来

游戏编程精粹1
第1章 通用编程技术
1.0 神奇的数据驱动设计(Steve Rabin) 3
1.0.1 点子1——基础 3
1.0.2 点子2——最低标准 3
1.0.3 点子3——杜绝硬编码 3
1.0.4 点子4——将控制流写成脚本 4
1.0.5 点子5——什么时候不适合使用脚本? 5
1.0.6 点子6——避免重复数据 5
1.0.7 点子7——开发工具来生成数据 6
1.0.8 结论 6
1.1 面向对象的编程与设计技术(James Boer) 7
1.1.1 代码风格 7
1.1.2 类设计 9
1.1.3 类层次结构设计 10
1.1.4 设计模式 10
1.1.5 总结 16
1.1.6 参考资料 16
1.2 使用模板元编程的快速数学方法(Pete Isensee) 17
1.2.1 斐波纳契数 17
1.2.2 阶乘 18
1.2.3 三角学 19
1.2.4 实际世界中的编译程序 20
1.2.5 重访三角学 21
1.2.6 模板和标准C++ 21
1.2.7 矩阵 21
1.2.8 总结 26
1.2.9 参考文献 31
1.3 一种自动的Singleton工具(Scott Bilas) 32
1.3.1 定义 32
1.3.2 优点 32
1.3.3 问题 33
1.3.4 传统的解决方法 33
1.3.5 较好的方法 33
1.3.6 更好的方法 34
1.3.7 参考文献 35
1.4 在游戏编程中使用STL(James Boer) 36
1.4.1 STL的类型和术语 36
1.4.2 STL概念 37
1.4.3 向量(Vector) 38
1.4.4 链表(List) 40
1.4.5 双队列(Deque) 42
1.4.6 映射表(Map) 43
1.4.7 堆栈(Stack),队列(Queue)和优先队列(Priority Queue) 46
1.4.8 总结 47
1.4.9 参考文献 47
1.5 一个通用的函数绑定接口(Scott Bilas) 48
1.5.1 要求 48
1.5.2 关于平台 48
1.5.3 第一次尝试 49
1.5.4 第二次尝试 50
1.5.5 部分解决方法 51
1.5.6 调用约定 52
1.5.7 调用函数 54
1.5.8 完备解决方案 55
1.5.9 结论 56
1.5.10 参考文献 57
1.6 通用的基于句柄的资源管理器(Scott Bilas) 58
1.6.1 方法 58
1.6.2 Handle类 59
1.6.3 HandleMgr类 60
1.6.4 使用示例 61
1.6.5 注意 61
1.6.6 参考文献 68
1.7 资源和内存管理(James Boer) 69
1.7.1 资源类 69
1.7.2 资源管理类 71
1.7.3 句柄如何工作 74
1.7.4 可能的扩展和改进 74
1.7.5 结论 75
1.8 快速数据载入技巧(John Olsen) 76
1.8.1 预处理你的数据 76
1.8.2 保存你的数据 76
1.8.3 使用简单方法载入你的数据 77
1.8.4 更安全地载入你的数据 78
1.9 基于帧的内存分配(Steven Ranck) 80
1.9.1 常规内存分配的挑战 80
1.9.2 介绍基于帧的内存 80
1.9.3 分配和释放内存 82
1.9.4 例子 84
1.9.5 结论 86
1.10 简单快速的位数组(Andrew Kirmse) 87
1.10.1 概述 87
1.10.2 位数组 87
1.10.3 其他数组 88
1.10.4 应用 89
1.10.5 参考文献 89
1.11 在线游戏的网络协议(Andrew Kirmse) 90
1.11.1 定义 90
1.11.2 篡改报文 90
1.11.3 报文重放 91
1.11.4 其他技术 92
1.11.5 逆向工程 92
1.11.6 实现 93
1.11.7 参考文献 93
1.12 最大限度地利用Assert(Steve Rabin) 94
1.12.1 Assert基础 94
1.12.2 Assert技巧 #1:嵌入更多信息 95
1.12.3 Assert技巧 #2:嵌入更多更多信息 95
1.12.4 Assert技巧 #3:使之更好用一些 96
1.12.5 Assert技巧 #4:编写自己的assert宏 96
1.12.6 Assert技巧 #5:无价之宝 97
1.12.7 Assert技巧 #6:给“超级铁杆” 97
1.12.8 Assert技巧 #7:让它更简单——复制和粘贴 98
1.12.9 参考文献 98
1.13 Stats:实时统计和游戏内调试(John Olsen) 99
1.13.1 Why:需求驱动的技术 99
1.13.2 How:一个进化过程 100
1.13.3 What:一个基于C++类的系统 100
1.13.4 Where:可用性 102
1.13.5 小结 102
1.14 实时的游戏内建剖析(Steve Rabin) 103
1.14.1 开始考虑细节 103
1.14.2 剖析器将告诉你什么? 104
1.14.3 增加剖析器调用 105
1.14.4 剖析器的实现 106
1.14.5 ProfileBegin的细节 107
1.14.6 ProfileEnd的细节 107
1.14.7 处理剖析数据的细节 107
1.14.8 后期增强 108
1.14.9 将它们组合起来 108
1.14.10 参考文献 113
第2章 数学技巧
2.0 可预测随机数(Guy W. Lecky-Thompson) 117
2.0.1 可预测随机数 117
2.0.2 替换算法 119
2.0.3 无限宇宙算法 120
2.0.4 结论与展望 122
2.0.5 参考文献 123
2.1 插值方法(John Olsen) 124
2.1.1 使用浮点数学的帧速相关ease-out 124
2.1.2 使用整型数学的帧速相关ease-out 125
2.1.3 帧速无关线性内插 126
2.1.4 帧速无关ease-in和ease-out 127
2.1.5 危险地带 128
2.2 求刚体运动方程的积分(Miguel Gomez) 132
2.2.1 运动学:平移和旋转 132
2.2.2 动力学:力与旋转力矩(torque) 135
2.2.3 刚体的特性 136
2.2.4 求运动方程的积分 139
2.2.5 参考文献 140
2.3 三角函数的多项式逼近(Eddie Edwards) 141
2.3.1 多项式 142
2.3.2 定义域和值域 143
2.3.3 偶多项式和奇多项式 146
2.3.4 泰勒级数 146
2.3.5 截断的泰勒级数 149
2.3.6 拉格朗日级数 150
2.3.7 不连续性处理 153
2.3.8 结论 153
2.4 为数字稳定性而利用隐式欧拉积分(Miguel Gomez) 155
2.4.1 求初值问题的积分及稳定性 155
2.4.2 显式的欧拉方法 155
2.4.3 隐式欧拉方法 156
2.4.4 不准确性 158
2.4.5 寻找隐式解 158
2.4.6 结论 158
2.4.7 参考文献 158
2.5 小波:理论与压缩(Lo?c Le Chevalier) 160
2.5.1 原理 160
2.5.2 一个实例 162
2.5.3 应用 162
2.5.4 参考文献 163
2.6 水面的交互式模拟(Miguel Gomez) 164
2.6.1 二维波动方程 164
2.6.2 边界条件:岛屿和海岸线 166
2.6.3 实现问题 166
2.6.4 与水面交互 167
2.6.5 渲染 169
2.6.6 参考文献 170
2.7 游戏编程四元数(Jan Svarovsky) 171
2.7.1 将四元数当作矩阵替换物 171
2.7.2 为什么不使用欧拉角 172
2.7.3 X、Y、Z和W代表什么 172
2.7.4 源自什么数学基础 173
2.7.5 四元数如何表示旋转 174
2.7.6 参考文献 174
2.8 矩阵和四元数之间的转换(Jason Shankel) 175
2.8.1 四元数旋转 175
2.8.2 四元数到矩阵的转换 175
2.8.3 矩阵到四元数的转换 177
2.8.4 参考文献 178
2.9 四元数插值(Jason Shankel) 179
2.9.1 四元数计算 179
2.9.2 四元数插值 179
2.9.3 示例代码 182
2.9.4 推导 182
2.10 最短弧四元数(Stan Melax) 186
2.10.1 动机 186
2.10.2 数值不稳定性 186
2.10.3 稳定公式的推导 187
2.10.4 残存不稳定性条件 188
2.10.5 源代码 188
2.10.6 虚拟跟踪球 189
2.10.7 参考文献 189
第3章 人工智能
3.0 设计一个通用、健壮的AI引擎(Steve Rabin) 193
3.0.1 事件驱动与轮询的对比 193
3.0.2 消息概念 194
3.0.3 状态机 194
3.0.4 一个使用消息的事件驱动状态机 194
3.0.5 交待时间(Confession Time) 197
3.0.6 另一个小交待 197
3.0.7 状态机构建单元 198
3.0.8 状态机消息路由选择 198
3.0.9 发送消息 200
3.0.10 发送延迟的消息 200
3.0.11 删除游戏对象 201
3.0.12 增强:定义消息的范围 201
3.0.13 增强:记录所有的消息活动和状态变迁 203
3.0.14 增强:交换状态机 203
3.0.15 增强:多状态机 203
3.0.16 增强:一个状态机队列 204
3.0.17 代码外部脚本化行为 204
3.0.18 结论 204
3.0.19 参考文献 207
3.1 一个有限状态机类(Eric Dybsand) 208
3.1.1 FSMclass和FSMstate 210
3.1.2 定义FSMstate 210
3.1.3 定义FSMclass 211
3.1.4 为FSM创建状态 212
3.1.5 使用FSM 213
3.1.6 参考文献 219
3.2 博弈树(Jan Svarovsky) 220
3.2.1 极小极大算法的负极大改进算法 221
3.2.2  剪枝 222
3.2.3 走步排序方法 223
3.2.4  求精 224
3.2.5 参考文献 224
3.3 A*路径规划基础(Bryan Stout) 225
3.3.1 问题 225
3.3.2 方法概述 225
3.3.3 A*的特性 227
3.3.4 将A*应用到游戏路径规划 227
3.3.5 A*的弱点 231
3.3.6 进一步的工作 232
3.3.7 参考文献 232
3.4 A*审美优化(Steve Rabin) 233
3.4.1 直路径 233
3.4.2 多边形搜索空间中的直路径 234
3.4.3 平滑路径 234
3.4.4 预先计算的Catmull-Rom公式 235
3.4.5 改进分级路径的直接性 236
3.4.6 空旷区域上的分级寻径 238
3.4.7 在分级搜寻过程中减少停顿 238
3.4.8 最大化响应率 239
3.4.9 结论 239
3.4.10 参考文献 239
3.5 A*速度优化(Steve Rabin) 240
3.5.1 搜索空间优化 240
3.5.2 算法优化 244
3.5.3 结论 248
3.5.4 参考文献 253
3.6 简化的3D运动和使用导航网格进行寻径(Greg Snook) 254
3.6.1 简述 254
3.6.2 构造 255
3.6.3 滚动骰子并且移动鼠标 256
3.6.4 到此仅完成一半 258
3.6.5 它是有效的,但不是那么完美 260
3.6.6 结论 261
3.6.7 参考文献 269
3.7 Flocking:一种模拟群体行为的简单技术(Steven Woodcock) 270
3.7.1 实现 271
3.7.2 代码 273
3.7.3 局限性与可能的改进 276
3.7.4 资源与致谢 282
3.8 用于视频游戏的模糊逻辑(Mason McCuskey) 283
3.8.1 模糊逻辑如何工作 283
3.8.2 模糊逻辑运算 285
3.8.3 为模糊控制而刹车 286
3.8.4 模糊逻辑的其他应用 291
3.8.5 结论 291
3.8.6 资源 291
3.9 神经网络初探(André LaMothe) 292
3.9.1 生物学仿真 292
3.9.2 对游戏的应用 293
3.9.3 神经网络101 294
3.9.4 纯逻辑,Mr. Spock 298
3.9.5 分类与“图像”识别 302
3.9.6 Hebbian的Ebb 305
3.9.7 运行Hopfield 306
3.9.8 结论 309
第4章 多边形技术
4.0 为OpenGL优化顶点提交(Herbert Marselas) 313
4.0.1 即时模式 313
4.0.2 交叉存取数据 314
4.0.3 步数据和流数据 315
4.0.4 编译过的顶点数组 316
4.0.5 取消数据复制厂家指定扩展 317
4.0.6 数据格式 317
4.0.7 一般建议 318
4.0.8 结论 318
4.0.9 参考文献 319
4.1 调整顶点的投影深度值(Eric Lengyel) 320
4.1.1 考察投影矩阵 320
4.1.2 矫正深度值 321
4.1.3 选择一个适当的  321
4.1.4 实现 323
4.1.5 源代码 323
4.2 矢量摄像机(David Paull) 324
4.2.1 矢量摄像机初步 325
4.2.2 本地空间优化 326
4.2.3 结论 327
4.3 摄像机控制技术(Dante Treglia II) 328
4.3.1 一种基本的第一人称摄像机 328
4.3.2 脚本摄像机 330
4.3.3 摄像机技巧 333
4.4 一种快速的圆柱棱台相交测试算法(Eric Lengyel) 337
4.4.1 视域棱台 337
4.4.2 计算有效半径 338
4.4.3 算法 339
4.4.4 实现 341
4.5 3D碰撞检测(Kevin Kaiser) 346
4.5.1 算法概述 346
4.5.2 包围球碰撞检测 346
4.5.3 三角形对三角形的碰撞检测 348
4.6 用于交互检测的多分辨率地图(Jan Svarovsky) 358
4.6.1 使用栅格 358
4.6.2 对象大小变化的问题 358
4.6.3 多分辨率地图 359
4.6.4 源代码 360
4.7 计算到区域内部的距离(Steven Ranck) 368
4.7.1 问题 368
4.7.2 算法描述 369
4.7.3 应用 371
4.8 对象阻塞剔除(Tim Round) 376
4.8.1 可视棱台裁剪 376
4.8.2 阻塞剔除 378
4.8.3 总结 379
4.9 永远不要让他们看到你的“抖动”——几何体细节层次选择问题(Yossarian King) 387
4.9.1 LOD选择 387
4.9.2 放大率因子 389
4.9.3 滞变阈值 389
4.9.4 实现 390
4.9.5 其他问题 391
4.10 八叉树构造(Dan Ginsburg) 393
4.10.1 八叉树概述 393
4.10.2 八叉树数据 394
4.10.3 建立树 394
4.10.4 多边形重叠 395
4.10.5 相邻节点 396
4.10.6 应用 396
4.10.7 结论 396
4.10.8 参考文献 397
4.11 松散的八叉树(Thatcher Ulrich) 398
4.11.1 四叉树 398
4.11.2 包围体 399
4.11.3 划分物体 400
4.11.4 使它松散 402
4.11.5 比较 405
4.11.6 结论 406
4.12 独立于观察的渐进网格(Jan Svarovsky) 407
4.12.1 渐进网格概述 407
4.12.2 关于这个主题的变种 408
4.12.3 边缘选择函数 410
4.12.4 难处理的边 410
4.12.5 实现 411
4.12.6 源代码 414
4.12.7 参考文献 415
4.13 插值的3D关键帧动画(Herbert Marselas) 416
4.13.1 线性插值 416
4.13.2 对顶点和法线进行插值 418
4.13.3 Hermite样条插值 418
4.13.4 对顶点进行样条插值 420
4.13.5 为什么用Hermite样条 421
4.13.6 总结 421
4.13.7 参考文献 421
4.14 一种快速而简单的皮肤构造技术(Torgeir Hagland) 422
4.14.1 为什么对低多边形有价值 422
4.14.2 方法 422
4.14.3 总结 423
4.14.4 参考文献 426
4.15 填充间隙——使用缝合和皮肤构造的高级动画(Ryan Woodland) 427
4.15.1 缝合 428
4.15.2 皮肤构造(Skinning) 430
4.15.3 进一步的问题 432
4.15.4 参考文献 434
4.16 实时真实地形生成(Guy W. Lecky-Thompson) 434
4.16.1 风景设计 434
4.16.2 建筑物 439
4.16.3 命名算法 442
4.16.4 参考文献 446
4.17 分形地形生成——断层构造(Jason Shankel) 447
4.17.1 断层构造 447
4.17.2 减少dHeight 447
4.17.3 生成随机直线 448
4.17.4 腐蚀(erosion) 449
4.17.5 示例代码 450
4.17.6 参考文献 450
4.18 分形地形生成——中点置换(Jason Shankel) 451
4.18.1 一维中点置换 451
4.18.2 二维中点置换——菱形正方形算法 452
4.18.3 高地中的菱形——正方形算法 454
4.19 分形地形生成——粒子沉积(Jason Shankel) 455
4.19.1 MBE模型 455
4.19.2 粒子沉积 455
4.19.3 倒置火山口 457
4.19.4 示例代码 458
4.19.5 参考文献 458
第5章 像素特效
5.0 2D镜头光晕(Yossarian King) 461
5.0.1 方法 461
5.0.2 实现 462
5.0.3 源代码 464
5.1 将3D硬件用于2D子画面特效(MasonMcCuskey) 465
5.1.1 进入3D 465
5.1.2 建立3D场景 465
5.1.3 建立纹理 466
5.1.4 绘制3D子画面 466
5.1.5 添加特效 468
5.1.6 结论 468
5.2 基于运动的静态光照(Steven Ranck) 469
5.2.1 传统的静态光照 469
5.2.2 基于运动的静态光照 472
5.2.3 结论 477
5.3 使用定点颜色插值模拟实时光照(Jorge Freitas) 478
5.3.1 光照方法 478
5.3.2 美工创作 479
5.3.3 插值光照 479
5.3.4 结论 480
5.4 衰减图(Sim Dietrich) 485
5.4.1 讲解 485
5.4.2 比较衰减图与光照图 488
5.4.3 CSG效果 489
5.4.4 基于范围的雾 489
5.4.5 其他形状 489
5.4.6 结论 489
5.5 使用纹理坐标生成技术的高级纹理(Ryan Woodland) 490
5.5.1 简单纹理坐标动画 490
5.5.2 纹理投影 490
5.5.3 反射映射 493
5.5.4 参考文献 494
5.6 硬件凹凸贴图(Sim Dietrich) 495
5.6.1 如何将凹凸图应用于对象上 495
5.6.2 为法线选择一个空间 496
5.6.3 另一种方法:使用正切空间凹凸贴图 496
5.6.4 解决方案:纹理空间凹凸贴图 498
5.6.5 纹理空间问题 499
5.6.6 结论 499
5.6.7 参考文献 500
5.7 底面阴影(Yossarian King) 501
5.7.1 阴影数学 501
5.7.2 实现 503
5.7.3 扩展 504
5.8 复杂对象上的实时阴影(Gabor Nagy) 505
5.8.1 介绍 505
5.8.2 光源、遮挡物体和接收物体 505
5.8.3 本文的目的 507
5.8.4 创建阴影图 507
5.8.5 在接收物体上投影阴影图 513
5.8.6 渲染接收物体 514
5.8.7 对基本算法的扩展与改进 514
5.8.8 参考文献 515
5.9 使用光滑预过滤和Fresnel项改善环境映射反射(Anis Ahmad) 516
5.9.1 第一个不正确的假设 516
5.9.2 第二个不正确的假设 518
5.9.3 结论 518
5.9.4 致谢 519
5.9.5 参考文献 519
5.10 游戏中玻璃的效果(Gabor Nagy) 520
5.10.1 介绍 520
5.10.2 透明物体 520
5.10.3 光栅化程序、帧缓冲、Z缓冲和像素混合 520
5.10.4 不透明物体与透明物体 521
5.10.5 绘制不透明物体 522
5.10.6 绘制透明物体 522
5.10.7 反射 525
5.10.8 有色玻璃 525
5.10.9 将它们放到一起 525
5.10.10 实现 526
5.10.11 参考文献 526
5.11 用于容器中液体的折射贴图(Alex Vlachos,Jason L. Mitchell) 527
5.11.1 介绍 527
5.11.2 折射项 527
5.11.3 反射项 528
5.11.4 Fresnel项 529
5.11.5 使用硬件渲染 529
5.11.6 该技术的扩展 530
5.11.7 结论 531
5.11.8 参考文献 531
第6章 附录
6.0 矩阵工具库(Dante Treglia II,Mark A. DeLoura) 535
6.1 文本工具库(Dante Treglia II) 537
6.2 关于随书光盘(Mark A. DeLoura) 538
作者索引 539
游戏编程精粹2
第1章 通用编程技术
Scott Bilas
1.1 优化C++游戏 5
Andrew Kirmse
1.1.1 对象的创建和销毁 5
1.1.2 内存管理 8
1.1.3 虚拟函数 9
1.1.4 代码长度 10
1.1.5 标准模板库 11
1.1.6 高级特性 12
1.1.7 参考文献 13
1.2 内联函数和宏 14
Peter Dalton
1.2.1 内联函数的优点 14
1.2.2 何时使用内联函数 15
1.2.3 何时使用宏 16
1.2.4 微软特有的情况 16
1.2.5 参考文献 17
1.3 抽象接口编程 18
.Noel Liopis
1.3.1 抽象接口 18
1.3.2 添加一个工厂(factory) 19
1.3.3 抽象接口特性 21
1.3.4 一切都是有代价的 23
1.3.5 结论 24
1.3.6 参考文献 24
1.4 从DLL中导出C++类 25
Herb Marselas
1.4.1 导出函数 25
1.4.2 导出类 25
1.4.3 导出类成员函数 27
1.4.4 导出虚拟类成员函数 27
1.4.5 总结 28
1.5 避免DLL困境 29
Herb Marselas
1.5.1 显式链接还是隐式链接 29
1.5.2 LoadLibrary和GetProcAddress 30
1.5.3 提防DirectX 30
1.5.4 使用操作系统特有的特性 31
1.5.5 总结 32
1.6 动态类型信息 34
Scott Wakeling
1.6.1 动态类型信息类简介 34
1.6.2 暴露和查询DTI 35
1.6.3 继承的含义是“是一个” 36
1.6.4 处理通用对象 37
1.6.5 实现永久性类型信息 38
1.6.6 将永久性类型信息用于游戏保存数据库中 39
1.6.7 结论 40
1.6.8 参考文献 40
1.7 用于通用C++成员访问的属性类 41
Charles Cafrelli
1.7.1 代码 41
1.7.2 其他用途 44
1.7.3 推荐读物 44
1.8 一个游戏实体工厂 45
Fran?ois Dominic Laramée
1.8.1 组件 45
1.8.2 flyweight类、行为类和导出类 45
1.8.3 flyweight对象 46
1.8.4 SAMMy,你在哪里? 46
1.8.5 行为类层次 47
1.8.6 使用模板方法模式来完成行为任务 48
1.8.7 导出类 49
1.8.8 实体工厂 50
1.8.9 在运行阶段选择策略 52
1.8.10 最后的注意事项 53
1.8.11 参考文献 53
1.9 在C++添加摒弃功能 55
Noel Llopis
1.9.1 可能的解决方案 55
1.9.2 理想的解决方案 55
1.9.3 使用和指定被摒弃的函数 56
1.9.4 使用C++实现摒弃功能 56
1.9.5 可改进的地方 58
1.9.6 致谢 58
1.9.7 参考文献 58
1.10 一个插入式调试内存管理器 59
Peter Dalton
1.10.1 内存管理器初步 59
1.10.2 内存管理器的记录工作 60
1.10.3 报告信息 62
1.10.4 注意事项 63
1.10.5 进一步的改进 64
1.10.6 参考文献 64
1.11 一个内置的游戏剖析模块 66
Jeff Evertt
1.11.1 有关剖析的基本知识 66
1.11.2 商用工具 67
1.11.3 为何要自己开发模块 67
1.11.4 剖析模块(Profiling module)的需求 68
1.11.5 架构和实现 68
1.11.6 实现的细节 69
1.11.7 分析数据 69
1.11.8 有关实现的注意事项 70
1.12 用于Windows游戏的线性编程模型 71
Javier F. Otaegui
1.12.1 更新背景 71
1.12.2 解决方案:多线程(Multithreading) 72
1.12.3 参考文献 75
1.13 栈缠绕 76
Bryon Hapgood
1.13.1 简单的TempRet 76
1.13.2 TempRet链 77
1.13.3 Thunking 78
1.13.4 递归 80
1.14 自我修改的代码 82
Bryon Hapgood
1.14.1 RAM代码的原理 82
1.14.2 一个快速的Bit Blitter 83
1.15 使用资源文件来管理文件 91
Bruno Sousa
1.15.1 何为资源文件 91
1.15.2 设计 92
1.15.3 实现 93
1.15.4 有关实现的最后一些说明 94
1.15.5 结论 95
1.15.6 参考文献 95
1.16 游戏输入的记录和重放 96
Bruce Dawson
1.16.1 记录输入有何用途 96
1.16.2 原理 97
1.16.3 测试输入记录功能 100
1.16.4 结论 100
1.16.5 参考文献 101
1.17 一个灵活的文本分析系统 102
James Boer
1.17.1 分析系统 102
1.17.2 宏、头文件和预处理技术 103
1.17.3 该分析系统的结构 104
1.17.4 小结 106
1.18 一个通用的调节器 107
Lasse Staff Jensen
1.18.1 需求分析 107
1.18.2 实现 107
1.18.3 使用 112
1.18.4 图形用户界面 112
1.18.5 附注 114
1.18.6 致谢 114
1.19 生成真正的随机数 115
Pete Isensee
1.19.1 伪随机 115
1.19.2 真正随机 115
1.19.3 随机输入源 116
1.19.4 硬件源 116
1.19.5 混合函数 117
1.19.6 局限性 117
1.19.7 实现 117
1.19.8 GenRand的随机程度 119
1.19.9 参考文献 119
1.20 使用Bloom过滤器来提高计算性能 120
Mark Fischer
1.20.1 Bloom的方式 120
1.20.2 可能的情形 120
1.20.3 工作原理 121
1.20.4 定义 121
1.20.5 范例1 121
1.20.6 范例2 125
1.20.7 最后的说明 125
1.20.8 结论 126
1.20.9 参考文献 126
1.21 3Ds MAX中的Skin导出器和动画工具包 127
Marco Tombesi
1.21.1 导出 128
1.21.2 参考文献 137
1.22 在视频游戏中使用Web摄像机 138
Nathan d'Obrenan
1.22.1 初始化Web摄像机捕获窗口 138
1.22.2 操纵Web摄像机数据 143
1.22.3 结论 147
1.22.4 参考文献 147
第2章 数学技巧
绪 论 151
Eddie Edwards
2.1 浮点计算技巧:使用IEEE浮点格式以提高性能 152
Yossarian King
2.1.1 概述 152
2.1.2 IEEE浮点格式 152
2.1.3 浮点数技巧 153
2.1.4 用于正弦和余弦函数的线性查找表 158
2.1.5 平方根函数的对数优化 160
2.1.6 优化任何函数 161
2.1.7 性能测量 163
2.1.8 结论 163
2.1.9 参考文献 164
2.2 矢量和平面技巧 165
John Olsen
2.2.1 相对于碰撞面的高度 165
2.2.2 找出碰撞点 166
2.2.3 到碰撞点的距离 167
2.2.4 反射式碰撞 168
2.2.5 阻尼碰撞 170
2.3 一种快速、健壮的计算3D线段交点的方法 172
Graham Rhodes
2.3.1 这种算法健壮的原因 172
2.3.2 问题描述 172
2.3.3 推导闭式解决方案方程 174
2.3.4 线段 179
2.3.5 实现描述 181
2.3.6 可优化的地方 181
2.3.7 结论 182
2.3.8 参考文献 182
2.4 反向弹道计算 183
Aaron Nicholls
2.4.1 一种特殊情况 184
2.4.2 优化实现 189
2.4.3 总结 190
2.5 平行移动镜头 191
Carl Dougan
2.5.1 技术 191
2.5.2 结论 194
2.5.3 参考文献 194
2.6 平滑的基于四元数的C2飞行路径 195
Alex Vlachos
2.6.1 导论 195
2.6.2 位置插值 195
2.6.3 朝向插值 196
2.6.4 旋转方向和选择性求负 197
2.6.5 四元数样条线插值 198
2.6.6 有理映射中的奇异点 199
2.6.7 镜头剪接 199
2.6.8 代码 199
2.6.9 参考文献 200
2.7 递归逐维分组:一种快速的碰撞检测算法 201
Steve Rabin
2.7.1 其他应用 202
2.7.2 该算法的缺陷 205
2.7.3 查找碰撞物体对 206
2.7.4 时间复杂度 208
2.7.5 结论 209
2.7.6 参考文献 209
2.8 不规则碎片编程 210
Jesse Laeuchli
2.8.1 无规则碎片 210
2.8.2 断层无规则碎片 211
2.8.3 FBM 211
2.8.4 实现 212
2.8.5 使用FBM 215
2.8.6 参考文献 216
第3章 人工智能
绪 论 219
Steve Rabin
3.1 AI优化策略 221
Steve Rabin
3.1.1 策略1:使用事件驱动行为而非轮询 221
3.1.2 策略2:减少重复计算 222
3.1.3 策略3:由管理员集中进行协调 222
3.1.4 策略4:不那么频繁地运行AI 222
3.1.5 策略5:将处理工作分散到多帧中完成 223
3.1.6 策略6:利用细节级AI 223
3.1.7 策略7:只解决问题的一部分 223
3.1.8 策略8:离线完成困难的工作 224
3.1.9 策略9:使用突发行为以避免编写脚本 224
3.1.10 策略10:通过连续记录来分摊查询成本 224
3.1.11 策略11:重新考虑问题 225
3.1.12 结论 225
3.1.13 参考文献 226
3.2 用于游戏对象AI的微线程 227
Bruce Dawson
3.2.1 一个更简单的方法 228
3.2.2 微线程 229
3.2.3 栈管理 230
3.2.4 并发症 231
3.2.5 结论 232
3.2.6 参考文献 232
3.3 使用微线程管理AI 233
Simon Carter
3.3.1 拼凑 233
3.3.2 良好的行为 233
3.3.3 了然于胸 234
3.3.4 并发症 236
3.3.5 结论 238
3.3.6 参考文献 239
3.4 一种RTS命令排队体系结构 240
Steve Rabin
3.4.1 RTS命令 240
3.4.2 命令排队 240
3.4.3 循环命令 242
3.4.4 结论 244
3.4.5 参考文献 244
3.5 一种基于分片的高性能视域和搜索系统 245
Matt Pritchard
3.5.1 概述 245
3.5.2 定义 245
3.5.3 组件1:各个玩家的可见性地图 246
3.5.4 组件2:LOS模板 246
3.5.5 组件3:合并的可视性地图 248
3.5.6 改进搜索 249
3.5.7 结论 251
3.6 创建影响力地图 252
Paul Tozour
3.6.1 影响力地图 252
3.6.2 一个简单的影响力地图 253
3.6.3 影响力地图中的单元格数据 254
3.6.4 计算合意值 255
3.6.5 确定最佳的单元格大小 256
3.6.6 影响力传播 256
3.6.7 考虑地形 257
3.6.8 特别考虑 258
3.6.9 刷新影响力地图 259
3.6.10 3D环境中的影响力地图 259
3.6.11 参考文献和推荐读物 260
3.7 策略评估技术 261
Paul Tozour
3.7.1 资源分配树 261
3.7.2 计算希望的资源分配 262
3.7.3 判断当前的分配情况 263
3.7.4 策略决策 263
3.7.5 值的估量 264
3.7.6 依存图 264
3.7.7 依存图节点 265
3.7.8 经济规划 265
3.7.9 查找脆弱的依存 266
3.7.10 策略推理 266
3.7.11 玩家个性 267
3.7.12 总结 267
3.7.13 参考文献 267
3.8 3D游戏中的地形推理 269
William van der Sterren
3.8.1 以方便推理的方式表示地形 269
3.8.2 中继点(waypoint) 270
3.8.3 范例地形和AI需求 270
3.8.4 战术分析(tactical analysis) 270
3.8.5 从战术价值到中继点属性 271
3.8.6 计算中继点属性 272
3.8.7 从经验中学习 274
3.8.8 将地形推理加入到游戏中 275
3.8.9 其他应用 275
3.8.10 结论 276
3.8.11 参考文献和推荐读物 276
3.9 用于可视点寻径的扩展几何体 277
Thomas Young
3.9.1 定义碰撞模型 277
3.9.2 多边形寻径 278
3.9.3 扩展并解决问题 278
3.9.4 凸多边形的闵可夫斯基和 279
3.9.5 扩展非凸几何体 280
3.9.6 选择碰撞形状 281
3.9.7 结论 281
3.9.8 参考文献 281
3.10 优化可视点寻径 283
Thomas Young
3.10.1 可视点寻径(points-of-visibility pathfinding) 283
3.10.2 存储到每个点的最短路径 283
3.10.3 将凸角相连 284
3.10.4 轮廓区 285
3.10.5 将轮廓区用于空间分区系统 287
3.10.6 结论 287
3.10.7 参考文献 287
3.11 有齿物群的模拟:捕食者和猎物 288
Steven Woodcock
3.11.1 全新的世界 289
3.11.2 有齿物群的模拟 291
3.11.3 局限性和可改进的地方 291
3.11.4 参考文献 292
3.12 一个用C++编写的通用模糊状态机 293
Eric Dybsand
3.12.1 为何在游戏中使用FuSM 294
3.12.2 如何在游戏中使用FuSM 294
3.12.3 复习《游戏编程精粹1》中的C++通用有限状态机 295
3.12.4 将通用FSM修改为FuSM 295
3.12.5 在游戏中使用模糊逻辑 296
3.12.6 参考文献 296
3.13 避免模糊系统中的组合激增 297
Michael Zarozinski
3.13.1 问题 297
3.13.2 解决方案 298
3.13.3 范例 299
3.13.4 结论 303
3.13.5 参考文献 303
3.14 一个在游戏中使用神经元网络的例子 304
John Manslow
3.14.1 游戏 304
3.14.2 多玩家感知器 304
3.14.3 选择输入 306
3.14.4 收集数据 306
3.14.5 训练MLP 307
3.14.6 结果 308
3.14.7 结论 308
3.14.8 参考文献 309
第4章 几何体管理
绪 论 313
Eric Lengyel
4.1 各种VIPM方法的比较 314
Tom Forsyth
4.1.1 考虑因素 314
4.1.2 Vanilla VIPM 316
4.1.3 跳带 319
4.1.4 多层跳带 319
4.1.5 混合模式VIPM 320
4.1.6 混合模式跳带 321
4.1.7 滑窗 321
4.1.8 小结 324
4.1.9 参考文献 325
4.2 使用联锁分片简化地形 326
Greg Snook
4.2.1 分片的重访问 327
4.2.2 生成地图 328
4.2.3 分片模板 328
4.2.4 消除难看的接缝 329
4.2.5 更好、更快、更强 330
4.2.6 结论 331
4.2.7 参考文献 331
4.3 快速可视剔除、射线跟踪以及范围搜索的球形树 332
John W. Ratcliff
4.3.1 包围球 332
4.3.2 使用球形树 332
4.3.3 演示应用程序 333
4.4 压缩的轴向包围盒树 335
Miguel Gomez
4.4.1 概览层次排序方法 335
4.4.2 AABB树 336
4.4.3 构建AABB树 336
4.4.4 压缩AABB树 337
4.4.5 近似范围 337
4.4.6 利用冗余 338
4.4.7 运行时效 339
4.4.8 将来的工作 339
4.4.9 参考文献 339
4.5 直接访问四叉树查找 340
Matt Pritchard
4.5.1 性能剖析 340
4.5.2 消除中间阻碍 341
4.5.3 条件和要求 341
4.5.4 判断树层 341
4.5.5 位置映射 343
4.5.6 判断位置 344
4.5.7 遍历四叉树 344
4.5.8 优化四叉树 344
4.6 近似鱼缸折射 347
Alex Vlachos
4.6.1 鱼缸观察现象 347
4.6.2 提高其真实性 349
4.6.3 结论 349
4.7 渲染打印分辨率的屏幕快照 350
Alex Vlachos
4.7.1 基本算法 350
4.7.2 忠告及注意 353
4.7.3 结论 353
4.7.4 参考文献 353
4.8 对任意表面应用贴花 354
Eric Lengyel
4.8.1 算法 354
4.8.2 三角形剪裁 356
4.8.3 实现代码 357
4.8.4 参考文献 357
4.9 用天空包围盒渲染远景 358
Jason Shankel
4.9.1 基本技术 358
4.9.2 天空包围盒分辨率 359
4.9.3 天空包围盒大小 359
4.9.4 渲染场景 360
4.9.5 立方体环境映射 360
4.9.6 生成天空包围盒纹理 361
4.9.7 结论 361
4.9.8 源代码 361
4.10 自阴影角色 362
Alex Vlachos, David Gosselin, Jason L. Mitchell
4.10.1 研究回顾 362
4.10.2 角色几何分割 362
4.10.3 渲染纹理 362
4.10.4 渲染角色 363
4.10.5 结论 364
4.10.6 参考文献 364
4.11 经典的Super Mario 64游戏第三人称控制和动画 365
Steve Rabin
4.11.1 设置 365
4.11.2 转换控制器的输入 365
4.11.3 旋转角色 367
4.11.4 角色移动 368
4.11.5 角色动画 368
4.11.6 Super Mario 64动画分析 370
4.11.7 结论 371
4.11.8 参考文献 371
第5章 图形显示
绪 论 375
D. Sim Dietrich Jr
5.1 卡通渲染:实时轮廓边缘检测与渲染 376
Carl S. Marshall
5.1.1 着墨器(Inker) 376
5.1.2 重要的边 377
5.1.3 轮廓边缘检测技术 377
5.1.4 基于边的着墨 377
5.1.5 可编程顶点着色器着墨 379
5.1.6 高级纹理特征着墨 381
5.1.7 结论 381
5.1.8 参考文献 382
5.2 使用纹理映射的卡通渲染与可编程顶点着色器 383
5.2.1 卡通着色技术 383
5.2.2 上色 383
5.2.3 可编程顶点着色器 386
5.2.4 结论 388
5.2.5 参考文献 388
5.3 动态逐像素光照技术 389
Dan Ginsburg, Dave Gosselin
5.3.1 动态光照贴图的3D纹理 389
5.3.2 Dot3凹凸贴图(Bump Mapping) 391
5.3.3 使用立方贴图规一化 395
5.3.4 逐像素聚光灯(Per-Pixel Spotlight) 396
5.3.5 参考文献 396
5.4 使用3D硬件生成过程云彩 398
Kim Pallister
5.4.1 云彩性质 398
5.4.2 生成随机数 399
5.4.3 噪音多个倍频的动画 401
5.4.4 贴图到天空几何体 403
5.4.5 功能延伸 404
5.4.6 硬件限制 404
5.4.7 可伸缩性 405
5.4.8 结论 405
5.4.9 参考文献 406
5.5 针对较快镜头眩光的纹理屏蔽 407
Chris Maughan
5.5.1 镜头眩光遮挡 407
5.5.2 硬件问题 407
5.5.3 纹理屏蔽 409
5.5.4 性能考虑 410
5.5.5 改进 411
5.5.6 示例代码 411
5.5.7 替代途径 412
5.5.8 参考文献 412
5.6 实用优先缓冲阴影 413
D. Sim Dietrich Jr.
5.6.1 比较优先缓冲与深度缓冲 415
5.6.2 解决锯齿化问题 416
5.6.3 混合途径 417
5.6.4 小结 418
5.6.5 参考文献 418
5.7 替用体技术:添加点缀 419
Tom Forsyth
5.7.1 整个过程 419
5.7.2 渲染替换体 420
5.7.3 更新试探法 423
5.7.4 效率 424
5.7.5 预测 424
5.7.6 小结 425
5.8 硬件加速过程纹理动画中的运算 426
Greg James
5.8.1 硬件运算 426
5.8.2 将来的工作 435
5.8.3 致谢 435
5.8.4 示例源码 435
5.8.5 参考文献 435
第6章 音频编程
绪 论 439
James Boer
6.1 游戏音频设计模式 440
Scott Patterson
6.1.1 桥接(Bridge) 440
6.1.2 外观(Fa?ade) 441
6.1.3 合成(Composite) 441
6.1.4 代理(Proxy) 442
6.1.5 修饰器(Decorator) 442
6.1.6 命令(Command) 443
6.1.7 备忘录(Memento) 443
6.1.8 观测器(Observer) 443
6.1.9 大泥球(Big Ball of Mud)(也称做“意大利面条式”代码) 444
6.1.10 结论 445
6.1.11 参考文献 445
6.2 在采样合成器中声音的同步重用技术 446
Thomas Engel
6.2.1 存在的问题 446
6.2.2 解决方案的思路 447
6.2.3 解决方案 447
6.2.4 结论 448
6.3 软件DSP效果 450
6.3.1 滤波 450
6.3.2 卷积(convolution) 451
6.3.3 延迟 451
6.3.4 插值(interpolation) 452
6.3.5 参考文献 453
6.4 数字音频的交互式处理管线 454
Keith Weiner
6.4.1 简介 454
6.4.2 讨论 456
6.4.3 代码 458
6.4.4 额外注释 461
6.4.5 结论 462
6.5 游戏中的基本音乐音序器 463
Scott Patterson
6.5.1 音乐流与音序 463
6.5.2 核心计算机音乐概念 464
6.5.3 计算机音序器实现 466
6.5.4 音频合成(composite)控制 472
6.5.5 源码 473
6.5.6 结论 473
6.5.7 参考文献 473
6.6 用于游戏的交互式音序器 474
Scott Patterson
6.6.1 音乐联想 474
6.6.2 音乐意义 474
6.6.3 过渡 476
6.6.4 过渡类型 476
6.6.5 控制粒度 477
6.6.6 目标控制 477
6.6.7 设计示例 479
6.6.8 源码 480
6.6.9 结论 480
6.6.10 参考文献 480
6.7 底层声音API 481
核心类 481
索引  483
游戏编程精粹3
第1章 通用编程技术
Kim Pallister
1.1 调度游戏中的事件 4
Michael Harvey,Carl S. Marshall
1.1.1 调度器的组成 5
1.1.2 一个简单的调度器 8
1.1.3 高级概念 10
1.1.4 结论 11
1.1.5 参考文献 12
1.2 一个基于对象组合的游戏架构 13
Scott Patterson
1.2.1 游戏开发的各个阶段 13
1.2.2 游戏架构设计 14
1.2.3 游戏架构实现 17
1.2.4 源代码 20
1.2.5 参考文献 21
1.3 让C中的宏重现光辉 23
1.3.1 声明 23
1.3.2 第1个宏技巧: 把枚举值转化为字符串 23
.1.3.3 第2个宏技巧: 利用二进制表达式得到编译期常量 25
1.3.4 第3个宏技巧:给标准断言添加描述性注释 26
1.3.5 第4个宏技巧:编译期断言 26
1.3.6 第5个宏技巧:得到一个数组里面的元素个数 27
1.3.7 第6个宏技巧: 在一个字符串中间加入__LINE__ 27
1.3.8 第7个宏技巧:防止进入无限循环 28
1.3.9 第8个宏技巧:小型的特制语言 29
1.3.10 第9个宏技巧:简化类接口 30
1.3.11 结论 33
1.3.12 参考文献 33
1.4 平台无关的函数绑定代码生成器 34
Allen Pouratian
1.4.1 年轻与智慧 34
1.4.2 概要 35
1.4.3 细节 36
1.4.4 脚本 38
1.4.5 网络 38
1.4.6 结论 39
1.4.7 参考文献 39
1.5 基于句柄的智能指针 40
Brian Hawkins
1.5.1 用法 40
1.5.2 句柄 41
1.5.3 智能指针 42
1.5.4 结论 43
1.5.5 参考文献 43
1.6 定制STL分配器 44
Pete Isensee
1.6.1 一个范例 44
1.6.2 分配器的基础 45
1.6.3 分配器的要求 45
1.6.4 缺省的分配器对象 49
1.6.5 编写自己的分配器 49
1.6.6 潜在的用途 51
1.6.7 分配器状态数据 51
1.6.8 一些建议 52
1.6.9 实现细节 52
1.6.10 结论 52
1.6.11 参考文献 53
1.7 立即存盘 54
Martin Brownlow
1.7.1 为何如此困难 54
1.7.2 SAVEMGR类 55
1.7.3 SAVEOBJ类 55
1.7.4 数据类型与扩展 56
1.7.5 重载缺省函数 56
1.7.6 一个简单的例子 57
1.7.7 结论 58
1.8 自动列表设计模式 59
1.8.1 实现 59
1.8.2 实现时的注意事项 61
1.8.3 结论 63
1.9 浮点异常处理 64
Soren Hannibal
1.9.1 为什么要崩溃 64
1.9.2 你的程序处理浮点异常么 65
1.9.3 异常的类型 65
1.9.4 代码 65
1.9.5 调试浮点错误 66
1.9.6 结论 66
1.10 使用UML开发一个配合设计的游戏引擎 67
Thomas Demachy
1.10.1 对象就在游戏之中 67
1.10.2 动态的类--正如动态的棋子 70
1.10.3 协作与迭代 72
1.10.4 实现上的问题 73
1.10.5 结论 74
1.10.6 参考文献 75
1.11 使用Lex和Yacc分析自定义数据文件 76
Paul Kelly
1.11.1 Lex 77
1.11.2 Yacc 77
1.11.3 优点与缺陷 77
1.11.4 Yacc和Lex中的交互 78
1.11.5 针对游戏子系统的自定义数据文件 79
1.11.6 把数据输出工具与Lex和Yacc结合起来 80
1.11.7 一个完整的例子 80
1.11.8 结论 84
1.11.9 如何得到Flex和Bison 84
1.11.10 参考文献 84
1.12 为世界市场开发游戏 85
Aaron Nicholls
1.12.1 市场潜力 85
1.12.2 门面事,先处理--显示和输入 86
1.12.3 字符集 88
1.12.4 界面和设计方面的考虑 90
1.12.5 本地化 93
1.12.6 设计和规划中的考虑 94
1.12.7 测试 95
1.12.8 结论 98
1.12.9 参考文献 98
1.13 3D游戏中的实时输入和用户界面 99
Greg Seegert
1.13.1 实现用户界面 99
1.13.2 指定用户界面元素 100
1.13.3 本地化问题 101
1.13.4 输入系统 102
1.13.5 鼠标与操纵杆 103
1.13.6 在处理延迟方面用户界面的作用 104
1.13.7 结论 105
1.13.8 参考文献 105
1.14 自然的选择:饼状菜单的演化 106
Don Hopkins
1.14.1 Feng GUI的饼状菜单 106
1.14.2 对饼状菜单的研究与评估 107
1.14.3 饼状菜单插件 108
1.14.4 未来发展方向 112
1.14.5 走进SimCity中的城镇 112
1.14.6 Sims中的起居室 114
1.14.7 结论 115
1.14.8 参考文献 115
1.15 轻量级的、基于规则的日志记录 117
Brian Hawkins
1.15.1 规则 117
1.15.2 调试标志 117
1.15.3 配置文件 118
1.15.4 可配置的标志值 119
1.15.5 日志记录 119
1.15.6 用法 121
1.15.7 结论 122
1.15.8 参考文献 122
1.16 日志服务 123
Eric Robert
1.16.1 管理信息 123
1.16.2 系统层次 124
1.16.3 Journal接口 127
1.16.4 创建日志服务 129
1.16.5 结论 132
1.16.6 参考文献 132
1.17 实时的层次化性能评测 133
Greg Hjeistrom,Byon Garrabrant
1.17.1 性能评测树 134
1.17.2 用法 134
1.17.3 实现 136
1.17.4 结论 139
1.17.5 参考文献 139
第2章 数学技巧
简介  141
2.1 对数与随机数生成的2基快速函数 143
James McNeill
2.1.1 整数的2基对数 143
2.1.2 位掩码与随机数生成 143
2.1.3 函数是如何工作的 145
2.1.4 参考文献 145
2.2 使用分数矢量得到更精确的几何图形 146
Thomas Young
2.2.1 问题 146
2.2.2 一个解决方法:分数矢量 149
2.2.3 使用分数矢量 150
2.2.4 数字的范围 151
2.2.5 实现上的细节 152
2.2.6 结论 153
2.2.7 参考文献 153
2.3 三角函数的更多近似计算方法 154
Robin Green
2.3.1 衡量误差 154
2.3.2 正弦与余弦函数 155
2.3.3 多项式逼近 162
2.3.4 有关收敛性的注意事项 166
2.3.5 结论 167
2.3.6 参考文献 167
2.4 四元数的压缩 168
Mark Zarb-Adami
2.4.1 四元数 168
2.4.2 三个最小数方法 168
2.4.3 极点方法 169
2.4.4 实现 169
2.4.5 性能 170
2.4.6 结论 171
2.4.7 答谢 171
2.4.8 参考文献 171
2.5 受限的逆向运动学 172
Jason Weber
2.5.1 骨节层次 172
2.5.2 循环坐标推演 173
2.5.3 旋转限制 174
2.5.4 调整每个骨节,同时保持限制 175
2.5.5 结论 177
2.5.6 参考文献 177
2.6 针对物理建模的单元自动机 179
Tom Forsyth
2.6.1 CA基础 179
2.6.2 八叉树 182
2.6.3 实际的物理 182
2.6.4 核心处理模型 183
2.6.5 气体 184
2.6.6 水流 184
2.6.7 流速 185
2.6.8 热量 186
2.6.9 火焰 188
2.6.10 动态更新速率 189
2.6.11 结论 190
2.6.12 参考文献 191
2.7 在动态仿真中处理摩擦 192
Miguel Gomez
2.7.1 库仑摩擦力 192
2.7.2 数值方法 196
2.7.3 一个三维公式 199
2.7.4 几何图形问题 200
2.7.5 结论 201
2.7.6 参考文献 201
第3章 人工智能
简介  203
Steven WoodCock
3.1 经GoCap优化过的机器学习 205
Thor Alexander
3.1.1 GoCap架构一览 205
3.1.2 训练开车 207
3.1.3 学习规则 208
3.1.4 结论 212
3.1.5 参考文献 212
3.2 区域游览:对寻径模式的扩展 213
Ben Board,Mike Ducker
3.2.1 辞旧 214
3.2.2 迎新 215
3.2.3 分而治之 218
3.2.4 路径遍历 220
3.2.5 对此模式的扩展 224
3.2.6 结论 224
3.2.7 参考文献 224
3.3 基于函数指针的内嵌式有限状态机 225
Charles Farris
3.3.1 什么是有限状态机 225
3.3.2 FSM的实现 226
3.3.3 实现CFSM 228
3.3.4 使用CFSM 232
3.3.5 结论 234
3.3.6 参考文献 235
3.4 在RTS中的地形分析--一个隐藏的重要因素
Daniel Higgins
3.4.1 区域 236
3.4.2 凸包 240
3.4.3 重要的匹配器 243
3.4.4 关隘 246
3.4.5 进行地形分析 249
3.4.6 结论 250
3.4.7 参考文献 250
3.5 一个针对AI代理、对象,以及任务的可扩展触发器系统 251
Steve Rabin
3.5.1 触发器系统简介 251
3.5.2 对象自有的触发器系统 252
3.5.3 定义条件 252
3.5.4 使用布尔逻辑组合条件 252
3.5.5 定义响应 254
3.5.6 求取触发器的值 254
3.5.7 一次性触发与载入次数 255
3.5.8 使用标志和计数器将触发器结合起来 256
3.5.9 触发器系统与脚本语言的对比 257
3.5.10 局限性 258
3.5.11 结论 258
3.5.12 参考文献 258
3.6 基于A*算法的战术式寻径 259
William van der Sterren
3.6.1 有风险的A* 260
3.6.2 对于有缺陷路径的战术式改良 262
3.6.3 暴露时间与对敌人建模 262
3.6.4 威胁并不仅仅是静态的 264
3.6.5 更战术化的改进 265
3.6.6 性能 265
3.6.7 有效的火力线以及视野的探测 266
3.6.8 扩展的A*算法的代价 267
3.6.9 ASE程序 268
3.6.10 结论 268
3.6.11 参考文献 269
3.7 快速游览网格的方法 270
Stephen White,Christopher Christensen
3.7.1 静态障碍与动态障碍 270
3.7.2 游览网格 270
3.7.3 门户 272
3.7.4 建表 274
3.7.5 其他的门户相关问题 275
3.7.6 表示生物 276
3.7.7 动态障碍 277
3.7.8 在静态障碍与动态障碍之间进行游览 279
3.7.9 有关游览网格的其他想法 279
3.7.10 结论 280
3.8 在寻径与碰撞之间选择一种关系 281
Thomas Young
3.8.1 在碰撞控制下的运动 281
3.8.2 对于寻径的碰撞模型 281
3.8.3 方法1:具有容错性的AI 282
3.8.4 方法2:在无障碍空间一个子集内的寻径 284
3.8.5 方法3:使用寻径器本身处理人物碰撞 286
3.8.6 实现沿路的运动 288
3.8.7 结论 289
3.8.8 参考文献 289
第4章 图形
简介  292
Jeff Lander
4.1 消除T形连接与重新三角化 295
Eric Lengyel
4.1.1 T形连接的消除 296
4.1.2 重新三角化 297
4.1.3 实现 298
4.1.4 结论 299
4.2 快速高程场法线的计算 300
Jason Shankel
4.2.1 一个任意网格上的法线 300
4.2.2 高程场法线 301
4.2.3 结论 303
4.2.4 例子程序 303
4.2.5 参考文献 304
4.3 快速计算面片法线 305
Martin Brownlow
4.3.1 定义 305
4.3.2 传统方法 305
4.3.3 相关问题 306
4.3.4 一个更简单的方法 306
4.3.5 其他的优点 306
4.3.6 此方法的精确度有多大 307
4.3.7 结论 307
4.3.8 参考文献 307
4.4 快速、简单的遮蔽剪裁 308
Wagner T. Corrêa,Princeton University
4.4.1 可见性问题 308
4.4.2 PLP算法 309
4.4.3 cPLP算法 310
4.4.4 讨论 310
4.4.5 实验结果 311
4.4.6 结论 312
4.4.7 参考文献 312
4.5 三角形条带的创建、优化以及渲染 314
Carl S.Marshall
4.5.1 三角形条带 314
4.5.2 三角形条带的创建 315
4.5.3 优化 318
4.5.4 渲染 319
4.5.5 倾向于缓存的三角形条带 319
4.5.6 连续分层细节的三角形条带 319
4.5.7 结论 320
4.5.8 参考文献 320
4.6 针对复杂数据集计算优化阴影体 321
Alex Vlachos,Drew Card
4.6.1 前期工作 321
4.6.2 算法 321
4.6.3 优化算法 323
4.6.4 参考文献 324
4.7 针对人物运动的表面细分 325
William Leeson
4.7.1 各种细分模式 325
4.7.2 骨节的层次化结构以及顶点积累缓冲 329
4.7.3 优化 330
4.7.4 系统集成 332
4.7.5 源代码 333
4.7.6 结论 334
4.7.7 参考文献 334
4.8 改良的骨节变换计算 335
Jason Weber
4.8.1 背景知识 335
4.8.2 简单的方法 336
4.8.3 添加骨节 337
4.8.4 改变权重 338
4.8.5 系统集成与优化 340
4.8.6 结论 342
4.8.7 参考文献 342
4.9 针对真实人物运动的架构 343
Thomas Young
4.9.1 问题:针对任意目标的运动 343
4.9.2 问题:运动之间的平滑过渡 345
4.9.3 解决问题的一个架构:局部修正器与独立的插值系数 346
4.9.4 应用:处理任意目标的运动 347
4.9.5 位移修正器 348
4.9.6 应用:变换 349
4.9.7 其他细节 349
4.9.8 结论 350
4.9.9 参考文献 350
4.10 可编程顶点着色器的编译器 351
4.10.1 可编程顶点着色器 351
4.10.2 编译器 353
4.10.3 编译器的组成部分 353
4.10.4 结论 357
4.10.5 致谢 357
4.10.6 参考文献 357
4.11 画板光束 359
Brian Hawkins
4.11.1 矩阵 359
4.11.2 顶点 360
4.11.3 UV映射 361
4.11.4 结论 361
4.12 针对等测引擎的3D技术 362
Greg Snook
4.12.1 进入第三个维度 363
4.12.2 方法1:画板越多,效果越好 363
4.12.3 方法2:变换纹理 364
4.12.4 方法3:垂直插值的纹理 366
4.12.5 结论 367
4.12.6 参考文献 367
4.13 使用法向地图进行曲面模拟 368
Oscar Blasco
4.13.1 法向地图 368
4.13.2 整个过程的纵览 369
4.13.3 数据准备 369
4.13.4 投影线 370
4.13.5 得到细节信息 371
4.13.6 后处理 372
4.13.7 已知的问题 372
4.13.8 其他方法 373
4.13.9 结论 373
4.13.10 致谢 374
4.13.11 参考文献 374
4.14 动态的、具有照片效果的地形光照 375
Naty Hoffman,Kenny Mitchell
4.14.1 背景知识 375
4.14.2 解的分类 377
4.14.3 日照:地平角、椭圆阴影以及PTM 377
4.14.4 天空光照:辐射透过量的近似与分块 379
4.14.5 活动的云层阴影 380
4.14.6 基于视频的解决方案 382
4.14.7 非地形对象 383
4.14.8 结论 383
4.14.9 参考文献 383
4.15 立体图光照技术 385
Kenneth L. Hurley
4.15.1 立体图的物理属性 385
4.15.2 如何与立体图进行数据交换 386
4.15.3 使用立体图进行渲染 386
4.15.4 对云层进行编码 387
4.15.5 在一个立体图中对光源进行编码 390
4.15.6 在立体图中渲染散射光照 390
4.15.7 将日夜循环编码进立体图中 391
4.15.8 结论 391
4.15.9 参考文献 391
4.16 程序纹理 392
Mike Milliger
4.16.1 参数与函数 392
4.16.2 进入游戏世界 393
4.16.3 硬件加速 395
4.16.4 结论 396
4.16.5 致谢 397
4.16.6 参考文献 397
4.17 独一无二的纹理 398
Tom Forsyth
4.17.1 程序纹理 398
4.17.2 智能纹理缓存 399
4.17.3 合成模型 399
4.17.4 层的映射与变换 399
4.17.5 层的源与过滤器 400
4.17.6 合成方法 400
4.17.7 对数字的控制 401
4.17.8 动态纹理 401
4.17.9 可扩展性 402
4.17.10 使用CPU还是图形芯片进行合成运算 403
4.17.11 演示程序 403
4.17.12 结论 404
4.17.13 参考文献 404
4.18 使用纹理作为查找表进行逐像素光照计算 405
Alex Vlachos, John Isidoro,Chris Oat
4.18.1 不使用立体图进行h归一化(n.h/h.h映射)的镜面逐像素光照 405
4.18.2 使用一个(n.h)k图的逐像素镜面指数 407
4.18.3 色彩偏移的光晕 409
4.18.4 拥有正确的逐像素衰减的逐像素点光照 410
4.18.5 拥有正确的逐像素衰减的逐像素聚光灯与方向性光照 411
4.18.6 结论 413
4.18.7 参考文献 413
4.19 使用手工制作的着色模型进行渲染 414
4.19.1 着色模型 414
4.19.2 基于微表面的着色模型 415
4.19.3 NDF着色 415
4.19.4 使用NDF的凸凹贴图 417
4.19.5 扩展 418
4.19.6 结论 418
4.19.7 参考文献 418
第5章 网络和多玩家游戏
简介  421
Andrew Kirmse
5.1 将实时策略游戏中的延迟最小化 422
Jim Greer, EA.com,Zachary Booth Simpson, Mine Control
5.1.1 帧锁定与事件锁定 422
5.1.2 时间同步 426
5.1.3 结论 428
5.1.4 参考文献 428
5.2 实时策略网络协议 429
Jan Svarovsky
5.2.1 其他的协议 429
5.2.2 我们的协议 430
5.2.3 精炼 432
5.2.4 有用的模块 434
5.2.5 在StarTopia中容易犯的错误 435
5.2.6 示例游戏 436
5.2.7 结论 436
5.2.8 参考文献 436
5.3 一个针对巨量多玩家游戏的灵活的仿真架构 437
Thor Alexander
5.3.1 架构一览 437
5.3.2 支持类 438
5.3.3 核心类 440
5.3.4 管理器与工厂 443
5.3.5 把它们都组合起来 445
5.3.6 结论 448
5.3.7 参考文献 448
5.4 对多玩家游戏进行扩展 449
Justin Randall
5.4.1 改善游戏公平度的策略 449
5.4.2 设计可扩展的服务器 451
5.4.3 分布负载 456
5.4.4 优化 458
5.4.5 结论 460
5.4.6 参考文献 461
5.5 基于模板的对象序列化 462
Jason Beardsley
5.5.1 现存的解决方案 462
5.5.2 可移植性 464
5.5.3 Serializer 类 465
5.5.4 扩展与优化 470
5.5.5 未来的工作 472
5.5.6 结论 472
5.5.7 参考文献 472
5.6 安全套接字 473
Pete Isensee
5.6.1 IPSec 473
5.6.2 警告 474
5.6.3 安全连接 474
5.6.4 包格式 475
5.6.5 发送数据 476
5.6.6 接收数据 477
5.6.7 示例实现 478
5.6.8 CryptoAPI 480
5.6.9 性能 480
5.6.10 安全性 481
5.6.11 结论 481
5.6.12 参考文献 482
5.7 一个网络监控与模拟工具 483
Andrew Kirmse
5.7.1 界面 483
5.7.2 网络监控 484
5.7.3 TCP模拟 484
5.7.4 UDP模拟 484
5.7.5 主机带宽模拟 485
5.7.6 结论 485
5.8 使用DirectPlay8.1创建多玩家游戏 486
Gabriel Rohweder
5.8.1 DirectPlay内幕 486
5.8.2 数据传输 487
5.8.3 可重入的回调函数 490
5.8.4 使用DirectPlay发送语音 493
5.8.5 相关资源 496
5.9 使用Java微型版开发无线游戏 497
5.9.1 网络特性 497
5.9.2 Java微型版 498
5.9.3 J2ME网络精髓 499
5.9.4 HTTP的限制 500
5.9.5 优化数据包 501
5.9.6 从服务器获取图像 502
5.9.7 结论 503
5.9.8 参考文献 504
第6章 音频处理
简介  506
Scott Patterson
6.1 使用Ogg Vorbis进行音频压缩 508
Jack Moffitt
6.1.1 心理声学压缩 508
6.1.2 使用压缩的情况 510
6.1.3 使用Ogg的代码示例 511
6.1.4 结论 514
6.1.5 参考文献 514
6.2 创建一个美妙的3D音频环境 515
Garin Hiebert
6.2.1 3D音频的核心概念 515
6.2.2 有效地使用你的音频引擎 516
6.2.3 实现 517
6.2.4 结论 518
6.2.5 参考文献 518
6.3 使用轴对齐的边界框设置音障 520
Carlo Vogelsang
6.3.1 问题 520
6.3.2 解决方法 521
6.3.3 实现 524
6.3.4 结论 524
6.3.5 参考文献 524
6.4 使用双二次共振滤波器 525
6.4.1 数字滤波器的工作原理 525
6.4.2 IIR与FIR滤波器 526
6.4.3 双二次滤波器的实现 526
6.4.4 改变变量 527
6.4.5 避免异常情况 527
6.4.6 控制滤波器 528
6.4.7 计算此滤波器的系数 528
6.4.8 低通滤波器 529
6.4.9 高通滤波器 529
6.4.10 带通滤波器 529
6.4.11 将滤波器进行串联 530
6.4.12 将滤波器进行并联 530
6.4.13 软件 530
6.4.14 结论 530
6.4.15 参考文献 530
6.5 语音压缩与音效的线性预测编码 531
Eddie Edwards
6.5.1 对语音建模 532
6.5.2 软件仿真 533
6.5.3 取代声带 535
6.5.4 控制重新合成器 536
6.5.5 增加扬声器的深度 537
6.5.6 对数据编码 537
6.5.7 速度 538
6.5.8 实验 538
6.5.9 参考文献 538
6.6 复杂声音的随机合成方法 539
6.6.1 线性同余算法 539
6.6.2 噪声种类 540
6.6.3 软件示例 541
6.6.4 软件 545
6.6.5 结论 545
6.6.6 参考文献 545
6.7 针对游戏的实时模块化音频处理 546
Frank Luchs
6.7.1 模块化音频处理 546
6.7.2 通过程序生成声音 547
6.7.3 Sphinx MMOS系统 547
6.7.4 处理器 548
6.7.5 模块文件简介 548
6.7.6 模块文件的应用 550
6.7.7 源代码 552
6.7.8 结论 553
6.7.9 参考文献 553
游戏编程精粹4
第1章 通用编程
简介 ChrisCorry 2
1.1 调试游戏程序的学问 Steve Rabin 4
1.1.1 五步调试法 4
1.1.2 第一步:始终如一地重现问题 4
1.1.3 第二步:搜集线索 5
1.1.4 第三步:查明错误的源头 6
1.1.5 第四步:纠正问题 7
1.1.6 第五步:对所作的修改进行测试 7
1.1.7 高级调试技巧 8
1.1.8 困难的调试情景和模式 10
1.1.9 理解底层系统 12
1.1.10 增加有助于调试的基础设施 12
1.1.11 预防bug 13
1.1.12 结论 14
1.1.13 致谢 15
1.1.14 参考文献 15
1.2 一个基于HTML的日志和调试系统 James Boer 16
1.2.1 于日志系统的优势 16
1.2.2 究竟什么是事件日志? 16
.1.2.3 HTML和调用堆栈 17
1.2.4 工作原理 18
1.2.5 一些有用的心得 21
1.2.6 结论 21
1.3 时钟:游戏的脉搏尽在掌握 Noel Llopis 23
1.3.1 关于时间的基础 23
1.3.2 时钟系统的组成 24
1.3.3 避免失真 25
1.3.4 结论 29
1.4 设计和维护大型跨平台库 David Etherton 30
1.4.1 设计 30
1.4.2 Build系统 32
1.4.3 细节 33
1.4.4 结论 35
1.4.5 参考文献 35
1.5 利用模版化的空闲块列表克服内存碎片问题 Paul Glinker 36
1.5.1 内存操作 36
1.5.2 解决方案 37
1.5.3 实现细节 37
1.5.4 有效地使用我们的Freelist 40
1.5.5 结论 40
1.5.6 参考文献 41
1.6 一个用C++实现的泛型树容器类 Bill Budge 42
1.6.1 可重用的库 42
1.6.2 树的概念 43
1.6.3 树的实现 43
1.6.4 利用STL 46
1.6.5 结论 49
1.6.6 参考文献 49
1.7 弱引用和空对象 Noel Llopis 51
1.7.1 使用指针 51
1.7.2 弱引用 52
1.7.3 空对象 55
1.7.4 结论 56
1.7.5 参考文献 57
1.8 游戏中的实体管理系统 Matthew Harmon 58
1.8.1 概述 58
1.8.2 实体消息 60
1.8.3 实体代码 61
1.8.4 类的代码 63
1.8.5 实体管理器 63
1.8.6 基于消息的游戏循环 65
1.8.7 开始:消息类 65
1.8.8 从小处着手:基本实体消息 66
1.8.9 游戏和环境消息 67
1.8.10 系统成长:一些高级消息 67
1.8.11 处理碰撞 69
1.8.12 扩展到多玩家 69
1.8.13 开发和调试消息 70
1.8.14 好处 70
1.8.15 光盘中的内容 71
1.8.16 总结 71
1.9 Windows和Xbox平台上地址空间受控的动态数组 Matt Pritchard 72
1.9.1 传统的动态数组管理 72
1.9.2 深入观察 73
1.9.3 地址空间管理 != 存储管理 73
1.9.4 重新思考关于数组增大的问题 74
1.9.5 新的增长规则 74
1.9.6 使用地址空间受控的数组 75
1.9.7 结论 79
1.10 用临界阻尼实现慢入慢出的平滑 Thomas Lowe 80
1.10.1 可用的技术 80
1.10.2 阻尼弦与临界阻尼 82
1.10.3 实践 82
1.10.4 设置平滑速率的上限 84
1.10.5 结论 85
1.10.6 参考文献 85
1.11 一个易用的对象管理器 Natalya Tatarchuk 86
1.11.1 对象管理的传统做法 86
1.11.2 灵活的对象管理器 87
1.11.3 结论 91
1.11.4 参考文献 92
1.12 使用自定义的RTTI属性对对象进行流操作及编辑 FredericMy 93
1.12.1 扩展的RTTI 93
1.12.2 属性 95
1.12.3 编辑属性 97
1.12.4 保存 99
1.12.5 载入 100
1.12.6 与旧版本文件的兼容性问题:类的描述 101
1.12.7 与旧版本文件的兼容性问题:匹配 102
1.12.8 “函数”属性 103
1.12.9 技巧和提示 103
1.12.10 思考 104
1.12.11 结论 104
1.12.12 参考文献 104
1.13 使用XML而不牺牲速度 Mark T. Price 106
1.13.1 为什么要使用XML呢? 106
1.13.2 简单介绍XDS Meta格式 107
1.13.3 XDS工具集 108
1.13.4 使用XDS工具集 109
1.13.5 整合 115
1.13.6 总结 115
1.13.7 参考文献 115
第2章 数学
简介 Jonathan Blow 118
2.1 使用马其赛特旋转的Zobrist散列法 TobyJones 120
2.1.1 Zobrist散列 120
2.1.2 实现Zobrist散列 121
2.1.3 马其赛特旋转(Mersenne Twister) 122
2.1.4 马其赛特旋转的实现 123
2.1.5 结论 124
2.1.6 参考文献 124
2.2 抽取截锥体和camera信息 WaldemarCeles 125
2.2.1 平面变换(Plane Transformation) 125
2.2.2 抽取锥体信息 127
2.2.3 抽取camera信息 128
2.2.4 任意投影变换 130
2.2.5 实现 131
2.2.6 结论 132
2.2.7 参考文献 132
2.3 解决大型游戏世界坐标中的精度问题 Peter Freese 133
2.3.1 问题描述 133
2.3.2 可能的解决方式 135
2.3.3 偏移位置 137
2.3.4 渲染流水线变化 140
2.3.5 对性能的思考 143
2.3.6 结论 143
2.3.7 参考文献 144
2.4 非均匀样条 Thomas Lowe 145
2.4.1 样条的种类 145
2.4.2 三次样条的基础理论 146
2.4.3 圆形的非均匀样条 147
2.4.4 平滑非均匀样条 149
2.4.5 时控的非均匀样条 151
2.4.6 计算起始和最终节点速率 152
2.4.7 在样条上获取速率和加速度 153
2.4.8 优化 153
2.4.9 结论 153
2.4.10 参考文献 154
2.5 用协方差矩阵计算更贴切的包围对象 Jim Van Verth 155
2.5.1 协方差矩阵 155
2.5.2 特征值和特征向量 158
2.5.3 计算协方差矩阵的特征向量 159
2.5.4 创建包围对象 159
2.5.5 结论 161
2.5.6 参考文献 162
2.6 应用于反向运动的雅可比转置方法 Marco Spoerl 163
2.6.1 我们的测试环境 163
2.6.2 雅可比矩阵是什么? 164
2.6.3 雅可比转置矩阵简介 165
2.6.4 实现算法 166
2.6.5 结果和比较 168
2.6.6 结论 171
2.6.7 参考文献 171
第3章 物理
简介 Graham Rhodes 174
3.1 死神的十指:战斗中的命中算法 Roger Smith、DonStoner 176
3.1.1 射击带状物(Ribbon) 176
3.1.2 射击靶心 177
3.1.3 射击矩形 178
3.1.4 使用霰弹枪射击小目标 179
3.1.5 移动炮兵的攻击命中 179
3.1.6 死亡的4种主要形式 180
3.1.7 化学武器、火球及区域性魔法 182
3.1.8 弹片的楔入 182
3.1.9 攻击丛林 183
3.1.10 攻击有猎物分布的丛林 183
3.1.11 结论 184
3.1.12 参考文献 184
3.2 在低速CPU系统中交通工具的物理模拟 MarcinPancewicz、Paul Bragiel 185
3.2.1 技术的概要和前提假设 185
3.2.2 交通工具沿当前行驶方向上的加速及减速 186
3.2.3 方向控制 188
3.2.4 把所有要素结合起来 189
3.2.5 地形的影响 189
3.2.6 实现中遇到的问题 190
3.2.7 可以改进的地方 191
3.2.8 结论 192
3.3 编写基于Verlet积分方程的物理引擎 NickPorcino 193
3.3.1 关于物理引擎 193
3.3.2 刚体 194
3.3.3 积分器 194
3.3.4 物理引擎 196
3.3.5 针对特定平台的考虑 199
3.3.6 扩展引擎的功能 199
3.3.7 结论 200
3.3.8 参考文献 200
3.4 刚体动力学中的约束器 Russ Smith 201
3.4.1 基本要点 201
3.4.2 约束器构造模块 202
3.4.3 创建有用的游戏约束器 205
3.4.4 光盘中的内容 209
3.4.5 结论 209
3.4.6 参考文献 209
3.5 在动力学模拟中的快速接触消除法 ádám Moravánszky、Pierre Terdiman 210
3.5.1 减少接触 210
3.5.2 对预处理的详细分析 213
3.5.3 对接触的分组群的详细分析 214
3.5.4 对持续性的详细分析 217
3.5.5 结论 217
3.5.6 参考文献 218
3.6 互动水面 Jerry Tessendorf 219
3.6.1 线性的波浪 220
3.6.2 垂直导数操作符 221
3.6.3 波浪的传播 222
3.6.4 可以互动的障碍物及其发生源 224
3.6.5 环境波浪 225
3.6.6 网格的边界 225
3.6.7 表面张力 226
3.6.8 结论 226
3.6.9 参考文献 226
3.7 用多层物理模拟快速变形 Thomas Di Giacomo、Nadia Magnenat-Thalmann 228
3.7.1 基于物理的动画LOD及相关的工作 228
3.7.2 使用分层的质量块弹簧物理的快速变形 230
3.7.3 结论 235
3.7.4 参考文献 2363.8 快速且稳定的形变之模态分析 James F. O'Brien 237
3.8.1 模式分解 239
3.8.2 模式的理解和丢弃 241
3.8.3 模态模拟 242
3.8.4 总结 244
3.8.5 结论 244
3.8.6 参考文献 245
第4章 人工智能
简介 Paul Tozour 248
4.1 第三人称视角摄像镜头的运动规则 Jonathan Stone 250
4.1.1 Camera定位及运动 250
4.1.2 Camera与场景边界 253
4.1.3 Camera遮断 256
4.1.4 简化场景 258
4.1.5 结论 258
4.1.6 参考文献 258
4.2 叙述战斗:利用AI增强动作游戏中的张力 BorutPfeifer 260
4.2.1 戏剧张力 260
4.2.2 系统概述 263
4.2.3 设计者的控制部分 263
4.2.4 难度计算 264
4.2.5 难度调节 265
4.2.6 系统评价 266
4.2.7 结论 267
4.2.8 参考文献 267
4.3 非玩家角色决策:处理随机问题 Karén Pivazyan 268
4.3.1 概要 268
4.3.2 动态规划算法 269
4.3.3 代码 273
4.3.4 优化 275
4.3.5 DP算法的其他应用 275
4.3.6 结论 276
4.3.7 参考文献 276
4.4 一个基于效用的面向对象决策架构 John Hancock 277
4.4.1 决策树 278
4.4.2 基于对象的更好的体系结构 278
4.4.3 期望值 280
4.4.4 其他的决策准则 281
4.4.5 结论 282
4.4.6 参考文献 283
4.5 一个分布式推理投票架构 John Hancock 284
4.5.1 分布式推理 284
4.5.2 操纵仲裁者(Steering Arbiter)范例 286
4.5.3 选择投票空间 289
4.5.4 结论 290
4.5.5 参考文献 291
4.6 吸引子和排斥子 John M. Olsen 292
4.6.1 合力 292
4.6.2 引力曲线 293
4.6.3 吸引曲线的和 294
4.6.4 对应于特定配对的特定曲线 295
4.6.5 动态曲线 295
4.6.6 点、线、面 297
4.6.7 AI控制的层次 298
4.6.8 动画系统的交互 298
4.6.9 移动(Steering) 299
4.6.10 结论 299
4.6.11 参考文献 299
4.7 高级RTS游戏造墙算法 Mario Grimani 301
4.7.1 算法 301
4.7.2 算法改进 302
4.7.3 输出链表的形式 306
4.7.4 结论 307
4.7.5 参考文献 307
4.8 利用可编程图形硬件处理人工神经元网络 Thomas Rolfes 308
4.8.1 CPU与GPU系统架构 308
4.8.2 人工神经元网络 309
4.8.3 实现 310
4.8.4 结论 311
4.8.5 参考文献 311
第5章 图形图像
简介 Alex Vlachos 314
5.1 具有海报质量的屏幕截图 Steve Rabin 316
5.1.1 提高分辨率 316
5.1.2 提升像素质量 318
5.1.3 使用一个磁盘均衡采样分布 320
5.1.4 为抗锯齿调整像素的采样宽度 321
5.1.5 增加分辨率同增加像素质量相结合 321
5.1.6 结论 323
5.1.7 参考文献 324
5.2 非封闭网络模型的GPU容积阴影构架 WarrickBuchanan 325
5.2.1 回到制图板 325
5.2.2 在顶点阴影中实现这项技术 326
5.2.3 需要注意的事项 329
5.2.4 结论 330
5.2.5 参考文献 330
5.3 透视阴影贴图 Marc Stamminger 331
5.3.1 引言 331
5.3.2 后透视空间 332
5.3.3 后透视空间中的光 334
5.3.4 透视阴影贴图 335
5.3.5 实现 338
5.3.6 结论 339
5.3.7 参考文献 340
5.4 结合使用深度和基于ID的阴影缓冲 KurtPelzer 341
5.4.1 已有的阴影映射技术 341
5.4.2 深度和基于ID的阴影缓冲 342
5.4.3 结合深度和ID缓冲 343
5.4.4 组合的阴影缓冲概述 344
5.4.5 第一次:从光照的视点渲染 345
5.4.6 第二次:阴影检测 347
5.4.7 在DX9 2.0级的阴影中的实现 351
5.4.8 结论 353
5.4.9 参考文献 353
5.5 在场景中投射静态阴影 Alex Vlachos 355
5.5.1 前期工作 355
5.5.2 光束基本知识 355
5.5.3 高级算法 356
5.5.4 T型连接 357
5.5.5 网格模型最优算法 358
5.5.6 实现细节 359
5.5.7 阴影中的动态物体 360
5.5.8 结果 360
5.5.9 结论 361
5.5.10 参考文献 361
5.6 为阴影体和优化的网格模型调整实时光照 Alex Vlachos、Chris Oat 362
5.6.1 光照问题 362
5.6.2 在面法线上操作 362
5.6.3 调整漫射光照 364
5.6.4 结论 366
5.6.5 参考文献 366
5.7 实时半调色法:快速而简单的样式化阴影 Bert Freudenberg、Maic Masuch、Thomas Strothotte 367
5.7.1 引言 367
5.7.2 原理 368
5.7.3 实例的实现 371
5.7.4 结论 372
5.7.5 参考文献 372
5.8 在3D模型中应用团队色的各种技术 GregSeegert 373
5.8.1 什么是团队色? 373
5.8.2 团队色的算法 373
5.8.3 一个实际的例子 378
5.8.4 光盘中的内容 379
5.8.5 结论 379
5.9 快速的棕褐色色调转换 Marwan Y. Ansari 380
5.9.1 背景 380
5.9.2 常规的方法 380
5.9.3 优化 381
5.9.4 结论 382
5.9.5 参考文献 382
5.10 使用场景亮度采样实现动态的Gamma Michael Dougherty、Dave McCoy 383
5.10.1 光照系数 383
5.10.2 有限的动态范围 383
5.10.3 图像的优化 384
5.10.4 易变的光灵敏度 385
5.10.5 转换 386
5.10.6 算法 388
5.10.7 结论 392
5.11 热和薄雾的后处理效果 Chris Oat、NatalyaTatarchuk 393
5.11.1 热和闪光的薄雾 393
5.11.2 高级算法 393
5.11.3 计算失真值 394
5.11.4 失真值的解释 397
5.11.5 结论 400
5.11.6 参考文献 400
5.12 用四元数的硬件蒙皮 Jim Hejl 401
5.12.1 蒙皮的概念 402
5.12.2 四元数参数化 404
5.12.3 硬件实现 405
5.12.4 结论 407
5.12.5 参考文献 407
5.13 动作捕捉数据的压缩 Sφren Hannibal 409
5.13.1 处理的计划 409
5.13.2 组织数据通道 410
5.13.3 减少已储存的键的数量 410
5.13.4 包装剩余的键 412
5.13.5 运行时解压缩 412
5.13.6 未来的改进 413
5.13.7 结论 413
5.13.8 参考文献 413
5.14 基于骨骼的有关节的3D角色的快速碰撞检测 OliverHeim、Carl S. Marshall、Adam Lake 414
5.14.1 碰撞检测与碰撞分解 414
5.14.2 术语 414
5.14.3 将碰撞检测集成到3D游戏引擎中 415
5.14.4 基于骨骼的快速碰撞检测算法 416
5.14.5 结论 423
5.14.6 感谢 423
5.14.7 参考文献 423
5.15 使用地平线进行地形的遮挡剔除 Glenn Fiedler 424
5.15.1 引言 424
5.15.2 地平线剔除基础 425
5.15.3 蛮力地平线剔除 426
5.15.4 近似值 426
5.15.5 近似地平线直线 427
5.15.6 一个更好的近似值 427
5.15.7 最小二次方线 428
5.15.8 将它放入到第三维中 429
5.15.9 最小二次方平面 430
5.15.10 用近似值的地平线剔除 431
5.15.11 被地形遮挡的对象 432
5.15.12 使它成为动态的 432
5.15.13 未来的方向 433
5.15.14 结论 433
5.15.15 参考文献 433
第6章 网络和多人游戏
简介 Pete Isensee 436
6.1 设计与开发游戏大厅 Shekhar Dhupelia 437
6.1.1 状态-事件系统的设计 437
6.1.2 探讨大厅的子系统 438
6.1.3 高级大厅子系统 439
6.1.4 结论 441
6.1.5 参考文献 442
6.2 支持成千上万个客户端的服务器 Adam Martin 443
6.2.1 服务器设计中的门槛 443
6.2.2 问题 444
6.2.3 主要技术 446
6.2.4 服务器设计 451
6.2.5 结论 452
6.2.6 参考文献 452
6.3 大型多人游戏状态的有效存储 Justine Quimby 454
6.3.1 MMP的问题 454
6.3.2 Qualities理论 455
6.3.3 Qualities API 456
6.3.4 使用Qualities的好处 459
6.3.5 结论 459
6.3.6 参考文献 460
6.4 在客户/服务器环境下运用并行状态机 Jay Lee 461
6.4.1 独立状态 461
6.4.2 角色状态管理器 463
6.4.3 使用CharacterStateMgr 464
6.4.4 保持客户端和服务器端的同步 464
6.4.5 状态依赖的子系统 466
6.4.6 结论 467
6.4.7 参考文献 467
6.5 位打包:一种网络压缩技术 Pete Isensee 468
6.5.1 一个实例 468
6.5.2 难点 469
6.5.3 位打包 469
6.5.4 用于可打包数据类型的通用接口 471
6.5.5 用于可打包数据类型的具体接口 471
6.5.6 编解码器 472
6.5.7 评价折衷 473
6.5.8 改进 473
6.5.9 结论 473
6.5.10 参考文献 474
6.6 多服务器网络游戏的时间和同步管理 石卫东(Larry Shi)、Tao Zhang 475
6.6.1 为什么需要时间和同步管理 475
6.6.2 时钟同步 475
6.6.3 同步和响应 476
6.6.4 用多时间管理来一石二鸟地实现同步和响应 476
6.6.5 实现 476
6.6.6 何时应使用多时管理 482
6.6.7 总结 482
6.6.8 致谢 482
6.6.9 参考文献 482
第7章 音频
简介 Eddie Edwards 486
7.1 OpenAL简介 Joe Valenzuela 487
7.1.1 OpenAL API 487
7.1.2 有关OpenAL的实现 493
7.1.3 实现一致性指南 495
7.1.4 未来OpenAL的发展蓝图 496
7.1.5 总结 496
7.1.6 参考文献 496
7.2 简单的实时Lip-Synching系统 JakeSimpson 497
7.2.1 实现 497
7.2.2 动画方面需要注意的事项 498
7.2.3 声音音量的水印标记 499
7.2.4 注意 500
7.2.5 总结 500
7.3 动态变量和音频编程 James Boer 501
7.3.1 动态变量是什么? 501
7.3.2 动态变量类 501
7.3.3 在音频编程中使用动态变量 503
7.3.4 其他改进 506
7.3.5 结论 506
7.3.6 参考文献 506
7.4 创建一个音频脚本系统 Borut Pfeifer 507
7.4.1 游戏中音频的类别 508
7.4.2 工具 510
7.4.3 基于XML的音频标记库 510
7.4.4 脚本系统组件 512
7.4.5 进一步的工作 515
7.4.6 总结 515
7.4.7 参考文献 515
7.5 使用EAX和ZoomFX API的环境音效解决方案 Scott Velasquez 516
7.5.1 什么是环境音效 516
7.5.2 音频引擎的系统要求 517
7.5.3 潜在可听集(PAS,PotentiallyAudible Set) 518
7.5.4 EAX介绍 520
7.5.5 总结 528
7.5.6 参考文献 528
7.6 在游戏的物理引擎中控制实时声音 Frank Luchs 529
7.6.1 游戏引擎 529
7.6.2 混合声音合成 531
7.6.3 可听见对象的属性 532
7.6.4 对象形状的影响 532
7.6.5 对象材质的影响 533
7.6.6 撞击和碰撞 533
7.6.7 演示 533
7.6.8 总结 534
7.6.9 参考文献 534
游戏编程精粹5
第1章 通用编程
William E.Damon Ⅲ
面向编辑器的上下文相关HUD 3
Grex游戏公司,Adm Martin
解决方案 6
用户控制 10
参考文献 11
在游戏中解析文本数据 12
Aurelio Reis
开始之前 12
token到底是什么 12
编写词法分析器 13
工作原理 14
制定自己的格式 15
解析token列表 17
参考文献 18
基于组件的对象管理 19
Circle Studio公司,Bjarne Rene
除旧迎新 19
系统的创建 23
用模板实现一个可在C++中使用的反射系统 30
Artificial Mind& Movement公司,Dominic Fillion
第1部分:运行时类型信息 31
在RTTI的实现中使用模板 33
关于RTTI的其他修改建议 35
第2部分:属性对象 36
属性的存储 38
属性类型 38
属性注册钩子(Hook)函数 39
属性的注册 40
脚本应用 41
Tweaker应用 42
其他应用 42
参考文献 43
可加速BSP算法的球体树 44
Artificial Mind& Movement公司,Dominic Filion
BSP算法 44
创建BSP树 45
优化最初步骤 46
参考文献 51
改进后的视锥剔除算法 52
Frank PuigPlaceres
视锥剔除 52
传统的六面法 53
雷达法 54
这个点在视锥内部吗? 54
球体在哪里? 56
其他应用 57
进一步的改造 58
参考文献 60
通用的分页管理系统 61
Ignacio InceraCruz
老式的分页解决方案:一查到底 61
GP分页解决方案:只检查需要的 62
索引是关键 62
GPtile:空间中的块 65
The world:搜索空间 67
窗口:在GPworld中航行 69
多窗口,多用户 70
优化:多线程分页 71
参考文献 71
基于栈的大规模状态机 72
James Boer
传统状态机编码及相关问题 72
用C++方法解决游戏状态难题 74
状态接口类 75
状态的堆叠管理:为什么三维比二维好用 75
状态对象管理系统 76
参考文献 79
使用BSP树构造CSG几何体 80
Octavian MariusChincisan
CSG的布尔运算 80
为什么要使用BSP树 84
BSP树的实现 85
组合装配 86
参考文献 89
在游戏中集成Lua 90
eV Interactive公司,Matthew Harmon
Lua的概况 90
Lua与C语言的接口 92
在游戏中嵌入Lua 94
实时性方面的考虑 97
脚本管理框架 99
参考文献 102
用基于policy的设计改进Freelist 103
Nathan Mefford
Freelist概述 103
Policy:雷霆救兵 104
分解Freelist 106
实现Freelist:这是它吗? 107
选择最佳的policy 109
可能性 111
参考文献 113
实时远程调试信息日志生成器 114
Microids Canada公司,Patrick Duquette
对标准化的调试日志的需求 114
数据表示:你可看到我所看到的 115
本文提议的解决方案 115
游戏日志模块 117
可能的改进和扩展 118
参考文献 118
透明的类的保存和加载技巧 119
Patrick Meehan 
小窍门 119
FreezeMgr的实现 120
其他几个特性 124
如何使用范例 125
参考文献 126
高效且忽略缓存的ABT树实现方法 128
瑞士联邦理工学院(Swiss FederalInstitute of Technology,简称EPFL),虚拟现实实验室(virtual Reality Lab,简称VRLab),Sébastien Schertenleib
计算机内存结构 128
ABT树 129
确认阶段 134
参考文献 134
状态机的可视化设计 136
Scott Jacobs
为什么需要代码生成 136
让“可视”成为可能 137
状态的管理 138
系统组装 138
参考文献 141
泛型组件库 142
Warrick Buchanan
类型识别系统 142
工厂单例与子工厂 145
DLL工厂 145
组件接口 147
接口版本管理 147
定义组件及其接口 149
组件的使用 150
配置组件库 151
参考文献 151
选择自己的路线——菜单系统 152
Wendy Jones
为什么需要菜单系统 152
菜单系统的对象 153
参考文献 159
Naughty Dog公司,Eric Lengyel
在计算机图形学中使用几何代数 163
Chris Lomont
几何代数 164
线性代数 169
总结以及将来的方向 176
参考文献 177
最小加速度Hermite曲线 178
Tony Barrera,Barrera Kristiansen AB;G?vle大学创意媒体实验室AndersH乌普萨拉大学图像分析中心, Ewert Bengtsson
连接具有C1连续的最小弯曲曲线 180
封闭的最小弯曲的曲线 181
参考文献 182
动画中基于样条的时间控制 183
Red StormEntertainment公司,James M. Van Verth
一般的距离-时间函数 184
根据样条构造距离-时间函数 185
接口选择 191
参考文献 191
快速四元数近似插值 193
Andy Thomason
使用四元数来表示旋转 193
四元数旋转插值 195
近似算法 196
算法之间的比较 206
Squad相关的计算 207
延伸阅读 208
参考文献 208
极小极大数值近似 209
ChristopherTremblay
众所周知的优化 209
什么是理想的近似 210
极小极大近似的介绍 211
误差分析 214
进一步改进近似 215
参考文献 216
应用于镜面和入口的斜视锥 217
Eric Lengyel
平面的表示 217
投影矩阵 218
裁剪面的修改 219
OpenGL实现 221
Direct3D实现 224
参考文献 225
美国西北大学,Robin Hunicke
利用导航网格实现自动掩体寻找 230
Radical Entertainment公司,Borut Pfeifer
导航网格 230
开放目标寻路 231
搜索掩体位置 232
在掩体间行进 233
团队掩护行为 234
其他功能 235
参考文献 236
使用人工势场实现快速目标评级 237
Factor 5公司,Markus Breyer
基本思想 237
势值函数的评估 240
可视化 240
方向场的应用 241
多维扩展 242
利用Lanchester损耗模型来预测战斗结果 244
Page 44 Studios有限责任公司,John Bolton
场景1:全体混战 245
场景2:狭窄的石阶 247
场景3:炮战 248
场景4:关底Boss 250
关于战斗力的再讨论 251
局限性 252
参考文献 252
为游戏AI实现一个实用的智能规划系统 254
RelicEntertainment公司,Jamie C加拿大阿尔伯塔大学计算机科学系,Finnegan Southey
规划系统的框架 255
规划域 255
一个多主体规划器的例子 258
规划的搜索 262
几个应用问题 263
参考文献 266
针对多线程架构的决策树查询算法优化 268
Intel公司,Chuck DeSylva
注意事项 269
参考文献 273
利用并行虚拟机实现AI系统的并行开发 275
2015公司,Michael Ramsey
功能强大,但不白给 275
核心术语及概念 276
任务的创建 277
任务管理 279
PVM的实现 282
实际应用:即时战略游戏 283
强化游戏性 284
参考文献 286
超越A*算法 287
Xtrem Strategy游戏公司,Mario Grimani;Monolith Productions公司,Matthew Titelbaum
问题的定义 287
算法的改进 290
实现的细节 292
应用实例 292
性能方面的考虑 297
几个前沿问题 298
参考文献 299
实现最小重新规划开销的先进寻路算法:动态A*(D*)算法 301
Marco Tombesi
D*算法 302
D*算法的实现细节 302
在游戏中又如何呢? 305
参考文献 305
Red Storm娱乐公司,Mike Dickheiser
游戏物理中空气动力学的近似计算 310
美国应用研究联营公司(Applied ResearchAssociates Inc.),Graham Rhodes
背景知识 310
钝体上的作用力 313
流线体上的作用力 315
应用实例 318
参考文献 320
动态青草的模拟和其他自然环境特效 321
沃特卢大学,Rishi Ramraj
水面特效 321
青草的模拟 323
变化传播模型 324
树叶的模拟:模型的应用 325
参考文献 327
使用质点-弹簧模型获得真实的布料动画 328
塞维利亚大学,Juan M. Cordero
布料的离散表示 328
作用力 330
动态系统方法 333
仿真模拟 334
参考文献 335
适合游戏开发的实用柔体动画技术:受压柔体模型 336
波兰弗罗茨瓦夫大学,Maciej Matyka
简化的质点-弹簧模型 337
PSB模型背后的物理学 338
PSB模型的实现 339
典型的质点-弹簧模型 340
PSB步骤 341
体积计算 341
采用预估修正法的Heun积分 342
时间步长的计算速度 342
几个仿真实例 343
进一步的发展 344
源代码说明 345
参考文献 345
使用反馈控制系统让“布娃娃”活起来 347
苹果公司,Michael Mandel
现有的研究成果 347
仿真过程的控制 348
行为动作的创建 350
参考文献 351
预定式物理系统的设计 353
Daniel F.Higgins
什么是预定式物理系统 353
预定式物理引擎 356
打磨上光 360
龙卷风:一个好的开始 363
参考文献 366
预定式物理系统:相关技术及应用 367
Shawn Shoemaker
为什么要使用预定式物理系统 367
预定式物理系统 368
应用1:RTS游戏中建筑物的毁坏 369
应用2:跳跃 369
应用3:爆炸特效中的物体运动 370
应用4:浮力 371
应用5:伞兵 371
参考文献 373
三维汽车模拟器中真实的摄像机运动 374
匈牙利布达佩斯技术经济大学,控制工程与信息技术系,图形图像小组,Barnabás Aszódi,Szabolcs Czuczor
我们需要什么?物理法则 374
我们得到的是什么?偶尔不够真实的运动 375
考察摄像机的控制 376
终极决策:实现人类的行为 377
编程中涉及的问题 379
关于演示程序 382
ATI公司,Jason L. Mitchell
在现代GPU上渲染逼真的云彩 386
育碧公司,Jean-Fran?ois Dubé
制造噪音 386
云彩的密度 388
云彩的光照处理 389
参考文献 391
下雪吧,下雪吧,下雪吧(下雨吧) 392
微软公司(现就职于Google公司),NinianeW微软公司, Bretton Wade
使用纹理为粒子束建模 393
渲染雪或雨的视差 393
用锥体模拟摄像机的移动 394
合并到一个矩阵中 394
增加美工控制 395
参考文献 395
Widget:快速渲染和持久化小物体 396
Martin Brownlow
Widget的网格 396
高效地绘制widget 397
裁剪widget 401
参考文献 404
逼真的树木和森林的2.5维替用物 405
布达佩斯理工大学, Gábor Szijártó
以前的基于图像的方法 406
改进以前的方法 407
参考文献 413
无栅格的可控火焰 414
佛罗里达中心大学,计算机科学学院,NeeharikaAdabala;佛罗里达中心大学,计算机科学学院和电影与数字媒体学院,Charles E. Hughes
建模火焰 415
实时渲染 418
实例和讨论 419
参考文献 420
使用公告牌粒子构建强大的爆炸效果 422
美国任天堂公司,Steve Rabin
最初的闪光 422
放射的火苗 423
白色的热核心 424
强烈的火球 424
散发的烟雾 425
效果表 426
额外的感觉 426
效率问题 427
参考文献 428
渲染宝石的简单方法 429
ATI研究院公司,Thorsten Scheuermann
技术概览 429
法线和cubemap采样问题 430
传递的光能 430
参考文献 436
体积化的后期处理 437
A2M公司,Dominic Filion;摩托罗拉公司,Sylvain Boissé
体积化的后期处理 437
深度知识 438
使用shader作z比较 438
像素完美的裁剪 439
后期处理 440
最后一遍 440
多个体 440
参考文献 441
过程式关卡生成 442
北得克萨斯大学,Timothy Roden和Ian Parberry
大致的方法 442
关卡设计 442
使用预制的几何体 443
图的生成 444
把预制件映射到图中 446
可见性和碰撞检测 448
增加关卡内容 448
参考文献 449
重组shader 450
A2M公司,Dominic Filion
组合效果 450
处理组合爆炸 451
通过HLSL生成shader变体 452
整合重组的shader 454
通过shader建立完整的流水线 455
其他问题 455
参考文献 456
网络和多玩家
Shekhar Dhupelia
保持大型多人在线游戏大型、在线和永存 461
Tantrum游戏公司,Shea Street
快速浏览 461
大型化 462
保持在线 464
保持永存 465
参考文献 466
实现一个无缝的世界服务器 467
育碧公司,Patrick Duquette
一些定义 467
远程控制器,或如何管理服务器的启动时期 468
代理服务器 468
登录服务器 469
节点服务器 469
世界管理器 472
由此

我要回帖

更多关于 多媒体信息发布盒 的文章

 

随机推荐