这个需要有点类似实时排名的算法,具体问题作如下阐述:
当一个用户进入游戏之后需要实时记录用户的时间时长(刷新时间1-5秒),例如A用户00秒进入游戏,A用户的可用时长为10秒,哪么10秒的时候用户需要被踢出游戏房间.
程序现在有两种方式实现:
方案一:实时循环,做法就是定义一个定时器,实时去循环修改用户的时间,这种做法有一个问题,当数据量达到一定量的时候,一个循环里处理时间需要消耗CPU大量的时间(做了一个实验,数据量达到1W,CPU消耗就达到了25左右).效率非常低,这种方案肯定是不行的.
方案二:用结束时间去实现,例如A用户00秒进入游戏,可用时间为10秒,哪么给这个用户定义一个10秒定时器,在10秒后这个用户会被踢出房间,这样的做法相比方案一效率会高出很多,而且CPU消耗也不会有影响,但这种方案有一个疑问,难道1W个用户,要创建一W个定时器吗,这肯定是不行的.
如有哪位兄台有更好的方案,还请赐教!
(分数不多了,见谅!代码由C++实现)
1.游戏玩家肯定已经登陆了,记录当前登陆时间,还有个标志(表示用户是否可以继续玩游戏)
2.开启一个监听时间(每隔几秒钟查询下数据库当前用户登陆时间和系统时间差值,并修改标志值)
3.玩家在玩游戏的时候肯定要触发事件,每执行操作查询数据库判断 "标志"是否可用,如果不能用就标志时间到了,不能继续玩游戏了
不知道性能怎样,还请多多指教,希望不要喷水哦。
你的思路正是我现在实施的方案,不过数据都是保存在内存里的,没有保存到数据库,因为玩家的数据是实时变动的,只有退出时才会写数据库,所以数据处理都是在程序里实现的,其实就一个问题,就是几秒钟后检查数据的时候,这块的逻辑,检查用户是否过期必须会用到查询,我的数据结构是map,我压到2W条数据,再跑数据CPU占用就很高了。其实我是想找一种其它的解决方案,每隔几秒这种查找的方法很消耗CPU的,特别是数据量大的时候。
@zbyhi: 放到内存里面?用户量如果很大,内存会不会够用?建议搭建一个分布式缓存服务器.存取用户的状态
@背叛的冲刷: 这个是有的,有做限制,相当于一组服务器上会做一个上限人数。
@zbyhi: 不知道cookie和sesssion这里实用不?
@背叛的冲刷: HTTP里的东西,C++里好像不实用!
@zbyhi: 那就建立一个静态全局集合吧,实际跟session原理差不多。
public static list<sessionid,时间> list=new list<sessionid,时间>();
@背叛的冲刷: 功能已经实现了,只是想优化这块的逻辑,不过好像没有太好的办法。
public static list<sessionid,时间> list=new list<sessionid,时间>();
时间到了,移除sessionid
每一次执行操作根据sessionid,判断对应的list集合是否包含sessionid,然后...
实时排名,然后又踢用户? 然后自己定时?这些太乱了,问题没搞太懂。
懂起你意思了,我建议综合你两种想法。为什么呢?如果只用循环验证,比如隔5秒验证一下,这样确实很耗资源。服务器也受不了。第二种,如果纯客户端其实也不安全,客户端计算器改变一下可能就不行了。反正就是不安全的意思吧。
综合是什么概验呢就是客户端也添加计时器,到计时器到你要验证的点去服务端验证,当然这中间你会加很多设计进去,这样子即不是一直循环,也要用到服务端验证,当然这里验证会有一些差,但是这种可以考虑接受,比如用户多用了10分钟那么验证不过,踢下去就行了。这10分钟可能就不追究了。