面试复盘 | 腾讯IEG光子工作室一面凉经
面试问题
8月10日 大约1小时
游戏开发相关问题
- 自我介绍
本科做了安卓,暑期实习游戏开发,研究生做java web项目。
其中暑期游戏开发的视频在这里:https://www.bilibili.com/video/BV12W411R7gc/
后面大多都是针对游戏开发问的。 - 你觉得做游戏开发和你研究生做的web项目有什么区别?
游戏开发设计的自由度更高,web项目受甲方知识约束,需求比较死板,难以沟通。 - 你们游戏的服务器是什么框架,怎么实现的?
pb,是公司提供的***版的一段代码,我们只需要在里面填充。 - 如何保证两两玩家的连接?
两种思路,一是以服务器为中心,建立房间匹配机制。二是以其中一个玩家的客户端作为俩玩家之间的交互服务器,它只向游戏服务器汇报战果。 - 服务器端如何检测玩家作弊?(你这个游戏是2p v e的,假如是pvp的话,比如DNF)
第一,不符合物理引擎的位移视为作弊,例如突然跳的很高,跑的很快。
第二,完美操作的视为作弊,因为人对视觉听觉是有延迟的,对方刚进入视线不可能毫秒级反映。 - 如果让你做这种双人合作闯关游戏,你选择tcp还是udp,为什么?
tcp,tcp更稳定。 - 你说要用tcp,tcp在你这种强连接中的一般比较慢,为什么?
校验重传/流量控制/拥塞控制/资源消耗大 - 假如有1000个人在线的平台,怎么保证性能?
模仿redis,以网络情况较好的20名玩家客户端做环形的集群服务器,并设置哨兵。 - 你说的将玩家客户端做集群服务器,那这个玩家掉线了怎么办?
切换到其他存活的玩家。并作主从复制。 - 你说的将玩家客户端做集群服务器,万一两两玩家作弊怎么办?
服务器选择客户端对用户来说是透明的,想作弊的玩家刚好遇到的概率很低。八股文环节
- I/O多路复用是为了解决什么问题?
单进程监听多个I/O端口。 - 说一下select/poll/epoll的区别?
参考网上的答案很多balabala。 - 让你选,你会选哪个?
优先选择epoll,除非不支持。 - 什么时候发生粘包?
单个应用的报文过小,或者切分后溢出一个小段,和其他报文的一块发。 - 如何拆包?
在tcp包里描述包的长度。或者定长,用0填充剩余部分,但这样做会造成资源损耗。
(还有种方法是设置特殊分隔符,我没答上来。)项目环节
- 讲一下你的项目,你收获了什么?
略 - 讲一下你的论文,如何实现的ETL?
略 - 如何考虑你的ETL性能?需要多久?
先报了自己电脑的配置,然后说了时间,讲了下应用的场景,一般不会频繁ETL,为了性能考虑,一方面是前端设置限制输入文件大小,另一方面是比较耗时的ETL执行函数进行加锁。 - 你的项目说了前台监控显示服务器的cpu/流量大小,这是怎么实现的?
CPU/硬盘/内存占有是通过java调用linux的shell执行top等命令获得的。流量大小是java取的HTTPRequest对象的报文长度获得的。
面试官提醒我流量大小也可以通过linux调用获得。项目延申到linux命令
- 假如cpu占用过多,如何排查哪一段代码出现了问题?
top命令,查看占用过多的是否是我的应用,如果是我的应用,通过jvm的机制去查过堆/栈/方法区等信息,定位到代码。 - 如何查看当前运行进程?
我只说了ps,面试官好像非常不满意。 - 说一下你知道的linux命令。
mv cp cd ... - 假如一个文件里有很多行url,如何快速替换其中指定的url,用linux命令实现?
find命令查找到行,然后随机读写替换。面试官不满意。反问环节
- 游戏开发的加班情况。
总结
我投腾讯时并没有选部门,被分配到游戏开发部门有点措手不及,可能是看我建立上有过游戏开发经历吧,但那都是三年前的事了,好多忘了。
对于游戏开发的场景题确实都是现场想的,从来也没看到过类似面经。
后面对linux的提问挺深的,可能要具体实操过回答上参数吧,我只记住了些命令名。
第二天就挂了,反馈很快。
大佬们觉得我答的不好的地方,请指点下啊,或者有这种游戏场景题的面经推荐些啊~
补充答的不好的问题
- 应该用grep命令做筛选,vi替换。或者sed命令sed -e "s/var2/g" filename。平时应该多练练牛客的shell编程https://www.nowcoder.com/activity/oj?tab=2。命令不能光靠背,要动手实践。
- 检测玩家作弊,面试后我还想到了
基于机器学习的方法判断和作弊玩家数据的相似度。
对于关键性操作基于区块链建立共识机制。 - 如何选择select poll epoll?
select支持率最高,可移植性好,而且响应时间精度是毫秒级的,poll和epoll是微秒级的,如果对时间精度要求高选择select。其他选epoll。