《腾讯游戏开发精粹Ⅲ》是腾讯游戏研发团队不断积累沉淀的技术结晶,是继 2019年推出《腾讯游戏开发精粹I》和《《腾讯游戏开发精粹II》后的诚意续作。本书收录了 21 个在上线项目中得到验证的技术方案,深入介绍了腾讯公司在游戏开发领域的新研究成果和新技术进展,涉及人工智能、计算机图形、动画和物理、客户端架构和技术、服务端架构和技术及管线和工具等多个方向。本书适合游戏从业者、游戏相关专业师生及对游戏幕后技术原理感兴趣的普通玩家。
腾讯游戏学堂是腾讯游戏设立的致力于打造游戏知识分享和行业交流的平台,通过游戏行业专业人才培养、高校产学研合作、行业交流及开发者生态建设等,推动游戏行业良性发展,以能力生长,助游戏创作。
第1章 适用于MOBA游戏的帧同步移动预表现方案 1
1.1 网络游戏的客户端预表现技术 1
1.2 帧同步及客户端预表现原理 2
1.2.1 帧同步的原理与流程 2
1.2.2 逻辑与表现分离 3
1.2.3 客户端预表现基本流程 5
1.3 帧同步下的移动预表现实现方案 6
1.3.1 预测移动的基本表现要素 8
1.3.2 移动预表现与技能衔接处理 8
1.3.3 预测位置的修正 10
1.3.4 墙体和动态阻挡 14
1.4 移动手感指标与实验 15
1.5 总结 17
第2章 基于网格的视野技术方案 18
2.1 实现及原理 19
2.1.1 离线处理 21
2.1.2 运行时处理 25
2.1.3 渲染迷雾 28
2.2 性能优化 29
2.2.1 内存优化 30
2.2.2 计算性能优化 32
2.3 总结 33
第3章 移动端App集成UE的实践 34
3.1 移动端App集成UE简介 34
3.1.1 价值、意义和对手机QQ相关技术的影响 34
3.1.2 线上数据和成果展示 35
3.2 UE的SDK化之旅 35
3.2.1 启动器改造—集成移动端App的关键起点 36
3.2.2 针对移动端App特点的引擎生命周期改造 41
3.3 针对移动端App需求的引擎极致轻量化 44
3.3.1 包体优化:二进制代码文件 44
3.3.2 包体优化:资源文件 46
3.3.3 内存优化 52
3.4 应用功能的展示 58
3.4.1 QQ秀 58
3.4.2 游戏 59
3.4.3 聊天表情录制 60
3.5 总结 60
第4章 UE的Dedicated Server优化实践 61
4.1 DS管理优化 61
4.1.1 游戏服务架构 62
4.1.2 SeedDS模式优化方案 64
4.1.3 MultiWorld模式 69
4.2 Tick优化 74
4.2.1 引擎层Tick优化 74
4.2.2 逻辑层Tick优化 78
4.2.3 Tick优化小结 79
4.3 网络层优化 79
4.3.1 网络同步简介 80
4.3.2 DirtySystem的构建 80
4.3.3 网络相关性优化 83
4.4 业务层优化 87
4.4.1 动画优化 87
4.4.2 OverlapEvents实现分析和性能优化 90
4.5 总结 92
第5章 深入剖析高性能游戏数据库TcaplusDB的存储引擎 93
5.1 数据库存储引擎概述 93
5.2 LSH存储引擎的整体架构 94
5.2.1 LSH存储引擎的设计思想 94
5.2.2 LSH存储引擎架构设计 95
5.2.3 存储引擎的读写删流程 97
5.3 LSH存储引擎的实时自适应设计 99
5.3.1 LSH存储引擎的rehash 100
5.3.2 LSH存储引擎进行数据整理 102
5.4 引擎线程模型及动态负载均衡 105
5.4.1 TcaplusDB的线程模型 105
5.4.2 动态负载均衡算法 105
5.5 总结和展望 107
第6章 面向游戏的服务网格:Tbuspp2 108
6.1 微服务架构模型简介 108
6.2 游戏后台对服务网格的能力需求分析 109
6.2.1 游戏与Web服务后台运行模式的差异 110
6.2.2 为什么需要Tbuspp2 110
6.3 Tbuspp2设计 113
6.3.1 系统架构 113
6.3.2 领域建模 114
6.4 Tbuspp2核心实现机制 118
6.4.1 信令、数据独立信道,支持高效可靠信息交换 118
6.4.2 两级队列模型,提供功能扩展弹性 120
6.4.3 按需路由同步,从容支持大规模集群 122
6.4.4 Stateful Group治理,全面支持游戏后台需求 123
6.5 总结 128
第7章 混合语言程序的混合调用栈火焰图 129
7.1 混合语言程序 129
7.2 混合调用栈火焰图 130
7.2.1 性能热点与火焰图 130
7.2.2 原生调用栈获取问题 131
7.2.3 脚本调用栈获取问题 132
7.2.4 混合调用栈获取问题 134
7.2.5 混合调用栈火焰图监控服务 135
7.3 目标进程的调试控制 137
7.4 快速获取跨进程原生调用栈 140
7.4.1 优化Linux平台的原生调用栈获取 140
7.4.2 优化Windows平台的原生调用栈获取 144
7.4.3 addr2func的查询优化 146
7.4.4 Linux平台中UE的堆栈获取 148
7.5 安全获取跨进程脚本调用栈 150
7.5.1 获取执行环境指针 151
7.5.2 模拟调用栈回溯 154
7.6 合并脚本调用栈与原生调用栈 157
7.7 优化混合调用栈统计数据编码 158
7.8 混合调用栈火焰图获取总结 162
第8章 出海游戏的LQA工业化 163
8.1 LQA工业化背景简介 163
8.2 LQA工业化的过程及方法 166
8.2.1 LQA工业化的提取阶段 168
8.2.2 LQA工业化的翻译阶段 170
8.2.3 LQA工业化的合入阶段 171
8.2.4 LQA工业化的测试阶段 175
8.2.5 LQA工业化的大版本合并阶段 179
8.3 总结 182
第9章 在TPS类游戏中应用可微渲染进行资源转换与优化 183
9.1 在TPS类游戏中应用可微渲染简介 183
9.2 背景知识 184
9.2.1 什么是可微渲染 184
9.2.2 可微渲染的光栅化实现 185
9.2.3 可微渲染在游戏和虚拟现实行业中的应用 187
9.2.4 TPS类游戏的特点 187
9.3 基于可微渲染进行资源转换与优化的一般框架 189
9.4 可微渲染器的实现 190
9.4.1 可微渲染器基本功能的实现 190
9.4.2 游戏方面的修改与扩展 194
9.5 材质拟合相关处理 196
9.5.1 观察视角相关内容的处理 196
9.5.2 材质的处理 198
9.5.3 材质转换之后的效果 200
9.6 网格的处理 202
9.7 总结与展望 204
第10章 DirectX Shader Compiler适配UE4移动平台 205
10.1 着色器与变体 205
10.1.1 移动平台性能评估标准 205
10.1.2 DirectX Shader Compiler 207
10.2 适配UE 208
10.2.1 OpenGL & Vulkan RHI适配 208
10.2.2 Metal RHI适配 211
第11章 大规模复杂场景下光照烘焙面临的挑战及解决方案 219
11.1 光照烘焙的背景与现有解决方案 219
11.2 光照烘焙中大规模光源的管理方案 221
11.2.1 单个光源的选取 222
11.2.2 单个光源的采样 227
11.2.3 基于多重重要性采样的样本融合 228
11.2.4 方案的收益 229
11.3 烘焙中复杂光路下的采样优化 230
11.3.1 一种基于GPU实现的空间方向树的自适应路径引导算法 230
11.3.2 基于时空蓄水池的路径重采样算法 237
11.4 烘焙中的降噪器优化 241
11.4.1 基于双边滤波的自研光照贴图降噪器 241
11.4.2 结合双边滤波的Optix降噪器优化 246
第12章 光照烘焙中基于GPU实现的接缝修复方案 247
12.1 光照烘焙及接缝问题简介 247
12.2 相关背景知识 248
12.2.1 关键术语 248
12.2.2 光线追踪 249
12.2.3 联合双边滤波 249
12.2.4 SVGF 250
12.3 工业界现有光照烘焙接缝修复方案 251
12.4 实现细节 252
12.4.1 Seam Finder Pass 252
12.4.2 Seam Filter Pass 255
12.5 接缝修复效果对比 257
12.6 总结 259
第13章 VRS在移动端的集成与实践 260
13.1 VRS概述 260
13.2 VRS介绍 260
13.2.1 VRS的概念 261
13.2.2 VRS的原理 261
13.2.3 VRS的作用 262
13.3 着色率控制方式 263
13.3.1 Per-Draw 263
13.3.2 Per-Triangle 263
13.3.3 Per-Region 264
13.4 VRS中Per-Draw的集成 265
13.4.1 UE4中的VRS材质 266
13.4.2 VRS中的基元组件 270
13.4.3 VRS中的渲染硬件接口 273
13.5 VRS中Per-Draw的实践 276
13.5.1 将VRS用于具有低频细节材质的物体 276
13.5.2 将VRS用于快速移动的物体 277
13.5.3 将VRS用于近处的物体 279
13.6 总结与展望 281
第14章 基于帧预测的移动端高帧率性能优化技术 282
14.1 解决思路 283
14.2 生成预测帧的方法 285
14.2.1 使用深度在屏幕空间还原场景网格 287
14.2.2 顶点的重投影及走样的修复 289
14.2.3 帧预测的实现 292
14.3 适配帧预测的管线 298
14.3.1 以“渲染帧-预测帧”为一对的渲染管线 298
14.3.2 直接在渲染线程插补中间帧的渲染管线 300
14.4 适配帧预测管线的负载均衡方案 301
14.4.1 管线的渲染负载均衡 302
14.4.2 成对渲染管线中Game线程游戏逻辑的跳帧更新及
负载均衡方案 304
14.5 优化效果与总结 313
第15章 基于UE4的开放世界地形渲染 315
15.1 开放世界地形渲染简介 315
15.2 方案背景 316
15.3 方案设计思路 316
15.4 地形着色方式 318
15.4.1 Weightmap着色 318
15.4.2 MaterialID着色 319
15.4.3 Hybrid MaterialID着色 319
15.4.4 MaterialID编辑工具 320
15.5 地形渲染管线 321
15.5.1 UE4中的Landscape渲染流程 322
15.5.2 GPU Driven Terrain渲染流程 323
15.5.3 CPU端技术细节 324
15.5.4 GPU端技术细节 326
15.6 效果收益与性能分析 332
15.6.1 测试场景 332
15.6.2 Metal平台性能数据 333
15.6.3 OpenGL ES平台性能数据 333
15.7 总结 335
第16章 游戏中的极端天气渲染 336
16.1 游戏中的天气 336
16.2 认识风暴云 337
16.3 中央气旋分析与建模 338
16.3.1 风暴位置与大小 339
16.3.2 风暴眼的形态 340
16.3.3 风暴流动与旋转 345
16.3.4 风暴眼的垂直结构 349
16.3.5 风暴色彩与氛围 351
16.4 流体模拟 352
16.4.1 流体在数学上的表达 353
16.4.2 密度场扩散过程 354
16.4.3 体积云的流体模拟 356
16.5 体积散射与风暴云光照 358
16.5.1 光照方程 358
16.5.2 相函数 360
16.5.3 风暴云光照 362
16.6 闪电与内部光照 365
16.6.1 闪电光照拟合 365
16.6.2 闪电形态 366
16.7 环境交互 367
16.7.1 投影 368
16.7.2 自定义缓冲 368
第17章 移动端贴图压缩优化 371
17.1 ZTC纹理压缩 371
17.2 移动端常见压缩格式回顾 371
17.2.1 ETC1 372
17.2.2 ETC1s 374
17.2.3 ASTC 374
17.2.4 PVRTC 376
17.2.5 ETC1和ASTC的问题 377
17.3 ZTC格式设计 377
17.3.1 支持更多的块尺寸 378
17.3.2 块分区 378
17.3.3 Endpoint Direction(PCA)优化 379
17.3.4 亮度码本修订 380
17.3.5 RGBA格式的压缩 380
17.3.6 基于双线性插值的编码 381
17.4 ZTC数据计算 382
17.4.1 优化base color 383
17.4.2 匹配partition 383
17.4.3 边界拟合 383
17.4.4 ZTC转码ASTC 384
17.4.5 未来的工作 385
17.5 ZTC测试 385
17.5.1 RGB 386
17.5.2 Normal 386
17.5.3 RGBA 387
17.6 总结 388
第18章 显存管理 389
18.1 内存管理 389
18.1.1 内存碎片 389
18.1.2 内存分配算法 390
18.2 通用显存管理 392
18.2.1 为什么要实现通用显存管理 392
18.2.2 VMA介绍 393
18.2.3 VMA显存分配 393
18.2.4 VMA显存碎片整理 402
18.3 专用显存管理 403
18.3.1 GPU Driven显存管理需求 403
18.3.2 GPU Driven显存分配 404
18.3.3 显存碎片整理 406
第19章 基于Vulkan Ray Query的移动端光线追踪反射效果 409
19.1 移动平台的光线追踪特性简介 409
19.1.1 支持光线追踪的图形API 410
19.1.2 光线追踪管线和光线查询 410
19.2 基于光线查询的材质系统 411
19.2.1 现有实现及其局限性 412
19.2.2 可见性缓冲区 414
19.2.3 材质系统的实现 415
19.3 光线追踪反射 422
19.3.1 世界空间法线纹理和Thin GBuffer 423
19.3.2 实现原理 425
19.3.3 结果与分析 428
19.4 总结 429
第20章 移动端全局光照演变的思考与实践 430
20.1 什么是全局光照 430
20.2 静态光照烘焙 431
20.2.1 光照贴图 431
20.2.2 光照探针 432
20.2.3 静态光照烘焙的局限性与优势 433
20.3 基于预计算传输的全局光照 434
20.3.1 如何让光照动起来 434
20.3.2 预计算辐射传输 434
20.3.3 数据存储的优化 435
20.3.4 基于预计算的半动态GI的局限性 436
20.4 动态全局光照SmartGI 437
20.4.1 移动端全动态GI方案的挑战 437
20.4.2 已有全动态GI方案的分析 437
20.4.3 使用混合架构实现全动态GI的基本框架 438
20.4.4 使用屏幕空间数据做光照缓存 439
20.4.5 使用体素化数据做光照缓存 440
20.4.6 使用离散图元做光照缓存 442
20.4.7 多光照缓存的收集 444
20.4.8 全动态GI的性能优化 446
20.4.9 全动态GI的渲染效果 452
20.5 未来的展望与思考 455
20.5.1 GI算法的持续迭代 455
20.5.2 移动端硬件能力的持续演变和提升 456
第21章 动作匹配及神经动画技术 457
21.1 背景介绍 457
21.1.1 自然动画的目标 459
21.1.2 骨骼动画 460
21.1.3 游戏动画中的根骨骼 460
21.1.4 骨骼动画中的正向动力学 461
21.1.5 骨骼动画中的反向动力学 462
21.1.6 游戏动画中的状态机 464
21.2 动作匹配 465
21.2.1 动作捕捉中的数据采集 467
21.2.2 设计动作捕捉中的数据采集的脚本 468
21.2.3 未来轨迹的预测 469
21.2.4 动作姿态特征提取 471
21.2.5 运动数据的混合 472
21.2.6 动作匹配技术总结 473
21.3 基于学习的动作匹配 473
21.3.1 匹配数据的神经网络压缩 473
21.3.2 将动作匹配中涉及的三个网络进行连接 474
21.3.3 神经相位动画技术 475
21.4 游戏动画中的多风格技术 481
21.4.1 游戏动画中的多风格及数据采集 481
21.4.2 多风格网络设计 482
21.4.3 风格效果 484
21.5 小结 485
第22章 深度照片还原——Light Stage人像数字扫描管线 486
22.1 人像扫描介绍 486
22.2 拍摄 488
22.2.1 Light Stage拍摄 488
22.2.2 LookDev拍摄 489
22.3 数据处理 491
22.3.1 Light Stage数据处理 491
22.3.2 LookDev数据处理 493
22.4 三维重建 495
22.4.1 点云匹配 495
22.4.2 模型重构 496
22.4.3 贴图映射 496
22.5 美术制作 496
22.5.1 模型清理 497
22.5.2 模型包裹 498
22.5.3 PBR贴图生成 499
22.5.4 细节纹理贴图 499
22.5.5 高模制作 502
22.5.6 烘焙 503
22.5.7 贴图制作 503
22.6 LookDev 506
22.6.1 毛发制作 506
22.6.2 光照环境匹配 509
22.6.3 Maya Arnold 513
22.6.4 Unreal Substrate 516
22.6.5 Unreal MetaHuman 520
22.7 总结 526
第23章 语音驱动的面部动画生成算法 527
23.1 解决方案与核心技术 527
23.1.1 面部动画驱动技术 528
23.1.2 口型表情动画生成技术 528
23.2 基于音素方案的实现流程 531
23.2.1 总体流程 531
23.2.2 音素、视素、动作单元的概念 532
23.2.3 从音频文件到口型动画的基础实现 538
23.2.4 解决协同发音的难题 542
23.3 其他辅助效果 547
23.3.1 与情绪的结合 547
23.3.2 手势、挑眉、身体姿态的配合 548
23.3.3 最终效果 551
23.4 总结 552