从走路说起
走路的五个步骤
- 角色A 移动
- 客户端A向服务器发送新的坐标信息(或方向指令)
- 服务端处理消息
- 服务端将角色A的新坐标转发给客户端B
- 客户端B收到消息并更新A的位置
五个阶段
- 连接 网络连接
- 登录中 账户校验 加载数据
- 游戏中 交互操作
- 登出中 保存数据
- 退出 登出
N + 1 个 socket 结构
n 为客户端的连接数 1个为服务端打开监听的套接字
Sknet 是c 和lua 语言编写的
单线程 事件模型 Reactor模式
多数小游戏 都是日活 3-5千 每天登录的人数 最多1000人同时在线
3秒一个操作 处理一条消息 2毫秒
1核 1000
8核 8000
分布式
聊天服务器 其实是转发服务器 接收到场景服务器发来的消息广播给所有场景服务器
让场景服务器(走路)连接聊天服务器 对于用户是服务端 对于聊天服务器是客户端 接收到聊天服务器 的数据后转发给用户
一致性问题
连接不稳定 需要处理好断线后的重连
断线期间的消息重发 断线后 进程间的状态不一致问题
需要给每个交易赋予唯一编号,
一张地图的极限
如何让一张图能支撑几千万的玩家
一般一个场景只能支持几十名玩家呢?
一般消息 延迟几毫米不重要
帧同步 对消息即时性要求很高
万物皆可 Actor
Actor并发模型 ,每个Actor互相隔离, 通过消息通信
著名的Skynet 就是Actor模型框架,常用来当游戏服务端引擎
每个actor 携带一个信箱 向其他actor 寄信,具体反应 处理取决于 收到信的actor
Erlang 和 Skynet 通过内部处理 让每个actor 都是轻量的
skynet入门
yum install -y git gcc autoconf readline-devel
git clone https://github.com/cloudwu/skynet.git
cd skynet
make linux #会下载第三方库 jemalloc 然后编译
案例
gateway