游戏服务器经典面试题

问题1: TCP 的核心意涵是什么?
TCP 是面向连接的可靠的传送协议。核心意涵就是面向连接与可靠,对于使用TCP socket而言我们要管理好socket的建立连接,断开连接等。同时对于业务逻辑而言TCP socket是可靠的不会丢包的,比如我发送ABCDE,这些数据包,不会出现丢包(ABDE)与乱序的情况(ACBED)。

问题2: 为什么TCP需要封包拆包协议?
应用层发送数据的时候,每次发送会被开发人员认为是一个独立的数据包,可是在底层,由于TCP是可靠的传送协议,每次发送数据都要收到确认。所以底层有可能把应用层的两个数据包合并在一起发送,发送到另外一段的时候,可能一次收到两个应用层的数据包,而我们解析这些数据包的时候需要分成两个,所以我们在发送TCP命令包的时候要用标识能分开这两个数据包。所以就需要我们加一个封包拆包的协议。

问题3: TCP 如何设计 封包与拆包协议?
设计TCP封包拆包协议主要有两种方式,一种是大小+内容模式+校验模式,一种是特殊的分割符号的模式,比如\r\n, http协议就采用的是\r\n来进行分割。

问题4: Redis 在游戏服务器开发中有什么作用?
Redis 在游戏开发中主要作用有:作为mem cache 数据库,将数据缓存到内存里面。Redis的订阅与发布系统可以作为多游戏服务器之间通讯的工具。Redis的有序集合等可以作为游戏的排行榜。

问题5: UDP的优点与缺点分别是什么?
UDP传送数据速度快,性能好,缺点是UDP发送完数据就不管了,数据传送中有可能丢包,同时数据包走的网络路径可能不一样,会导致先发的数据包后到,后发的数据包先到,这样就没有正确的时序性。

问题6: 游戏服务器开发采用什么样的编程语言好?
目前市面上找平游戏服务器的主流的变成语言分别如下。
第一档: C++ 与Java。占据了企业招聘里面的绝大部分;
第二档: Go, Python, C#, PHP, Node.js, Lua。

问题7: 什么是弱联网游戏?
弱联网游戏指的是玩家游戏的时候只是自己一个人完,不涉及多人同时交互,这种我们叫做弱联网游戏,同时也提供一些联网的功能,比如购买道具,社交,公告,邮件,排行等等。

问题8: 游戏服务器开发主流的高并发方式有哪些?
游戏服务器开发对性能要求非常的搞,同时要支持高并发,充分发挥硬件性能,提升高并发发挥硬件性能,游戏服务器有两种模式的架构,一种是多进程单线程架构,一种是多进程多线程架构。

问题9: 游戏服务器用Linux操作系统还是Windows操作系统?
目前主流的游戏服务器都基于Linux操作系统的,因为Linux操作系统一直做服务器,并且很多主流的代码模块框架都是优先基于Linux的,比如Redis等,所以一般游戏服务器都用Linux作为服务器的操作系统。

问题10: 游戏服务器开发如何调试?
游戏服务器开发对开发人员的要求非常的高, 特别是线上环境,处理的数据量比较大,所以断点调试这种方法,不大适合服务器。服务器一般采用的调试就是打印查看日志。通过日志来分析对应的问题。所以一个好的日志系统对于服务器来说是非常重要的,当然没有断点调试就对开发人员要求更好,对程序把控的能力更强。

问题11: 游戏服务器中主流的同步方式有哪些?
游戏服务器开发中主流的同步方式有状态同步和帧同步,帧同步是每帧同步玩家的操作,把所有的业务逻辑放到客户端计算,大家同样的操作,同样的代码得到同样的结果,帧同步的有点是性能好,缺点是容易作弊。状态同步,就是服务器上跑游戏,各个客户端把操作输入发送给服务器,服务器决定处理的结果,把结果广播给客户端,然后客户端播放动画。状态同步的优点是不容易作弊,缺点是实时性不如帧同步。

问题12: 游戏服务器如何能承载大量的玩家在线?
当我们分析一个服务器能承载多大量的时候,一般我们要配置好单服(一个服务器组,可能是一台机器,也可能是几台)最多可带多少人,什么样的配置带多少人,这个需要我们把代码写好。提前设定好对应的承载量,单服设置好以后,我们再来通过扩展物理机器,来吃掉流量。

问题13: MMO RPG里面的AOI是什么意思?
MMORPG游戏可能有好几千人在同时玩游戏,如果一个人的状态改变了,要通知所有其他的好几千人,这个其实服务器是很难承受的,那么当我们一个玩家的状态有变化的时候,只要通知他周围对这个玩家感兴趣的人,这个叫做AOI,这样可以减少数据的传递,提升服务器的性能。

问题14: 网络游戏如何做世界排行榜?
排行榜是服务器经常需要用的一个功能,这个是为了增强top玩家的荣誉感,世界排行榜是非常重要的功能,Redis 对全服的玩家进行排序,使用的是有序队列,当我们更新玩家战绩的时候Redis就会帮我们更新排序好,请求排行榜的时候,只要获取就可以了。

问题15: 网路游戏如何对接第三方的支付?
目前第三方的支付都非常的成熟,比如微信支付,支付宝支付,那么游戏服务器如何与这些来对接呢?一般的思路是游戏服务器搭建一个http server, 提供一个地址,给第三方的支付服务器回调,当我们的客户端调用第三方SDK来支付一个商品的时候,第三方支付就会调用我们的回调地址通知我们,用户购买了某个商品,收到通知以后,我们在服务器上给玩家发货,把玩家的货物信息更新到数据库。

问题16: 服务器开发中同步IO与异步IO的区别是什么?
IO操作指的是当我们从外部设备(磁盘,网卡)读写数据的时候,CPU要等待外部设备处理完,如果是同步IO,那么这个线程就同步的等在这个IO请求上,直到处理完成,这样这个线程就会被挂起,而不可以做别的,异步IO是发完IO请求以后,我们不等结果立马返回做其他的事情,等IO结果完成了以后再来处理。同步IO会导致线程挂起,异步IO可以使线程做其他的一些事情,具体使用同步IO,还是异步IO要从服务器的整体架构上去考虑。

问题17: 各大编程语言的高性能的网络库主要有哪些?
Java服务器高性能的网络库有 netty, Mina等。
C/C++ 服务器高性能的网络库,可以直接使用EPOLL或IOCP,也可以使用第三方的库如libevent, libuv等。
C# 服务器开发高性能网络库可以使用SuperSocket等。
每个服务器开发语言对会有对应的高性能的网络库。

问题18: 游戏服务器序列化/反序列化用什么样的技术?
目前服务器序列化与反序列化主要分成两种模式二进制模式与文本模式,文本模式的序列化与反序列化主要有json与xml, 二进制模式的序列化与反序列化主要有自定义的协议和google的protobuf协议。

问题 19: BASE64编码解码在服务器开发中有何作用?
BAS64编码解码,使用可打印字符(文本)来表示二进制数。在游戏开发中,如果是用文本协议,比如http, 我们要传递一个二进制数据,可以将二进制数据编码从BASE64的文本编码,然后在传递,传递完成后,再解码出来得到二进制数据,这样文本模式下传递二进制使用BASE64就成为了一个处理的方式。

问题20: 游戏服务器如何避免内存碎片?
不管是C++服务器还是如Java这样带来垃圾回收的编程语言开发的服务器。避免内存碎片和减少GC的开销都是必不可少的。这两个其实解决问题的手段都是一样的,手段就是使用缓存池的模式,比如我这组服务器,准备负载N个玩家,那么可以为这个N问题的规模分配好对应的内存池,把那些经常要分配和释放的对象用内存池管理起来。很多人可能会问,内存池管理不就一直站内存么?其实这个问题很好理解,因为服务器和客户端App不一样,服务器所有的资源,都是为游戏服务器服务的,所以我们可以吧最大设计的负载所需要的内存一次性的开出来这样能大大节约GC开销或内存碎片。

问题25: 如何查看游戏服务器程序是否已经发挥了机器的最大性能?
当我们很衡量一个服务器程序能带多少负载,我们可以规定一个机器的CPU, IO, 网卡等,然后看这个服务器能同时支持多少玩家不卡,等到了卡的临界点的时候,这个时候应该就是我们这个服务器程序的最大的灵界点了,如何分析这个程序是否发挥了机器的最大性能呢?这个时候我们要看各个硬件的参数,比如CPU占用率, IO, 网卡等数据,如果CPU, IO,网卡都没有达80%以上,而玩家无法再增加了,说明了我们写的代码没有完全发挥机器的性能,要去思考我们的架构和部署。

问题26: 服务器如何做热更新?
服务器做热更新是在不关闭服务器的情况下直接热更新代码来修正代码逻辑。而游戏里面分为两类,一类为代码逻辑,一类为数据实体。当我们有成千上万的玩家同时在线的时候就有很多的数据实体,如果我们修改了数据实体的内容,肯定是无法热更新上去的,因为这些实体都存在,你添加了新的数据除非重新启动或生成数据实体否则无法热更,我们一般服务器的热更新指的不是热更新数据实体,而是更新代码逻辑,比如有个代码有bug要修正,修正以后数据实体不用改,只要更新好逻辑,这样不用重启机器,后续再掉这个逻辑的时候就已经被修正过来了。

问题27: 服务器数据库的字符编码一般采用什么?
一般我们开发游戏服务器的时候,字符编码一般都采用Utf8, 因为Linux上UTF8的标准支持的非常好。

问题28: 服务器守护进程有什么作用?
一般我们上线部署服务器的时候,时候有可能由于代码的错误等到只进程异常退出,当出现这样的情况是,我们要用守护进程把游戏进程重启,保证能从新开始游戏。这个就是守护进程的作用。

问题29: Linux 如何查看服务器的内存占用等信息?
Linux有命令可以查看内存占用相关的信息,不同的Llinux发型版本,可能会有一些小的差异,我们可以通过命令cat /proc/meminfo, 查看内存的整体使用情况,也可以通过top等命令来查看各个进程的一些详细信息。

问题30: 如何做服务器管理后台?
一般我们在服务器上架设一个HttpServer,HttpServer来做服务器的管理后台,通过HttpServer来操作游戏的数据库。来做为管理的后台。也可以通过访问服务器的数据库来显示当前游戏中的一些情况,方便我们对整个游戏服务器的情况做一个综合的了解。

评论

 

关注公众号

可用手机学习

获取最新课程