第1章 通用编程技术
简介 2
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
Ben Board
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
John Byrd
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
Adam Lake
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
Jan Kautz
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
David Fox
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
Phil Burk
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
Phil Burk
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
索引 554