继上面的第一篇文章,没看的可以翻一下。还是进程数量多的问题。
副本问题怎么解决?服务器该如何设计?
按照他们这个做法是副本与场景都是地图,所以就造成了下面这样的问题。假如,我有1万人的在线数量,那么就需要开100个进程出来维护这1万人,这还只是在场景中; 如果,玩家要打副本,那么,按照这个设计,就需要一直开进程。一个人进副本,也是启一个进程来维护你这个玩家。2000人进副本就是2000个进程,这个开销程度可想而知。副本最多可以4人组队情况下,同时进入,这也需要500个进程。这里就产生了大量的服务器资源的浪费。
所以,这里的服务器解决策略是什么?
把前期推图的这些副本做出成了离线副本,就是单机的意思。进去打怪战斗的逻辑在客户端完成,装备掉落,任务完成由Logic服进行了校验。所以,他们的客户端是有战斗的, 不知道这个防作弊机制是怎么样的、关键数据,由Logic进行了校验,记录你通关的副本,奖励等等。这样确实,减少了大量的服务器进程数量。也确实解决了服务器压力的问题。但,ta这是不能组队的,不能与玩家互通的。
世界boss战,跨服如何解决?
上面提到,副本是单机,离线的。随着时间推流,玩家早晚要进Boss战的,跨服副本等等。所以,这里怎么解决?
这里直接使用了场景服务器集群,不亏是大公司!按照下图这样的计算,这一组就是八个,八个按照最多人数那样算,就是可以进行800人的战斗。当然,ta不可能放那么多人进去的。总需要留一些空余,做其它的事情,保证副本的流畅性。
性能优化!重中之重
关乎老板的钱包的多少的切身问题。合理的优化能让你省去一半的服务器开支。
这里的优化思路着重分为了两部分: CPU与内存 !还是那句DS真不是你想用就用的。
CPU的优化细节,最初的设想,就是只同步自己。按照他们那个设计, 玩家最初的出生点在一个寂静的村庄里,没有人。这里就合理的优化掉了。
后面的这些开发的业务逻辑上来了,不仅有人偶,还有宠物,都需要跟随。这里的优化是直接去掉,不同步。只有当真正需要调用到才同步
这里还接入了UE的插件,来把场景中的Actor分组出来,然后优化。网格同步其实就是AOI,只能看到视野范围内的。
摄像机背后同步是什么意思? 就是 玩家视野前后的同步频率不一样,前面的可能30帧每秒,后面可能就10帧。
不移动还用同步吗???用的,这就是DS。 所以,后期优化 直接改为了玩家不移动就不在同步。
这差不多就是属性同步上的优化策略。
物理计算为什么要优化?
这是因为DS服务器的前后端代码,放在了一起,所以前端跑动画,后端也跑动画。这无关紧要的放在服务器上,徒增了CPU计算负担!! 后面还是给分开了。前端是前端,后端是后端。
业务需要的时候再计算? 什么意思? ta这个游戏有人物抬枪射击的动作,射击需要计算射线,朝向对吧!所以,关键的动作,在这里同步一下就可以了。其它的乱七八糟的头发,装饰在前端表现就行了。
这个移动同步前面说过了。DS服务器是可靠的服务器,UDP可靠!降低频率及降低了校验频率,节省带宽!
FindFloor 是UE中的一个查找地面组件。关乎玩家角色,是否在地面上行走,斜坡上还洼地里。玩家的移动会一直不断的更新这个函数,不移动也更新的话,就显得多余了。直接降低这个函数的更新频率。
关于服务器设计特殊移动的一点思路与见解
借用一下B乎的文章。如果是单机,那就不用考虑这些了。
这就有点取巧的意思了。借客户端的优化思路,优化服务器。服务器默认按照,30帧每秒的一个频率再更新。如果CPU使用率超过百分之80会怎么样?你的手机负载超过80%会怎么样?会降频,减少计算数量。俗称掉帧! 这里的服务器也按这个策略,用来保证服务器的能够流畅的运行。
内存优化
最开始一篇的文章中,我们提到,他们的DS场景服务器是集群的,他们这一组服务器,是在同一台服务器上,所以能开出共享内存。用Linux下的fork函数去fork进程,同时又使用上了Copy-on-write (写时复制),当,有玩家触发写任务时,copy一个副本出去给ta改。不是什么新鲜事物。
优化完毕!总结,
所有,这一切,优化完了 服务器CPU与内存节省了约50%。所有的优化,都需要满足业务需求!
更新维护
在线更新,不停服,其实就是lua热更!!只适用于小规模的活动更新。大型的改动还是需要关服更新。
调度策略
这是我认为这里学到最有用的一点,通过这个调度策略,可以很有效的规避了服务器内存泄漏的等严重的服务器bug,当,场景服中存在bug,在线更新解决不了时,这个时候的做法是,把新修改的版本,布置了一个新的集群上去,这个时候的Logic服会根调度策略选择最新的版号。 这排序一下就行了。 通过这样一个轮询的机制,就把坏的版本,换了下来。客户端也不用等待服务器的开服。
这样的思路其实可以做很多事情。比如开发了新版本,新内容, 也就把滚动更新实现了。
其它挑战
时间精度
DS服务器使用了float类型,描述时间,在服务器长时间启动不关的情况下,float类型误差会越来越大,导致移动位置不准确。这里的解决是,扩充double类型。
同步顺序
这个意思是说,当场景服务器把各个actor下发时,会出现不同步的情况,下发的时序是不保证的属于有了就发这种,信息对等不上,所以这个时候就在业务层于场景之间加了一层代理,来保证同步顺序是一致的。当,都到达时,才发送,没有一直等在哪里,缓存队列那种。
无缝切图
这 不说了 懂得都懂,不懂看文档。
使用DS的一点建议
到这里,算是全部讲解完了。
这算是把后端这一套的完整的从开发到上线维护的所有细节都教给你了。
剩下的就是去执行的事情了。
你问我代码怎么写? 那我只能说,你需要提升你的业务能力了。
防作弊
一点题外话,也是不得不关注的一点。综合我玩了这么多年的FPS游戏。
就目前FPS类型游戏,防作弊是没办法完全做到百分百防止作弊的,大多依靠的都是第三方的作弊插件和玩家的举报。有一定的误伤性,不过,这也不奇怪,比如一个高级玩家进了新手房虐菜。这个时候就很容易被举报。你要区分ta是没意义的,ta就是来虐菜的。正常情况下一个玩家,连续排名一直出现在前几位,会被剥离出新手区。但,要做到百分比的防止还是很难,因为FPS类型游戏,为了响应实时的体验开枪即时命中,把命中逻辑,都放在了客户端,服务器只做转发。只要存在竞技,ta里面就会有作弊。任何一款,随便找,都没有办法,做到百分百的防止作弊。使用第三方的插件,也只是杯水车薪,防君子不防小人,只要简单的绕过一下就OK了。外挂工具,会通过第三方的工具,截获你的数据包,这个时候想怎么改就是插件的事情了。更何况,现如今外挂的产业链已经成熟,完全可以做到,你游戏上线当天,外挂就能出来,甚至提前做出来,就等你上线,使劲的薅你的羊毛。进一步损坏你的游戏系统,缩减你产品的寿命,使玩家流失!
什么?你说你没遇到过外挂? 那是你水平太低了。
这已经不算薅羊毛了,有点吸血鬼的那意思了。