一份多人(网络)游戏工程师的技能清单,按等级(Junior / Senior / Lead)和方向(客户端 / 服务器)划分。可以拿来对照自己的短板,或者作为团队招聘/成长路径的参考。
| 主技能 | 方向 | 等级 | 次技能(专精) | 方向 | 等级 |
|---|---|---|---|---|---|
| 面向对象编程 | 客户端 / 服务器 | Junior+ | C# | 客户端 / 服务器 | Junior+ |
| 脚本 | 客户端 / 服务器 | Junior+ | C++ | 客户端 / 服务器 | Junior+ |
| Linux | 服务器 | Junior+ | Python | 服务器 | Junior+ |
| Sockets | 客户端 / 服务器 | Junior+ | JavaScript(Node.js) | 服务器 | Junior+ |
| 关系型数据库(SQL) | 服务器 | Junior+ | epoll | 服务器 | Senior+ |
| 键值数据库(NoSQL) | 服务器 | Junior+ | MySQL / Percona | 服务器 | Junior+ |
| 分布式系统 | 服务器 | Senior+ | Redis / MongoDB / Couchbase | 服务器 | Junior+ |
| 基础设施设计 | 服务器 | Lead+ | Bash / PowerShell | 服务器 | Junior+ |
| 网络安全 | 客户端 / 服务器 | Senior+ | P2P | 客户端 / 服务器 | Senior+ |
| Web 开发 | 服务器 | Junior+ | Client-Server 模型 | 客户端 / 服务器 | Senior+ |
| 序列化 | 客户端 / 服务器 | Junior+ | Lockstep / 帧同步 | 客户端 / 服务器 | Senior+ |
| 云开发 | 服务器 | Senior+ | 网络插值 | 客户端 | Senior+ |
| 容器化 | 服务器 | Senior+ | JSON / Protobuf | 客户端 / 服务器 | Junior+ |
| TCP/IP | 客户端 / 服务器 | Junior+ | AWS / Azure / GCP | 服务器 | Senior+ |
| UDP | 客户端 / 服务器 | Junior+ | Docker | 服务器 | Senior+ |
| HTML | 服务器 | Junior+ |
帧同步是多人游戏里同步世界状态的一种思路:不同步「结果」,只同步「输入」,每个客户端拿到所有人的输入后各自跑同一套确定性模拟,算出来的世界必然一致。RTS、MOBA、格斗这类对象多、状态复杂的游戏常用它,因为带宽只和输入量挂钩,跟场上有多少单位无关。
什么样的游戏适合帧同步
- 玩家数在开局时固定,中途不允许新玩家加入。
- 对局有明确的结束点。沙盒、MMO 这类没有终点、随时进出的玩法不适合。
优缺点
优点
- 后端几乎不用写 gameplay 逻辑,省掉一大块服务器开发量。
- 带宽正比于「输入命令大小 × 玩家数」,与模拟对象数量无关——同步一百万个对象和同步一个对象花的带宽一样。
- 回放系统实现简单,回放文件也小:存下每帧输入就能完整重演。
按延迟、抖动、丢包三类问题归纳的网络优化要点,以及客户端侧常用的延迟掩盖手段。
网络延迟(Latency)的四个来源
- 处理延迟(Processing delay):路由器处理数据包本身花的时间。
- 传输延迟(Transmission delay):把比特写到物理介质上的时间。
- 尽量发大包:包越大,花在包头上的字节占比越低。
- 排队延迟(Queuing delay):包到达路由器的速度超过其处理速度时,会在路由器里排队。
- 发少量大包,而不是大量小包。
- 传播延迟(Propagation delay):信号在介质上「跑路」的时间,受物理距离限制,基本无法优化。