FPS游戏服务器设计的一些想法(FROM 高总)

来源:互联网 发布:图片尺寸打印软件 编辑:程序博客网 时间:2024/04/29 04:26

 

       FPS游戏,至今我还没有真正设计过。从去年到盛大、今年到金山,感谢校长、锦州,让我有很多机会和公司内外的团队沟通和互相学习,加上自己有qqtang server的设计经验,对FPS游戏慢慢有些了解,经过不断的讨论,对其中的细节也逐步有些深入。因为没有完整设计过FPS游戏,所以很多想法可能是有很大偏差的,只是总结一下这1年多以来的心得。

一、玩家的游戏数据转发采用 UDP+应用层确认? 还是 UDP+TCP ?

      qqtang游戏数据转发采用的后者,所有游戏数据(移动+捡道具+泡泡爆炸等)都通过UDP来转发,但是对于捡道具、泡泡爆炸等游戏关键数据是还会用tcp再转发一次。这样设计的原因是如果只有UDP(没有确认,不能重传)转发,UDP包丢失的话,就会导致游戏逻辑混乱,比如有个道具在界面上,不能捡,但是又阻碍人物行走;或者泡泡永不爆炸等情况。这些关键数据如果采用TCP转发就保证可靠性,而对于人物移动包,部分丢失不会影响游戏逻辑,所以只用UDP转发,也减少了流量。

反恐行动1的游戏包只有UDP转发,今年3月份和他们沟通的时候我一直都不是很明白他们是怎么保证可靠性的,后来才想清楚。它的转发逻辑应该是移动包等(允许一定丢失率的包)通过UDP转发,而且没有确认机制;游戏关键数据包(比如中弹、换枪等)也是通过UDP来转发的,但是这些包在应用层有确认和重发机制来保证数据的可靠传输。

到底哪种方式更好了,可以参考下qq server和qqgame server:

      2003年qq server采用的是公司自己设计的ftcp协议,就是基于UDP、在应用层实现可靠传输的协议。它主要是解决当时select模型的接入量和效率问题,当时qqgame也采用了ftcp协议来提高qqgame server的负载。但后来发现它不适合在游戏server上使用。原因是qqgame有20K以上的大包,ftcp协议要求我们进行拆分成n多小包发送,每个小包丢失都会导致整个大包的接收失败。采用ftcp协议能提高了接入量但单个用户的服务质量下降。最后没有办法我们还是用了select模型(半年后改为epoll模型,大大提高了接入量)。

反恐的模型(UDP+UDP应用层确认)和qqtang server(UDP+TCP),这两个模型,我比较建议用前者。

        1)fps游戏过程当中没有大包出现。

        2)统一采用udp,设计简单、逻辑一致。

        3)流量更小,FPS游戏对网络延迟要求很高,UDP的丢包率不高,所有关键包都转发浪费不少流量。

二、P2P模型? 还是 C/S模型?

类似于qqtang、泡泡堂、泡泡卡丁车或者cf等游戏几年前我们设计的思路都采用的是P2P方式。记得2004年的时候,带宽的成本好像是一个月30W/G。现在的成本好像只有1/6-1/3,未来成本还会持续下降。

我之前统计qqtang的P2P打通率大概是70%,大约有70%的流量是通过P2P方式传输的,降低了运营商成本。但是整个互联网大环境的趋势对于P2P是不提倡的,另外重要的是P2P的方式导致程序设计很复杂,对于团队特别是创业团队是一个比较大的瓶颈,还会导致服务器的防外挂机制设计困难,玩家和玩家游戏数据的互通让server很难参与到其中来控制。

        qqtang是p2p模型,cf、反恐都是c/s模型,从个人经验看,除非在p2p上很有经验,否则采用cs模型可能更合适。

三、大厅服务器和游戏服务器的分离

        qqtang server的大厅和游戏是处于一个物理和逻辑服务器。crossfire的大厅服务器是集中在IDC机房,游戏逻辑服务器分布在CDN中。玩家开房进入游戏状态后会登录到游戏服务器上进行游戏,这种就近接入的方式在crossfire的运营上非常成功,很好的解决了FPS对网络延迟要求高的问题。

反恐行动1在服务器的分布上就没有像crossfire那样做,绝大部分玩家玩得还是不错,有少量的玩家反应有点卡。还好反恐行动2会解决这个问题,反恐行动2各方面都做了很大的优化,相信会有更佳的表现。

        FPS游戏因为对网络要求非常高,所以采用了分地域、就近接入的方式,这点和mmog有很大的不同,也是fps运营质量的保证。

四、玩家状态是即时转发还是状态同步

锦州之前设计的活力风暴时采用后者方案,每50ms把玩家的状态广播一次,玩家在50ms内发生的2次行为比如换过2把枪,只会把后面的状态记录下来。这会导致

         1)录像回放不好做,因为没有完整的行为过程,

         2)50ms的状态转发不会很精确,延时不确定,而且同步线程和主逻辑线程也有同步问题会无端增加延时。

         3)流量增加,每次状态同步会把一些没有变化的数据同步。
         qqtang采用的是前者,程序设计相对复杂一点;但消息延迟更低,记录了游戏世界的事件逻辑。

五、服务器行走模拟?

服务器行走模拟的基础是采用cs模型,锦州之前采用unreal解决方案进行过测试,如果服务器做行走模拟可以很好的解决反外挂的问题,但是开销实在太大,物理碰撞之类的运算量太大;类似的尝试也在qqtang做过,我接手qqtang的时候还有服务器行走模拟的代码,最后发现cpu开销太大取消了。

服务器硬件的持续发展也许会让服务器行走模拟成为可行,如果可行,fps游戏的反外挂天然将形成了一个天然的屏障。

六、玩家伤害判断和防外挂

由于服务器计算碰撞的代价太大,所以玩家伤害等行为除了服务器做一定的校验外,主要是靠玩家之间互相的验证来实现的。在网络要求高的游戏中,一般我们都是以服务好网速更好的玩家为原则的,所以fps游戏防外挂是个比较艰巨的任务,就像之前的qqtang一样,客户端承担了太多的运算,同时又要保证好的用户感,就需要游戏逻辑中增加更多的防外挂的考虑。qqtang主要采用的是扫描特征码、动态代码执行等方案。

        unreal在fps已经形成了一套相对完整的解决方案,反恐1中已经得到验证,开发门槛低,效率还可以,也许未来的fps游戏可以采用现成的方案,开发者只需要完成主体框架和游戏内细节逻辑。

没有完整开发过一款fps游戏,这些都是一些想法总结而已。