首页 » 技术分享 » 关于测试机器人的记录

关于测试机器人的记录

 

这个月零零碎碎都不知道干了些什么 对接的多

主要做了机器人 测试服务器的 要感谢同事之前的工作 我也是在基础上进行的

mmo 主要瓶颈在于网络处理

机器人模拟玩家进行游戏,主要流程当然是登录选择角色,进入游戏,移动,打怪

,获取装备,穿上装备,跑npc,接任务,完成任务。我们主要的目的是让机器人模拟玩家 跑完主线任务即可

游戏内容模拟玩家方面,完成任务,接收任务,获取装备 这三个走gm命令

打怪 走到怪物附近,在技能范围内 释放技能,给服务器发送各种指令

聊天等同样,从配置文件中获取,取随机发言内容,发到公屏

移动依然采用原来的办法,发送移动指令,收到服务器返回,发送下一步移动

下面主要说下结构。

我的想法是,网络部分,一个机器人一个tcp连接,我们游戏上本来就是一个玩家一个连接,

游戏服务器比如连接500个玩家,那么他维护500条连接,假设玩家是均匀分布在不同的地图,

不同线程,他们也不是同时发送消息比如移动,对这500条连接,用多路复用select epoll

20个线程,500人的话一个多路复用器管理25个连接,某个链接需要读了 需要写了,multiplexor

分配给连接对应的processor进行处理,processor也是20个线程,一个processor负责25个连接的消息处理

这样做,消息处理和消息读取 不在一个线程,目的是不让消息处理阻塞网络并发部分的速度。

游戏服的特点是下发消息非常大,收到来自玩家的消息比较少,下行远大于上行,因为AOI的消息很多

同屏情况下 100个玩家移动一步,服务器收到上行消息100条,但是需要同步下发10000条,每个连接的消息

都给同步给视野内玩家,多路复用器大部分时间是在下发消息

机器人进程

加100个机器人,100条连接,我没有每个连接单独监听,也是使用了select epoll,

但是优势并不大,因为机器人测试,每个连接几乎一直在发送消息,一直活跃,同屏的情况每条连接要收到

更加海量的消息。select epoll适用于连接数很多,活跃百分比较少,这样才能充分体现多路复用的优势

机器人进程,上发给服务器的消息几乎一直有,移动消息几乎一直在发,打怪、跑任务、换装、聊天消息较少,

单连接几乎一致活跃,同时,服务器下发给机器人进程的消息,同屏情况下就非常非常大了。同屏情况下 200个机器人移动打怪,

机器人进程就已经开始卡,游戏服务器也开始出现瓶颈。

机器人逻辑采用简单的状态机,移动,打怪,休息,找任务,机器人逻辑线程默认10个,

线程数目的取舍,多路复用器我用了30个,processor30个,

线程多的时候,切换代价也是非常大的,多了反倒影响性能。

单独一个线程定时读取配置文件,比如更改机器人数目,登出多少机器人,机器人移动到某个地点

打怪,做任务的概率配置等,改变配置文件,改变机器人的群体行为

复用器,处理器,机器人逻辑线程数目,启动时候也从这里读

现在的话,测试方面同屏200人,极限了。我是本地windows服务器测试的,还没在linux上测,

卡的时候也搞不清unity客户端对下发消息处理的问题,还是机器人进程的问题,还是真的游戏服务器扛不住了。

另外模拟真实情况,玩家多地图分布,整体容纳人数还没有进行测试。理论上一个服容纳1000个玩家还是可以的

接下来几天再详细测一下。 

之前有一个问题是几十个机器人,进程cpu占用率飙到了100,一直没找到原因,

后来查找发现是多路复用器的线程的占用,为什么它会占CPU这么高,而且和人数无关,有时候几个人就这样了

网上一篇文章提醒了我,select水平触发模式,如果没有收到了消息,没有吧里面的内容recv,就会造成一直触发

想想也确实。select epoll监听socket句柄,内容不从内核拷贝到用户空间,它会一直认为有消息。

那就是消息处理那里的问题,后来发现是接收那里逻辑写的不对,当粘包的时候会造成,下一次消息解析错误。

一般这种几率不大,除非一次服务器下发消息很大,一个包装不下,才会分开两个大包,这样我接收那里没有

处理好,就出现了问题,没有recv出来,导致select一直触发,cpu直接飙到了100,类似没有sleep的死循环

说的挺乱,唉,月初想重头研究下数据结构,学了几天平衡树,插入,删除,红黑树还是没有搞懂,高了一半

想哪一天有时间实现一个stl类似的map。后来有个机器人的需求,项目现在也比较紧张。看以后吧

转载自原文链接, 如需删除请联系管理员。

原文链接:关于测试机器人的记录,转载请注明来源!

0