网易互娱游戏研发笔试复盘:题型考点与备考策略
每年秋招季游戏研发岗的笔试都是不少同学的一块心病。今天想复盘一下我当年参加网易互娱2020校招游戏研发第一批在线笔试的完整经历从题型分布到每道题背后的考点逻辑再到一些考场上才体会得到的坑一次性说清楚给后面准备游戏研发岗的同学做个参考。先说一个核心结论网易互娱游戏研发的笔试本质上不是在考你“会不会写代码”而是在考“有没有用游戏研发的思维去写代码”。1. 笔试整体布局与重点模块当时收到笔试通知后进入的是牛客网的系统限时两个小时。整张卷子分几个大块单选、多选、编程题另外还穿插了简答题。整体体量偏大时间略紧。和纯互联网后端岗位的笔试题相比一个很明显的差异是网易的题目会更偏向计算机图形学、游戏数学、物理模拟、网络同步这些游戏领域特有的知识点。先说单选题部分。印象比较深的几类考点包括渲染管线相关深度缓冲、模板测试、混合顺序这类基础但不一定所有人都会细抠的知识。数据结构与算法哈希表冲突处理、平衡树调整、图的最短路径算法复杂度分析。操作系统和网络:进程线程区别、死锁条件、TCP/UDP差异。游戏数学向量点积叉积的几何意义、矩阵变换、四元数基本性质。单选题整体难度不算高但有些题如果你没接触过图形学的基础概念做起来会比较吃力。多选题是真正容易拉开差距的地方。网易的多选题规则是“少选得部分分多选错选不得分”这意味着你不仅要知道哪个选项是对的还得有把握确认哪个选项是错的。这种规则其实很考验对知识点掌握的精确度而不是模糊的“好像是这样”。到了编程题部分一般是三道题左右难度梯度设计比较明显。第一题通常是基础数据结构的应用第二题进阶第三题会结合一些游戏场景。简答题是我个人觉得最有“网易特色”的部分。它不是让你写代码而是让你用文字描述方案设计思路。当时遇到的题目大致是“在MOBA游戏中如何设计一个技能系统来支持多种技能类型和效果组合”这种题没有标准答案但考察的是你对游戏系统的抽象能力和架构思维。整体看下来如果只刷力扣而不补充游戏开发的知识储备笔试很容易在图形学、数学和游戏系统设计这些模块卡住。2. 编程题核心考点拆解网易游戏研发的笔试编程题和互联网后端岗位的题目风格有明显区别。最大的感受是题目特别喜欢包一层游戏背景的外壳但内核还是在考数据结构和算法基本功。2.1 结合场景的BFS/DFS当时第一道编程题我记得是跟“地图寻路”相关的背景。大致是给定一个二维网格地图有些格子是障碍物有些是可通行区域要找到从起点到终点的最短路径长度。题目本身不复杂标准BFS就能解决。但有几个细节值得注意需要自己处理输入格式网格大小和障碍物坐标都是通过标准输入读入的。起点和终点可能相同此时最短路径长度为0。有些格子可能永远无法到达终点需要返回-1表示不可达。考场上我第一版代码直接写了DFS交上去之后自己测试大数据量的用例发现爆栈了马上改成BFS。这个教训想重点说笔试环境不像平时开发有IDE帮你查错编译通过不代表算法正确边界数据一定要自己在脑内跑一遍。#include bits/stdc.h using namespace std; int main() { int n, m; cin n m; vectorvectorint grid(n, vectorint(m, 0)); int sx, sy, ex, ey; cin sx sy ex ey; int k; cin k; for (int i 0; i k; i) { int x, y; cin x y; grid[x][y] 1; } vectorvectorint dist(n, vectorint(m, -1)); queuepairint, int q; q.push({sx, sy}); dist[sx][sy] 0; int dx[] {0, 0, 1, -1}; int dy[] {1, -1, 0, 0}; while (!q.empty()) { auto cur q.front(); q.pop(); for (int i 0; i 4; i) { int nx cur.first dx[i]; int ny cur.second dy[i]; if (nx 0 || nx n || ny 0 || ny m || grid[nx][ny] 1) { continue; } if (dist[nx][ny] ! -1) { continue; } dist[nx][ny] dist[cur.first][cur.second] 1; q.push({nx, ny}); } } cout dist[ex][ey] endl; return 0; }这里要注意BFS第一次访问到某个格子时得到的一定是最短距离因为队列按层扩展。这个性质是BFS找最短路的核心依据这也是为什么这里不能用DFS会走冤枉路。2.2 带权并查集的变换思路第二题难度明显上了一个台阶当时题目背景是“装备强化系统”。大意是有若干件装备不同装备之间存在“强化等级关联关系”某些装备的强化会带动另一些装备也提升强化等级输入一系列关联关系和强化操作要求输出最终每件装备的强化等级。这题看起来像模拟题但实际用带权并查集来维护“关联关系”才是最高效的解法。每个集合维护这组装备整体的“基准强化值”以及每件装备相对基准的偏移量。强化某件装备时只需要更新它所在集合的基准值以及相关偏移。考场上我一开始用的是直接模拟每次操作都遍历相关装备更新强化值结果最后一个大数据量的用例超时了。后来想到用并查集优化才把复杂度降到位。并查集的路径压缩策略是每次find递归查找根节点并同时更新每个节点相对根节点的偏移量int find(int x) { if (parent[x] ! x) { int root find(parent[x]); value[x] value[parent[x]]; parent[x] root; } return parent[x]; }这个思路的巧妙之处在于它把“多次操作叠加”转化为“维护量与偏移量的累加”摊还复杂度接近O(1)。实际场景里装备强化系统、技能派生系统这类问题都可以用这个模型来抽象。2.3 动态规划的空间优化技巧第三题是一个典型的状态规划题。背景是做任务规划每个任务有持续时间和收益并且某些任务开始前必须完成一些前置任务要求在规定总时间内最大化收益。这类“带依赖的任务规划”本质上是有向无环图上的动态规划需要先做拓扑排序然后在拓扑序上做状态转移避免重复计算某个任务多次。状态定义可以设为dp[i]表示从任务i开始能获得的最大收益包括任务i自身转移时需要枚举i的所有后继任务jdp[i] max(dp[i], dp[j] value[i])。这样是从后往前算按拓扑逆序递推即可。如果时间限制更严格还能用滚动数组优化空间因为每个任务的状态只依赖其后继任务不需要保留完整二维DP表。这类题暴露出一个关键问题题目表面包装得花哨但底层还是动态规划那套状态设计和转移逻辑基本功不牢靠的话很容易被场景描述绕晕。3. 计算机基础与数学考点网易游戏研发笔试中计算机基础部分覆盖面和深度都值得展开说说。3.1 操作系统与网络细节进程与线程的差异进程有独立地址空间线程共享所属进程的地址空间。在游戏引擎中主线程和渲染线程、物理线程的分工是这种模型的典型应用场景。死锁四条件互斥、持有并等待、不可剥夺、循环等待。游戏服务器中多个模块加锁时尤其需要注意加锁顺序。TCP三次握手和四次挥手这个几乎必考。注意TIME_WAIT状态存在的原因——保证最后一个ACK能可靠送达以及让旧连接的数据包在网络中过期消失避免干扰新连接。用户态与内核态切换系统调用开销、上下文切换代价在游戏服务器高并发场景下表现明显这也是为什么很多游戏服务器会设计线程模型减少锁竞争和上下文切换。3.2 图形学基础概念图形学是游戏研发岗和普通后端岗区别最大的知识块之一。顶点变换流程模型空间到世界空间、世界空间到观察空间、观察空间到裁剪空间的矩阵变换这个管线流程笔试中经常以选择题或简答题出现要清楚每步变换矩阵的构造原理。深度缓冲为什么透明物体通常需要在深度测试开启的情况下从远到近排序渲染因为开启深度写入时近物体会挡住远处的透明物体产生错误的混合结果。光照模型Phong、Blinn-Phong、PBR基础概念至少要知道区别和应用场景。尤其是半程向量的计算Blinn-Phong用半程向量近似反射方向效率高效果好移动端比较常用。法线变换非均匀缩放后法线不能直接用模型变换矩阵变换需要用逆转置矩阵。这是一个经典考点很多人不知道这个细节。图形学这些概念平时不做渲染相关工作可能用不上但笔试不会因为你的岗位方向是服务器就觉得你不需要懂。游戏研发是一个整体即使做服务器方向图形学基础也是区分候选人的重要参考项。3.3 游戏数学重点游戏数学是游戏研发笔试中不能丢分的部分。向量点积点积叉积求法线、判断向量朝向矩阵的线性变换和仿射变换四元数与欧拉角的优缺点对比四元数为什么能避免万向节死锁因为它在四维空间表示旋转绕三个轴的复合旋转相当于一个四维超球面上的插值过程不会出现欧拉角那样“两个轴对齐导致丢失自由度的退化”。但代价是数值上更抽象不容易直观理解。数学部分的题一般不会太深但都是游戏引擎实现中真正会用到的内容值得认真准备。4. 实操过程中的答题策略与时间管理在线笔试和平时刷题最大的区别在于时间压力和心态干扰。两个小时看起来不短但整套试卷做下来时间还是紧张的。4.1 时间分配建议以我当时的情况为例大致的时间分配是这样单选和多选控制在30到40分钟以内。这些题大部分是记忆性和理解性的徘徊太久只会压缩后面编程题的时间。简答题20分钟左右。重点是把框架写清楚不需要长篇大论但核心设计思路要展示出来。编程题剩下60到70分钟。三道题的难度梯度比较明确理想状态是10到15分钟解决第一题20到25分钟解决第二题第三题有30分钟以上的时间用来理解和实现。如果时间真的不够用优先保证第一题和第二题的完整性第三题哪怕只实现暴力解法也比空着强。4.2 做题顺序和取舍策略我的个人习惯是先花5分钟把整套卷子的题全部扫一遍了解编程题分别是考什么类型的然后从擅长的部分先做。编程题有个很实用的原则先想清楚再写不要边想边写。笔试改错成本高没有调试器帮你追踪每一步逻辑想不清楚就动笔大概率写出有bug的代码到时候排错时间比写代码时间还长。对于简答题不需要纠结用词是否完美核心在于把你的设计思维清晰呈现出来。技能系统的设计可以从“数据驱动”和“组件化”入手技能配置表定义技能效果类型伤害、治疗、控制、位移运行时由技能管理器解析配置并创建对应的技能实例技能实例挂载不同的效果逻辑模块模块之间通过事件机制通信。4.3 自测用例的重要性写完代码后一定要在脑中模拟几组用例的输入输出特别是边界条件空数组、空字符串起始位置和终止位置在边界上图不连通的情况输入数据量最大的情况是否超时有些同学平时习惯本地跑用例到了笔试环境因为不知道怎么写测试用例反而忽略了这关键一步。在线笔试虽然也允许你手动输入测试用例跑一下但如果每个用例都手动输入太耗时就会非常紧急养成脑内自测的习惯会高效得多。5. 常见问题与避坑指南5.1 编程环境不熟悉导致浪费时间网易用的是牛客网的系统编程题支持C、Java、Python等多种语言但环境和你本地的IDE有差异。候场时可以提前进系统熟悉一下界面了解代码从哪里粘贴输入输出怎么读取。我当时的经验是先把C的标准输入输出模板复制到代码区再开始处理题目避免写到最后发现main函数没写完整。#include bits/stdc.h using namespace std; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); // 业务逻辑 return 0; }这行ios::sync_with_stdio(false)加上cin.tie(nullptr)非常重要。笔试平台的测试用例数据量通常很大如果不解除cin和C标准输入输出的同步cin的读取速度会明显变慢在最多数据用例上可能超时。我见过不少同学算法明明正确就因为输入输出太慢导致超时挂掉。5.2 审题不仔细导致偏离题意在线笔试要自己读题自己理解很容易漏掉关键条件。比如数组下标从0还是1开始是否需要去重输入可能包含多组测试用例时间复杂度要求网易的题目描述有时候会比较长背景故事写得详细但真正的约束条件藏在最后几行。我的习惯是读题时先把输入输出格式和约束条件圈出来再回头看场景描述避免被背景绕晕。5.3 简答题内容太少很多同学觉得简答题不是编程题不需要写太多实际上简答题是展示你游戏研发思维的重要窗口。即便是两分的简答题也建议把设计思路、模块划分、数据结构选择、扩展性考虑写清楚。比如问“如何设计一个背包系统”你可以这样展开核心数据结构二维数组或哈希表按背包类型和格子索引存储物品实例。物品堆叠同类可堆叠物品共享一个堆叠上限用数量字段记录。背包扩容动态扩容时保持已有物品信息不丢失。物品使用和移动通过接口封装物品生命周期管理避免UI层直接修改存储层。展示出你对问题的拆解和组织能力这往往比技术细节更让面试官有好感。5.4 过度追求一次写对导致的心态失衡在线笔试没有重来的机会很多同学写完第一题就想“绝对不能错”反复检查结果第二题第三题时间不够。我的应对策略是第一遍写完能跑通核心逻辑就继续做下一题等所有题都做完如果还有多余时间再统一回去检查。先把分拿到手再精益求精。5.5 忽视渲染和网络方向的知识前文提到的图形学考点、服务器网络同步考点如果只刷算法题不做针对性的游戏研发知识储备笔试时会发现自己直接碰上没接触过的概念。游戏研发笔试不像后端岗那样“纯算法拿高分就行”它要求的是“算法为主游戏知识为辅”的组合能力。我当时在复习阶段把《游戏引擎架构》的关键章节过了一遍重点关注渲染管线、物理系统、动画系统、网络同步这四大块同时配合一本图形学入门书籍补充基础概念。这些东西不要求你达到深入代码级别但概念层面必须能分辨清楚。5.6 不准备简答题导致框架感不足网易的简答题一般都会考察系统设计能力而不是零散的知识点记忆。如果你没有提前做过类似的系统设计思考现场启动会没有方向感。准备阶段建议自己画一个经典架构的实体类图或者数据流过程图技能系统发动的完整流程、背包系统的模块划分、组队匹配的流程、状态同步和帧同步的差别。这些内容在面试阶段也能复用到。6. 从笔试看网易游戏研发的岗位要求笔试不仅仅是筛选手段它其实反映了一家公司对这个岗位核心能力的要求。从这次笔试的题目设计来看网易互娱游戏研发岗希望候选人具备三方面的能力6.1 扎实的算法基本功这不用多说编程题占据大头数据结构、算法复杂度、边界条件这些都是硬功夫。笔试很多算法题都包含一定的递进层次不做优化可以通过小数据用例但大数据用例就会超时。6.2 游戏领域的常识和敏感度不要求你精通渲染引擎源码但至少要知道游戏里哪些系统是常见的这些系统背后会用到哪些技术。比如技能系统、背包系统、装备系统、匹配系统每个系统对应哪些经典设计模式和数据结构。6.3 架构思维和工程意识简答题特别看重这一点。面对一个相对开放的问题你是否能设计出结构清楚、易于扩展和维护的系统还是只能给出点对点的临时方案面试官从你用词和结构就能看出来是“灵机一动”还是“有备而来”。7. 个人实操复盘总结现在回头复盘这次笔试我觉得最大的实战心得可以归纳成三句话第一笔试前一定要刷一套游戏研发方向的模拟卷熟悉“算法图形学系统设计”三大模块并存的题型结构。如果只看通用算法题做网易的卷子会感觉非常突兀。第二编程题写完后要在头脑里模拟多个边界用例不只是功能正确性的测试还要评估复杂度是否在题目限制内。我第二题第一次超时的教训就是没有提前估算最坏情况的时间复杂度。第三简答题不要留白。这是网易笔试的隐藏加分项哪怕思路不够成熟写下你思考的框架也比交白卷强得多。最后再分享一个效率技巧笔试前把常用算法模板整理成一份速查笔记包括二分查找模板、并查集模板、拓扑排序模板、最短路模板、最小生成树模板、常用DP状态转移套路。考试时如果遇到类似题型可以直接套模板修改省下大量思考时间。我用的是LeetCode精选题目和经典算法模板刷了三遍效果非常显著。游戏研发方向的笔试准备方向比努力更重要。祝接下来笔试的同学都能顺利过关拿到心仪的面邀。