之前我们向运营要求更多的导入,运营说每每开服导入流量,我们的留存并不高,拒绝更多流量导入。
刚刚完成的压力测试,我发现大量用户在集中时间内涌入服务器,创角进入游戏占用了90%的cpu时间,服务器基本没有cpu资源响应其他。
这是个很严重的问题,第一次的体验决定了这个玩家的感受,决定了游戏的留存。
阅读代码,创角和进入游戏的代码含有不少的同步数据库操作。怎么破?
我的想法是,开服前提前创建5000个角色和相应的玩法数据。创建时,系统分配一个角色数据,进入游戏,服务器仅仅需要一步数据库操作,更新此角色数据和帐号的关系。
开服,进入游戏效率低下解决
1思路
不要让多个用户进入游戏循环这个同步操作,产生竞争条件,延伸就是不使用一个线程一个世界,一个服务区多个线程分多个世界线的概念,使用一个线程几个场景,一个服务区一个世界。还是那么多用户,那是那么多线程,进入不同场景的用户进入不同的线程,争夺互斥资源的机率大大减小。
不在游戏循环内加载用户数据,或者保存用户数据
对于进入游戏不使用进入场景算法。单独设计,并增强为进入计算展开,一次计算多个用户进入(扫描在场用户针对多个进场用户)
2方案
0 账号的状态设置为 logining , login , logouting , logout 。
1 用户数据库读写分离,假设单独的用户数据加载服务器SERVERusrdata。登录授权完成后,在此加载用户数据。
2 SERVERusrdata上用户数据加载完成后,向客户端发送信号SINGALusrdata。
3 客户端接收信号SINGALusrdata,登录游戏服务器SERVERgame。
检查账号的状态,
logining ,logouting ,返回SINGALretry 3次后间隔更长时间
login ,不用拉取数据,切换账号会话,旧链接丢弃即可。
none , logout ,向SERVERusrdata拉取用户数据,设置为 logining
4 SERVERgame向SERVERusrdata拉取用户数据(保存在游戏同步循环外LOOP的内存区),
成功向客户端发送SINGALgameok,并安排LOOP内的任务,
失败向客户端发送SINGALgamefailse,
5 客户端收到SINGALgameok,do something;收到SINGALgamefailse,重复3,4,5
6 不同的LOOP执行step4安排的任务
计算位置和属性和战斗的同步
同一场景可以一次计算多个进入
设置状态为 login
7 loop
8 设置账号的状态为 logouting ,安排LOOP外的任务
9 保存用户数据结束,设置账号的状态为 logout