1. 拿到笔试通知后,我先做了什么
1.1 确认岗位方向:游戏研发到底考什么
如果你是在2020年那批投过网易互联网岗位的应届生,应该对"网易互娱"这四个字不陌生。当年我投的是游戏研发工程师,属于互娱事业群下的核心岗位,岗位描述里写着"参与游戏引擎、玩法系统、工具链的开发",但具体考什么,招聘页面其实没有透露太多。
我当时的判断是:游戏研发笔试,大概率不会只考纯算法。原因很简单——游戏研发需要的人,既要能写快排、写DP,也要能理解渲染管线、物理碰撞、网络同步这些游戏引擎层的东西。所以我把复习重心放在了三个方向:基础算法与数据结构、C++语言特性、游戏开发常识(帧同步、AOI、空间分区这类)。
这个判断在我后面的做题过程中被反复验证。笔试里确实出现了不少"看起来像面试题"的题目,比如"给定一个场景,玩家A和玩家B同时朝一个点移动,如何判定先后到达"——这类题表面是算法,实际考察的是浮点数比较、网络延迟补偿这些工程问题。如果只刷LeetCode,很容易被带偏。
1.2 在线笔试环境与设备:最容易被忽略的翻车点
网易互娱那年的在线笔试是在牛客网平台上做的,全程摄像头监控,需要共享屏幕。这里我要多说一句:平台稳定性和网络环境,比你的刷题量还重要。
我当时提前一天做了两件事。第一,检查摄像头和麦克风:用笔记本自带摄像头的同学注意,有些平台会要求你开启摄像头权限,但浏览器默认是禁用的,如果不提前在设置里允许,开考后你会被卡在"人脸识别"环节,白白浪费5分钟。第二,测试网络:我专门用有线网连接,把无线网卡禁用掉了。笔试中途一旦断网,答题页面卡死、代码提交不上,哭都来不及。
还有一个很多人忽略的点:**手机扫码登录。**那个笔试平台要求用手机微信扫码验证身份,如果你的手机没电、或者微信登录状态异常,会非常被动。我当时给手机充到了80%以上,放在手边,但把消息通知全部静音了,防止中途弹窗干扰。
提示:如果你参加的是在线编程笔试,提前一个小时把环境全部跑一遍,包括写一个简单的Hello World并编译运行。别嫌麻烦,我见过有同学在本地IDE里写得好好的,结果提交代码时因为缩进问题被全判错误。
2. 笔试当天的真实流程和做题节奏
2.1 题型分布:选择题、简答题、编程题的配比
2020年网易互娱游戏研发第一批的笔试题型,我印象里是三大块:单选/多选选择题、简答题、编程题。选择题大概占了40分,内容以C++、数据结构和操作系统为主;简答题占了20分左右,考的是游戏相关场景设计;编程题占了40分,两道算法题,难度介于LeetCode Medium和Hard之间,但有一个共同特点:题目都很长,背景描述占了一大半。
我记得第一道编程题的题干大概是这样的:"在一个2D横版游戏中,玩家可以跳跃,跳跃高度受到重力加速度和起跳初速度的影响。现在给定一段地形,要求计算玩家能否从起点跳到终点。"看起来是个物理模拟题,但其实核心是贪心算法——每次跳到当前可达范围内最远的位置。
第二道题是经典的"矩阵最短路径+权值限制"变种,但场景换成了"游戏中角色携带物品,物品有重量和收益,背包有容量限制",这其实是个01背包问题,不过数据范围很大,需要优化到一维滚动数组。
选择题里也有不少坑。比如有一道C++题问"std::vector的size()和capacity()的区别",这本身不难,但它问的是"在连续调用push_back的过程中,迭代器何时会失效",这就涉及到内存重新分配机制了。还有一道问"虚函数表是每个类一份还是每个对象一份",答案是每个类一份,但选项设置得很绕。
2.2 时间分配策略:我如何在90分钟内取舍
那场笔试的总时长是90分钟,对我这种手速不快的人来说,时间是相当紧张的。我给自己定的策略是:选择题快做,简答题框架化答,编程题留足40分钟。
选择题我大概用了25分钟,因为很多题是概念性的,一眼就能看出来。但遇到拿不准的,我不会死磕,而是先在草稿纸上标记一下,最后如果有时间再回头想。这里有个小技巧:在线笔试的选择题通常能提前看到所有题目,我会先把整张试卷扫一遍,把每道题的预估时间写在草稿纸上,防止在某一道题上耗时过多。
简答题我用了15分钟。这种题没有标准答案,考察的是思路,所以我的原则是:先写结论,再写推导过程,最后补充边界情况。比如有一道题问"如何设计一个技能冷却系统",我写的答案结构是:玩家技能数据结构(技能ID、冷却时间、剩余时间)、冷却计时方式(服务器计时或客户端计时)、保存与恢复机制(上线时根据剩余时间重置)。不需要写代码,但要把逻辑链条写完整。
编程题我留了大约45分钟,两道题先易后难。第一道跳跃题我15分钟写完了,第二道背包题比较麻烦,我用了25分钟AC,最后5分钟用来检查边界条件。老实说,如果没有预先规划,我可能会在第一道题上磨太久,导致第二道题没时间写。
3. 核心题目复盘:从算法题到游戏逻辑题
3.1 算法题:不刷偏题,刷基础
网易互娱的算法题并不算特别偏,但它很会"包装"。它不会直接问你"请实现一个背包DP",而是给一个游戏场景,让你自己去抽象出模型。这对阅读理解能力的要求其实很高。
先说第一道跳跃题。题目大致是:玩家从0号平台出发,平台是一维数组,每个平台上有不同的最大跳跃距离,问你能否跳到最后一个平台。这个模型其实就是LeetCode 55题的跳跃游戏。但游戏化的包装让我多看了两遍才反应过来,因为它加了一堆无关的描述,比如重力、起跳速度、平台高度差。
解题思路很简单:维护一个当前可达的最远位置maxReach,遍历所有平台,如果当前索引大于maxReach,说明跳不到这里,返回false;否则更新maxReach为max(maxReach, i + jump[i])。时间复杂度O(n),空间复杂度O(1)。
第二道背包题稍微复杂一点。题目给的场景是:"角色在关卡中收集物资,每个物资有体积和价值,背包有容量限制,问如何携带使总价值最高。"这是标准的0/1背包,数据规模n=1000,容量W=10000,直接用二维DP会超内存,我改成了一维滚动数组:dp[j] = max(dp[j], dp[j - weight[i]] + value[i]),注意j要倒序遍历,防止同一件物品被重复放入。
这里我要提醒一个很多人会犯的错:**背包问题里,物品遍历顺序和外层循环位置写反,会导致答案完全错误。**如果你是在笔试现场调试,别急着怀疑题目有问题,先检查是不是这个细节。
3.2 游戏研发特色题:状态同步、AOI、随机数渲染
除了算法题,那场笔试里还有一些明显带有游戏研发特色的题目。我记得有一道选择题是问:"在帧同步游戏中,如果两个客户端在同一帧执行了不同的浮点运算结果,会发生什么?"选项有"画面不一致""服务器崩溃""网络延迟增加""玩家被踢下线"。正确答案是"画面不一致",因为浮点运算在不同平台上可能有细微差异,导致逻辑分叉。
这道题让我印象深刻,因为它不是靠死记硬背能答对的,你需要理解帧同步和状态同步的核心区别。帧同步的核心是"相同输入+相同逻辑=相同结果",一旦输入或逻辑出现微小偏差,结果就会被放大。这也是为什么很多游戏引擎在帧同步中强制使用定点数而不是浮点数。
还有一道简答题问的是:"在大型多人在线游戏中,如何优化大量单位的视野管理?"这基本就是AOI(Area of Interest)问题。我的答案框架是:将地图网格化,每个格子维护一个单位列表;当玩家移动时,只需要更新其所在格子及相邻格子的单位信息;更进一步可以用十字链表或九宫格方案,减少广播范围。这种题考察的是你有没有做过大型游戏项目,或者说有没有读过相关技术文章。
3.3 简答题/设计题:考察工程思维
简答题那一部分,网易互娱出的题很"实际"。有一道题是:"某玩家在游戏中点击了购买按钮,但客户端连续发送了两次请求,如何保证只扣费一次?"这其实是个幂等性问题,在支付系统中很常见。我的回答思路是:客户端生成一个唯一的请求ID,服务器根据这个ID做去重;或者在用户数据结构中加一个"正在处理标志",处理期间后续请求直接拒绝。
另外一道题是:"请设计一个背包系统,支持物品堆叠、拆分、排序。"这种题看着简单,但容易遗漏边界情况。我的回答拆成了四块:
- 数据结构:背包是一维数组或二维数组,每个格子存储物品ID和数量
- 堆叠规则:相同物品可以堆叠,设置最大堆叠数(比如999)
- 拆分逻辑:拆分时需要判断目标格子是否为空、是否同类型、是否达到最大堆叠数
- 排序方式:按物品类型排序、按稀有度排序、按名称排序,排序时注意保留空格子的位置
这种设计题其实没有标准答案,但阅卷人一眼能看出你有没有真正做过游戏系统。如果你只是把数据结构写出来,但没有考虑"背包满了之后拾取物品怎么办""拆分时如果剩下的数量为零要删除格子"这些细节,分数就不会太高。
4. 这些题目到底在筛选什么样的人
4.1 筛选逻辑:基础、工程、游戏感
做完这套题,我最深的感受是:网易互娱要的不是一个"刷题机器",而是一个能直接上手做游戏开发的人。笔试题目看似分散,但背后有一条清晰的筛选逻辑——基础扎实、工程意识强、对游戏有感觉。
基础扎实对应的是选择题和算法题。C++的vector扩容机制、虚函数表、智能指针,这些都是服务器或客户端开发中天天要用的东西。如果这些基础概念都不牢,游戏引擎底层源码你很难读懂,更别提改bug了。
工程意识对应的是简答题和部分选择题。像幂等性、状态同步、AOI这类问题,都是实际项目中会遇到的经典问题。网易互娱是大型游戏公司,他们开发的游戏动辄几十万DAU,服务器端的并发、客户端的状态管理、资源加载,每一环都不能出问题。所以在笔试阶段就考察这些,是为了筛掉"只会写单机Demo"的简历党。
游戏感这个东西听起来很虚,但确实能通过题目体现出来。比如跳跃题的场景包装、背包题的物品设计,都是在测试你能否从游戏开发者的视角去思考问题。如果你平时玩过一些对技术要求较高的游戏(比如《守望先锋》的帧同步、《原神》的开放世界加载),你会发现这些题目其实非常贴近实际开发场景。
4.2 从笔试反推游戏研发的能力模型
我来梳理一下,如果你想通过网易互娱游戏研发的笔试,需要具备哪些能力。
第一是数据结构和算法的基本功。LeetCode前200题至少要刷两遍,尤其是数组、链表、树、动态规划、贪心、图遍历这些高频考点。不用追求偏题怪题,但基础题必须做到又快又准。
第二是C++语言特性。游戏引擎和服务器大多数是用C++写的,所以笔试里C++的题目占比很高。你需要清楚掌握:指针与引用的区别、内存管理、STL容器的底层实现、虚函数与多态、移动语义与右值引用、智能指针的使用场景。我建议你把《Effective C++》里的常用条款过一遍,笔试中会经常出现类似概念。
第三是游戏开发的常识。不需要你精通图形学,但至少要知道:渲染管线的流程(顶点着色器、片段着色器)、Unity和Unreal的基本架构(GameObject/Component、Actor/Component)、帧同步和状态同步的区别、AOI的基本算法、寻路算法(A*)、物理引擎的碰撞检测类型。这些内容可以看《游戏编程模式》和网上大量的技术博客。
第四是项目经验的沉淀。如果你在学校做过游戏项目,哪怕是课程设计,也要好好总结。笔试的简答题问的往往就是"你的项目是怎么实现的",所以提前把自己的项目拆解成"需求-架构-实现-坑"这种结构,考试时能直接复用。
5. 复盘之后的经验教训
5.1 我犯过的错
考完那场试,我做了个彻底的复盘,发现有几个错误非常典型,说出来给大家避坑。
第一个错误是选择题上花的时间比预期多。虽然我计划25分钟做完选择题,但实际上有一道C++多选让我纠结了足足5分钟。那道题问的是"以下哪些操作会导致std::shared_ptr的引用计数变化",选项里有一个是"返回shared_ptr的引用",我当时不确定,想了很久,最后发现答案是"不会变化"。这种题平时不细究,考场上就容易卡壳。我的教训是:遇到不确定的题目先跳过,不要让单题耗时超过2分钟。
第二个错误是简单题答得太简略。有一道考"地图加载"的简答题,我本来准备了很多细节,比如资源异步加载、加载进度条、断线重连的处理,但因为前面选择题耗时太久,后面编程题压力大,所以我只写了一个很概括的答案。最后估分时发现,简答题的失分可能比预想中严重。
第三个错误是编程题的第二道我没有写出最优解的空间复杂度分析。题目要求O(1)空间,我虽然用了滚动数组,但思考过程没有写清楚。阅卷人可能只看到了代码,没有看到我的推导逻辑,导致分数可能有折扣。后来我明白了:笔试编程题不只是看代码能不能AC,还看你的注释、你的思考过程,能不能让阅卷人一眼看懂。
5.2 如果再考一次,我会怎么准备
如果让我重新准备网易互娱的游戏研发笔试,我会按下面的优先级来安排。
第一优先级:**刷高频算法题,但每道题都要总结出"游戏场景映射"。**比如背包问题可以对应"玩家背包负重"、最短路径可以对应"地图寻路"、贪心算法可以对应"资源采集顺序优化"。这样在考场上看到游戏包装的算法题,我能更快地识别出底层模型。
第二优先级:**系统梳理C++的基础知识,特别是内存模型和容器底层实现。**我前一次复习太关注语法细节,忽略了容器扩容、迭代器失效、内存对齐这些底层原理。这些是游戏开发中真正重要的东西,也是笔试爱考的点。
第三优先级:**好好准备游戏系统设计题。**我会把常见的游戏系统都过一遍:背包系统、任务系统、技能系统、战斗系统、聊天系统、排行榜系统。每个系统都按"需求-数据结构-核心流程-边界情况"的结构来整理。这样遇到类似的简答题,我能做到有条理、有细节。
最后,我会留出时间专门训练"在压力环境下的时间分配"。在线笔试最大的坑不是题难,而是心态崩。拿到试卷先花1分钟整体浏览,然后按"选择题快速扫→简答题框架化→编程题仔细AC"的节奏来。这个节奏平时就要练,别指望考场上临时调节。
分享一个考完后的真实感受:网易互娱的笔试并不是为了"难倒你",而是像一面镜子,把你大学四年的积累照得清清楚楚。基础扎实、思维敏捷、对游戏有热情的人,不需要刻意准备也能高分通过;但如果你和我一样是个普通人,那充足的准备是唯一能抓住的确定性。
如果你正在准备游戏研发方向的校招笔试,希望这篇复盘能让你少走几步弯路。