尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

网易互娱游戏研发笔试复盘:从算法到工程思维全解析

网易互娱游戏研发笔试复盘:从算法到工程思维全解析 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背包数据规模n1000容量W10000直接用二维DP会超内存我改成了一维滚动数组dp[j] max(dp[j], dp[j - weight[i]] value[i])注意j要倒序遍历防止同一件物品被重复放入。这里我要提醒一个很多人会犯的错**背包问题里物品遍历顺序和外层循环位置写反会导致答案完全错误。**如果你是在笔试现场调试别急着怀疑题目有问题先检查是不是这个细节。3.2 游戏研发特色题状态同步、AOI、随机数渲染除了算法题那场笔试里还有一些明显带有游戏研发特色的题目。我记得有一道选择题是问在帧同步游戏中如果两个客户端在同一帧执行了不同的浮点运算结果会发生什么选项有画面不一致服务器崩溃网络延迟增加玩家被踢下线。正确答案是画面不一致因为浮点运算在不同平台上可能有细微差异导致逻辑分叉。这道题让我印象深刻因为它不是靠死记硬背能答对的你需要理解帧同步和状态同步的核心区别。帧同步的核心是相同输入相同逻辑相同结果一旦输入或逻辑出现微小偏差结果就会被放大。这也是为什么很多游戏引擎在帧同步中强制使用定点数而不是浮点数。还有一道简答题问的是在大型多人在线游戏中如何优化大量单位的视野管理这基本就是AOIArea 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的节奏来。这个节奏平时就要练别指望考场上临时调节。分享一个考完后的真实感受网易互娱的笔试并不是为了难倒你而是像一面镜子把你大学四年的积累照得清清楚楚。基础扎实、思维敏捷、对游戏有热情的人不需要刻意准备也能高分通过但如果你和我一样是个普通人那充足的准备是唯一能抓住的确定性。如果你正在准备游戏研发方向的校招笔试希望这篇复盘能让你少走几步弯路。
返回列表