内容简介
网络多人游戏已经成为游戏产业的重要组成部分,本书是一本深入探讨关于网络多人游戏编程的图书。
全书分为13章,从网络游戏的基本概念、互联网、伯克利套接字、对象序列化、对象复制、网络拓扑和游戏案例、延迟、抖动和可靠性、改进的延迟处理、可扩展性、安全性、真实世界的引擎、玩家服务、云托管专用服务器等方面深入介绍了网络多人游戏开发的知识,既全面又详尽地剖析了众多核心概念。
本书的多数示例基于C++编写,适合对C++有一定了解的读者阅读。本书既可以作为大学计算机相关专业的指导教程,也可以作为普通读者学习网络游戏编程的参考指南。
目录
- 第1章 网络游戏概述 1
- 1.1 多人游戏的简要历程 1
- 1.1.1 本地多人游戏 1
- 1.1.2 早期网络多人游戏 1
- 1.1.3 多用户网络游戏 2
- 1.1.4 局域网游戏 3
- 1.1.5 在线游戏 3
- 1.1.6 大规模多人在线游戏 4
- 1.1.7 移动网络游戏 4
- 1.2 星际围攻:部落 5
- 1.2.1 平台数据包模块 7
- 1.2.2 连接管理器 7
- 1.2.3 流管理器 8
- 1.2.4 事件管理器 8
- 1.2.5 ghost管理器 8
- 1.2.6 移动管理器 9
- 1.2.7 其他系统 9
- 1.3 帝国时代 10
- 1.3.1 轮班计时器 11
- 1.3.2 同步 12
- 1.4 总结 13
- 1.5 复习题 13
- 1.6 延伸的阅读资料 14
- 第2章 互联网 15
- 2.1 起源:分组交换 15
- 2.2 TCP/IP模型 17
- 2.3 物理层 18
- 2.4 链路层 18
- 2.5 网络层 22
- 2.5.1 IPv4 23
- 2.5.2 IPv6 36
- 2.6 传输层 37
- 2.6.1 UDP 38
- 2.6.2 TCP 39
- 2.7 应用层 48
- 2.7.1 DHCP 49
- 2.7.2 DNS 49
- 2.8 NAT 50
- 2.9 总结 56
- 2.10 复习题 57
- 2.11 延伸的阅读资料 58
- 第3章 伯克利套接字 61
- 3.1 创建Socket 61
- 3.2 API操作系统差异 63
- 3.3 socket地址 66
- 3.3.1 类型安全 68
- 3.3.2 用字符串初始化sockaddr 70
- 3.3.3 绑定socket 73
- 3.4 UDP Socket 74
- 3.5 TCP Socket 79
- 3.5.1 通过连接的socket实现发送和接收 80
- 3.5.2 类型安全的TCP Socket 82
- 3.6 阻塞和非阻塞I/O 84
- 3.6.1 多线程 85
- 3.6.2 非阻塞I/O 86
- 3.6.3 Select 88
- 3.7 其他Socket选项 92
- 3.8 总结 94
- 3.9 复习题 94
- 3.10 延伸的阅读资料 95
- 第4章 对象序列化 97
- 4.1 序列化的需求 97
- 4.2 流 100
- 4.2.1 内存流 101
- 4.2.2 字节存储次序的兼容性 105
- 4.2.3 比特流 109
- 4.3 引用数据 115
- 4.3.1 内联或嵌入 116
- 4.3.2 链接 117
- 4.4 压缩 119
- 4.4.1 稀疏数组压缩 120
- 4.4.2 熵编码 121
- 4.4.3 定点 123
- 4.4.4 几何压缩 125
- 4.5 可维护性 127
- 4.5.1 抽象序列化方向 127
- 4.5.2 数据驱动的序列化 129
- 4.6 总结 132
- 4.7 复习题 133
- 4.8 延伸的阅读资料 134
- 第5章 对象复制 135
- 5.1 世界状态 135
- 5.2 复制对象 135
- 5.2.1 对象创建注册表 139
- 5.2.2 一个数据包中的多个对象 143
- 5.3 朴素的世界状态复制方法 144
- 5.4 世界状态中的变化 148
- 5.5 RPC作为序列化对象 155
- 5.6 自定义解决方案 158
- 5.7 总结 159
- 5.8 复习题 160
- 5.9 延伸的阅读资料 160
- 第6章 网络拓扑和游戏案例 161
- 6.1 网络拓扑 161
- 6.1.1 客户端-服务器 161
- 6.1.2 对等网络 163
- 6.2 客户端-服务器的实现 165
- 6.2.1 服务器和客户端的代码分离 166
- 6.2.2 网络管理器和欢迎新客户端 167
- 6.2.3 输入共享和客户端代理 172
- 6.3 对等网络的实现 177
- 6.3.1 欢迎新对等体和开始游戏 179
- 6.3.2 命令共享和锁步回合制 181
- 6.3.3 保持同步 187
- 6.4 总结 192
- 6.5 复习题 192
- 6.6 延伸的阅读资料 193
- 第7章 延迟、抖动和可靠性 195
- 7.1 延迟 195
- 7.1.1 非网络延迟 195
- 7.1.2 网络延迟 198
- 7.2 抖动 199
- 7.3 数据包丢失 201
- 7.4 可靠性:TCP还是UDP 202
- 7.5 数据包传递通知 204
- 7.5.1 标记传出的数据包 205
- 7.5.2 接收数据包并发送确认 206
- 7.5.3 接收确认并传递状态 211
- 7.6 对象复制可靠性 216
- 7.7 模拟真实世界的条件 224
- 7.8 总结 226
- 7.9 复习题 227
- 7.10 延伸的阅读资料 228
- 第8章 改进的延迟处理 229
- 8.1 沉默的客户终端 229
- 8.2 客户端插值 231
- 8.3 客户端预测 233
- 8.3.1 航位推测法 236
- 8.3.2 客户端移动预测和重放 238
- 8.3.3 通过技巧和优化隐藏延迟 243
- 8.4 服务器端回退 244
- 8.5 总结 245
- 8.6 复习题 246
- 8.7 延伸的阅读资料 246
- 第9章 可扩展性 247
- 9.1 对象范围和相关性 247
- 9.1.1 静态区域 248
- 9.1.2 使用视锥 249
- 9.1.3 其他可见性技术 250
- 9.1.4 不可见时的相关性 252
- 9.2 服务器分区 253
- 9.3 实例化 255
- 9.4 优先级和频率 255
- 9.5 总结 256
- 9.6 复习题 257
- 9.7 延伸的阅读资料 257
- 第10章 安全性 259
- 10.1 数据包嗅探 259
- 10.1.1 中间人攻击 259
- 10.1.2 在主机上的数据包嗅探 262
- 10.2 输入验证 263
- 10.3 软件作弊检测 264
- 10.3.1 维尔福反作弊系统 265
- 10.3.2 典狱长反作弊系统 266
- 10.4 保护服务器 267
- 10.4.1 分布式拒绝服务攻击 267
- 10.4.2 坏数据 267
- 10.4.3 时序攻击 268
- 10.4.4 入侵 269
- 10.5 总结 270
- 10.6 复习题 271
- 10.7 延伸的阅读资料 271
- 第11章 真实世界的引擎 273
- 11.1 虚幻引擎4 273
- 11.1.1 套接字和基本的网络体系 273
- 11.1.2 游戏对象和拓扑 274
- 11.1.3 Actor复制 275
- 11.1.4 远程过程调用 276
- 11.2 Unity 277
- 11.2.1 传输层API 278
- 11.2.2 游戏对象和拓扑 278
- 11.2.3 生成对象和复制 279
- 11.2.4 远程过程调用 279
- 11.2.5 比赛安排 280
- 11.3 总结 280
- 11.4 复习题 281
- 11.5 延伸的阅读资料 281
- 第12章 玩家服务 283
- 12.1 选择一种玩家服务 283
- 12.2 基本设置 283
- 12.2.1 初始化、运行和关闭 285
- 12.2.2 用户ID和名称 286
- 12.3 游戏大厅和比赛安排 287
- 12.4 网络 291
- 12.5 玩家统计 294
- 12.6 玩家成就 299
- 12.7 排行榜 300
- 12.8 其他服务 302
- 12.9 总结 303
- 12.10 复习题 303
- 12.11 延伸的阅读资料 304
- 第13章 云托管专用服务器 305
- 13.1 托管或不托管 305
- 13.2 行业工具 306
- 13.2.1 REST 307
- 13.2.2 JSON 307
- 13.2.3 Node.JS 308
- 13.3 概述和术语 308
- 13.3.1 服务器游戏实例 309
- 13.3.2 游戏服务器进程 309
- 13.3.3 游戏服务器 310
- 13.3.4 硬件 311
- 13.4 本地服务器进程管理器 311
- 13.5 虚拟机管理器 318
- 13.6 总结 327
- 13.7 复习题 328
- 13.8 延伸的阅读资料 328
- 附录A 现代C++基础 329