查看原文
其他

程序丨腾讯技术大咖答疑:游戏服务器架构与性能优化

2017-12-29 GAD Gad-腾讯游戏开发者平台

关于游戏服务器架构与性能优化,你有哪些地方感到困扰吗?GAD近日邀请了腾讯天美J1技术总监付重钦、腾讯光子后台主程吴双、腾讯天美服务器主程章华,针对大家提出的相关问题做了解答。小编为大家整理了一些精彩的问答,点击阅读原文,还可查看全部问答。

 

系列回顾:

大咖答疑专场:网络游戏同步技术

大咖答疑专场:游戏开发中的物理系统

 

 

Q:游戏在线人数过多出现卡顿,是怎么造成的?服务器硬件还是网络或是其他原因?

 

付重钦:原因有很多种,要根据不同情况进行分析:


1、手机或者电脑的性能不好,客户端自己卡顿,表现在fps很低;


2、网络本身的问题,比如丢包、高延迟,或者手游时的弱网,都会导致客户端卡顿,比如转菊花;


3、服务器负载高,性能下降,导致无法及时的处理客户端的请求,可能是服务器硬件本身需要升级,另外一方面是程序自身的bug导致的吞吐量不够,性能低、还有就是可能是架构问题,比如没有分布式处理,无法动态扩容。


Q:当一款游戏走到生命的中后期时,经常需要进行大量的合区操作,请问对于频繁的合区有什么比较好的解决方案?

 

章华:可以采用存储层全区全服,接入层和逻辑层分区分服的服务器架构,规避合区时对数据的处理成本。简单来说就是存储层要统一进行管理,不隔离开来,以保证前端不同区的游戏服务器可以访问任何一个区的核心数据,接入层和逻辑层分小区,让玩家在不同的服务器上游戏。

 

吴双:可以采用中心全局DB的模式,合服无需任何DB操作,只是一些配置的变更而已,可以做到自动化。

 

Q:状态同步或者帧同步,如何保证通讯流畅?即时对战游戏,如果设计同步机制,如:状态同步与帧同步,从服务器的角度来讲如何保证通信流畅?

 

章华:关于通信这块,建议协议选择UDP,包的大小控制在576byte以下,重要信息选择可靠UDP,不重要信息采用非可靠UDP,考虑到丢包可以采用冗余方案,另外客户端选择接入一些加速产品,例如腾讯云的智营网优,我们不少游戏接入了,效果还是不过的。



Q:请教AI实现在客户端还是服务器?客户端桥接同步还是直接写在服务器,靠服务器同步给所有客户端呢?

 

章华:和游戏单局选择的同步方案有关, 例如王者使用了帧同步,AI计算是放在客户端的,开局服务器给客户端下发随机数种子,基于相同的种子, 根据帧号,各客户端可以计算出一致的AI状态,这块的反外挂可以通过服务器抽查各客户端的计算结果是否一致的方式来做。而也有很多游戏,例如逆战,天刀,魂斗罗等使用了状态同步,AI计算放在了服务器,3D碰撞处理这些也放在了服务器跑,他们有对这块有做一些深入的优化。

 

Q:关于UDP的一些小问题


1、王者荣耀的UDP是如何实现的?UDP+EPOLL还是多线程?


2、UDP如何保证可靠性?你们冗余具体是怎么做的?


3、服务器发送的数据需要缓存吗?如果是缓存多少合适?


4、如果发送给客户端的包丢了,且包由于在发送缓存已满的情况下缓存怎么办?


5、战斗数据在服务器端会缓存吗?


6、服务器有没有做演算?是否用的帧同步?


付重钦:没有具体参与到王者项目中,从其他渠道获得过一些信息,不一定准确,供参考:


1、用的是互娱研发部的UDP组件,非可靠UDP,UDP+EPOLL即可,不用多线程;


2、没有用可靠UDP,效率比较低,通过冗余方式来保证,具体方式是,后续的UDP包会冗余一定量的前面已发送的UDP包,比如,在等前面的udp包的应答的期间,后续udp包把前面未应答的包附在后面,可以根据情况冗余多个,直到收到前面的的应答,这是通过流量来换取效率的方式;


3、没明白你说的这个缓存是什么意思,帧同步的时候,他们的服务器会并帧下发给客户端,比如客户端是30帧,服务器就15帧下发;2并1;


4、加大缓存可以缓解问题,但不是解决办法,要分析为什么会出现这种情况,说明设计有点问题,某些玩家的网络就是有问题,那就需要牺牲掉网络差的玩家的游戏体验,优先保证网络好的玩家的游戏体验,所以某些玩家迟迟不应答,包丢了就丢了,不再管他们的游戏体验;


5、他们用的是帧同步,服务器会进行一定的校验,但不跑完整的游戏逻辑,为了反外挂,可以旁路一个完整的校验服务器,需要跑完整的游戏逻辑;


6、见5。



Q:登陆并发问题的较优的方案大概是什么样的,有关下面的处理方面。


1、数据读取并发。


2、数据缓存。


3、包体。


4、网络缓存。


5、服务器组织结构。


6、崩溃方案。

 

付重钦:


1、分布式存储,或者现在流行的nosql数据库,都支持海量的并发读取;


2、cache是必不可少的,甚至可以采取多级cache;


3、这个没有明白什么意思,是指包体太大了么?可以压缩;


4、对接入层要求比较高,现在服务器的前端接入层都是独立出来的,采用分布式方案也可以解决;


5、应对海量服务的服务器架构必须是各模块扩展的,没有单点瓶颈,要有比较好的负载均衡机制;


6、高可用性,可以采取有损服务,即某台服务器的崩溃不影响其他服务器的人,把影响尽量缩小,而且能够快速的恢复,涉及到监控、告警、备份及动态调整;


腾讯的海量服务器有自己的一套方法论和落地方案,不管是游戏还是其他互联网服务,可以google一下:“腾讯 海量服务之道”,网上有很多文章。

 

Q:请问腾讯的服务器架构是什么样的?具体服务器部署时有没有应用到分布式部署?在提高server的消息收发处理上做了怎样的优化?

 

吴双:由于硬件的飞速发展网络问题已经不是服务器的短板了,服务器更多的优化主要是逻辑方面的。对于服务器的架构,不同的游戏大同小异,没有银弹,主要适合业务和开发团队即可。最基本的要做到,io分离(剥离网络IO和磁盘io),运算分离(对于cpu敏感逻辑分离出去),才能保证核心服务的高性能与稳定。

 

Q:学习游戏服务端编程,需要学哪些技术?

 

付重钦:针对腾讯的游戏服务器端来说,主要的知识技能有以下几个部分:


1、操作系统:主要是基于unix/linux的,所以,操作系统相关的需要熟悉了解,可以从初步了解到会用再到深入学习,推荐一些书籍:《Linux初学者指南》、深《度探索Linux操作系统:系统构建和原理解析》、《LINUX命令行与SHELL脚本编程大全》、《深入理解计算机系统(原书第2版)》、《unix高级环境编程》等,主要还是要多动手;


2、编程语言:C/C++、lua、python,腾讯这边服务器端用java等其他编程语言的比较少,这些就不多说了;


3、网络编程:《TCP/IP协议原理》一二卷、《unix网络编程》一二卷;


4、数据库:关系型数据库mysql、现在比较流行的nosql类数据库也要熟悉了解,有很多开源的;


5、设计模式、面向对象等;


如果要比较深入的从事游戏开发,最好还要能够了解下游戏客户端相关的开发知识技能,艺多不压身;


熟悉掌握这些知识技能,从事游戏后台开发基本上没有问题了,更多的还是参与经历项目,了解后台的架构和开发流程,以及与客户端和策划运营同学的交互方式,这个就更多的要从项目实战中锻炼、学习和总结了。


以上就是此次大咖答疑的精选问答啦!如果想查看更多相关答疑内容,可点击阅读原文查看!


今日推荐

Unity 渲染系列教程(十三):延迟渲染

专访腾讯前台程序专家方煜宽:从业十年,仍在追梦路上

游戏开发者心目中的2017年度十佳游戏,谁才是最大黑马?

一键添加

加小编微信,享双重福利

1.加入GAD程序猿交流群,获取行业干货;

2.领取60G腾讯内部分享等独家程序资料。


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存