面试地点:网易游戏-广州
第一轮的电话面试是在周一上午十点,可是我一直等到10点40才接到面试官的电话,第一面的面试官是南京大学的学长,人非常nice,没有问什么很难的问题,基本上一开始就是从我做过的战棋游戏的项目入手,因为我负责的主要是GamePlay,所以问的问题也都集中在这一块,比如游戏中的状态机的设计,动画曲线的设计,相机的移动,游戏中如何使用MVC之类的(可以参考我的这篇文章)等等。然后就是我一个人在扯一些Cocos2d-x的事情了,因为我本人对Cocos2d-x还算有点研究,就把Cocos2d-x的一些重要的特性说了下,但是学长好像是做Unity3D的,感觉有点对不上路。算法方面的问题倒是一个也没问,面试结束后,我问了下学长对我的印象如何,学长说各方面都还不错,我就觉得这一轮差不多了。总之第一轮的电话面试,还算简单,只要你有几个拿得出手的项目就行了,最好是移动游戏,实在不行的话,做过移动App也行吧。当然,熟悉Unity3D或者OpenGL之类的有加分,要是获悉一些后端的东西,比如网易的Pomelo就更好了。
过了一周之后,网易发来了通知,叫我去杭州参加第二次面试,知道这个消息还是蛮兴奋的,因为网易的本科生录取率还不到5%吧。。。又过了一周,果断买票赶往杭州!网易的第二次面试实际上是三次面试,就是三个工程师会轮流对你进行面试,然后综合评价之后,再判断是否给你下一轮的机会。对于这次面试我还是做了不少准备的,我不但专门为这次游戏做了一个游戏Demo,用MVC架构做了一个Cocos2d-x的游戏,源码在这,另外还有一个用Unity3D做的应用,MrNerverDie/MiniWeChat-Client
GitHub,而且专门准备了一份自我介绍和一些想问面试官的问题。去进行面试的一共有6个人,五个是应聘实习生的,一个是春季补招的,也就是说,网易对实习生的招聘和正式员工的校招要求的水平基本一致,这点各位注意一下。一般过了第一面之后,在杭州这一次是6个里面淘汰5个,这6个人基本都拿到BAT或者同级别的的offer了,除了我和我的一个同学(我两之前一起做了那个战棋游戏。。。)是本科生外,其他人基本都是研究生,可见网易的选拔还是比较严格的。接下来说一说二面都问了些什么问题吧,我一一列举如下,各位可以参考一下(网易的人别打我,我这不算泄露机密吧):如何对手机游戏进行优化,我的回答基本上是以下这样的:
一般分为内存优化帧数优化,内存优化和运存优化。
帧数优化可以考虑对一个message loop中的逻辑运算进行优化,比如可以考虑A*的剪枝。或者进行time slice。
体积和运行内存优化有以下几点 :
使用工具对资源进行打包,使用TexturePacker等工具把多张资源合成一张图片。
采用png压缩工具,在打包图片之前对每张图片进行压缩,降低图片质量。
针对不同的平台使用特定的压缩格式的图片 如果项目中帧序列占的比较多,那么可以采用降帧的方式来优化。
缩放图片,将原来图片缩小为原来的70% ~ 80%,再对图像进行放大。
采用编辑器,将大图转化为拼接,那么就可以利用地图编辑器、动作编辑器等从而减少体积,降低内存的使 用。 如何在对游戏的“手感”进行改进:
游戏手感一般指的是打击感,那么我就在打击到一个游戏对象时,游戏对象要产生击退的效果,产生该对象被打击的感觉。
时间控制要恰当,要让某个对象(比如火球,拳头)打击到另一个游戏对象的时候,才产生击退效果,这就需要进行使用消息机制和回调来解决。
如何在数据库中存储一个人的所有装备
建立一个人物ID和装备ID的关系表。
将人物的所有装备的id序列化为一个JSON字符串存储为人物的一个字段。
这两个最大的区别是在修改装备时,第一个只会影响一条记录,当时第二个会影响所有装备,一旦出现bug还让玩家损失所有装备。两者各有利弊,根据使用场景自己权衡。
如何对一个快排进行优化使得它的最坏的时间复杂度达到O(LogN)?
Lua和Unity中的协程是怎么使用的,都有什么区别?
我的游戏Demo中AI的设计思路是怎样的。
如果让你设计一个暗黑破坏神的简化版手机游戏,你会从哪里开始设计。
只记录了一些我认为比较有价值的问题,有些问题没有记录,其实除了这些问题之外,我和面试官的许多交流都围绕在我做的游戏Demo上了,讨论了许多关于这个游戏AI,架构和Cocos2d-x相关的问题,我还把自己的游戏代码给面试官看了,很多问题都是边看代码边聊的,还是和第一次一样基本没问算法,大部分时间是在聊项目。所以各位同学们,有个拿得出手的项目还是很重要的。
三面是总监面,到了三面的时候,6个人又被淘汰了几个,然后我第一个被叫过去总监面,三个总监貌似是主策,主美和主程。这一面的压力还是蛮大的,问的问题明显要比二面的时候难了不少,我整理了一下三面中一些比较难的问题,供大家参考一下:C++11有那些特性?
C++11模板中的特化和偏特化分别指什么?都在那些情况下应用?
C++11模版的高级使用有那些?请举出例子。
游戏中状态机如何实现REDO,UNDO和MERGE?(用stack即可实现)
极大极小算法的原理和在AI中的应用?
3D游戏中相机是有那三个元素构成的(Translate,Target和Up Vector),分别起什么作用,如何使用四元数进行相机的变换?
由于本人计算机图形学比较菜,很多相关的问题没法打上来,在第三次面试中真实蛮失败的,最终很可惜,没拿到offer,只好下次再战。。。
网易游戏到底招什么样的应届生?
网易游戏的面试流程整体走下来,感觉还是蛮规范的,网易确实在认真的招人和面试,我的感觉是网易希望招聘的应届生除了有一个拿得出手的项目之外(最好是游戏相关的),还要在以下这两个方面至少熟悉一样:计算机图形学
游戏服务器编程 然后再说一下网易的基本要求,当然了,什么数据结构,操作系统,数据库,编译原理这些的基本原理和应用就不细说了,都是本科生基础必会的东西,说些和游戏相关的要求:对C++的模版的高级用法要了解的比较深入。
对C++的内存管理的各种解决方案要非常熟悉并亲手实验过。
对AI的各种算法要有了解:比如博弈论中的极大极小算法,A*算法的优化等等
对C++的装载链接过程和Lua的虚拟机的一些底层实现要有了解
对VS或者Xcode这两种IDE需要可以熟练的应用
需要的项目经历:自己开发过 一个简单的游戏引擎或者是做过比较复杂的 游戏Demo(大概是Kingdom
Rush这个级别就可以了吧)
对Unity3D或者Cocos2d-x有着丰富的使用经验 (可以没有,有的话加分)
了解过网易的后端框架Pomelo(可以没有,有的话加分)