
2018年我完整走了一遍网易互娱的校招流程游戏研发和平台开发两个方向都有接触后来自己也开始参与技术面试回头看这批真题很多题目到现在都有很强的参考价值。这篇帖子把当年游戏研发、初级游戏研发、平台开发三个岗位方向的高频考点做一个系统梳理结合我后来面试别人、带新人时的观察把题目背后的考察逻辑讲清楚给准备校招、实习或者想转行进入游戏行业的朋友一份可直接参考的复习地图。先说清楚这篇内容能解决什么问题如果你正在准备游戏公司的技术岗面试尤其是网易互娱这类偏重基础功底和实战能力的团队看完这篇你会知道笔试和面试分别侧重点在哪哪些知识点是必须拿下的哪些地方最容易踩坑。如果你是刚接触游戏研发、还不确定走客户端还是平台开发方向这篇也会帮你理清两个岗位的差异和共同基础。1. 网易互娱游戏研发岗面试到底考什么1.1 2018年真题的整体情况回顾那年网易互娱的校招流程大致是网申、在线笔试、技术面试两到三轮、HR面。在线笔试的题型集中在选择题和编程题选择题覆盖C、数据结构、操作系统、网络编程题一般是两道左右要求在限定时间内写出可运行的代码。平台开发岗的笔试卷会在数据库和Linux相关题目上加重比例而游戏研发岗则会更偏向C底层机制和算法。从考生回忆版的问题汇总来看高频题材高度集中在几个方向C语言特性与内存管理、常用数据结构和算法、操作系统进程线程模型、网络编程基础、游戏引擎或图形学基础。初级游戏研发岗还会出现一些用来考察“潜力”的开放式问题比如“让你设计一个游戏中的背包系统你怎么考虑”这类没有标准答案的题目。我复盘那年的题目时最大的感受是网易互娱的题目不偏不怪几乎没有脑筋急转弯式的题目但考察点扎得很深。比如同样考虚函数它不会只问你“虚函数是什么”而是给一段继承关系复杂的代码让你分析构造析构顺序、虚函数表布局、切片问题。这说明面试官真正想看的不是你会不会背概念而是你有没有建立完整的C对象模型认知。1.2 三条岗位线的定位差异游戏研发、初级游戏研发、平台开发看起来都是程序员岗位但面试官筛选人的标准有明显差异我用一张表说明岗位方向核心职责面试侧重点能力倾向游戏研发参与游戏客户端或服务端核心模块开发偏向玩法系统、引擎工具、性能优化C机制、数据结构、图形学基础、场景设计能深入理解底层具备性能敏感思维初级游戏研发面向校招新人的入门岗位负责具体模块的实现和维护编程语言基础、算法基本功、学习能力、代码风格基础扎实、可塑性强、沟通顺畅平台开发支撑游戏业务的平台系统、工具链、基础服务包括账号、计费、日志、监控、配置后台等数据库、网络、分布式、Linux、项目架构能力工程化思维强具备系统全局视角很多同学会纠结报哪个岗位我的建议是如果你对游戏玩法、引擎、渲染感兴趣做游戏研发如果你更享受搭建稳定可靠的服务系统、处理高并发数据流转平台开发其实是一个被低估的选择它不像客户端那样需要很强的图形学背景但对工程能力和架构思维要求更高。1.3 从真题反推面试官的考察逻辑把真题整体看一遍能摸清面试官的出题逻辑基础不牢地动山摇。游戏是性能极度敏感的领域一个卡顿、一次掉线都会直接影响玩家体验所以面试官必须确认你理解底层原理而不只是会用高级语言写业务。C为什么是游戏研发的默认语言因为它给了你直接管理内存的能力也给了你制造内存泄漏的机会能不能用好就看功力。第二个考察逻辑是算法解决实际问题的能力。笔试编程题不会出太偏的算法基本都是“常见的算法在特定场景下的应用”比如用哈希表做去重、用堆做TopK、用链表实现LRU。这些题本身不难但很多人挂在边界条件和复杂度分析上后面我会详细说。第三个逻辑是沟通和思维能力。面试官问场景设计题时其实是在听你的思维过程你是否能在信息不完整的情况下提出合理假设、分步拆解问题、权衡不同方案的优缺点。这一点在平台开发岗面试中尤其重要因为平台系统的需求往往来自多个游戏项目组你必须在模糊需求中理清思路。2. 核心题型拆解这些题背后在考你的什么能力2.1 C与内存管理不只是背八股那年真题里出现频率最高的是C相关问题经典的几道题包括虚函数是怎么实现的、构造和析构函数为什么不能是虚的、shared_ptr和unique_ptr的区别、内存对齐是什么、C内存分区、new和malloc的区别等。但面试官很少直接问概念而是把概念包装在代码片段中。举个例子考生回忆版里有一道高频题给定一个基类和派生类各自有构造函数和析构函数问创建派生类对象时构造和析构的执行顺序以及将基类指针delete时会发生什么。如果基类析构函数不是虚函数delete基类指针时派生类析构不会被调用造成资源泄漏这就是经典的“析构函数必须声明为虚函数”的场景。这类题考察的是对象生命周期管理和多态实现的底层理解是游戏引擎中到处都会遇到的问题。我当时复习C时有一个心得不要抱着《C Primer》硬啃而是以题带点每道题都问自己“这个机制在游戏引擎的哪个模块会被用到”。比如内存对齐在处理网络协议数据包时如果结构体对齐方式和发送端不一致解析出来的数据全是错的这个知识点在平台开发中的网络通信模块尤其常用。用这种方式复习概念记得牢面试被追问时也能给出更落地的回答。2.2 算法与数据结构纸上写代码的水平决定胜负笔试和面试手撕代码环节高频考点集中在链表操作、二叉树遍历、字符串处理、动态规划、二分查找、TopK问题。这些属于算法基础中的基础但恰恰是刷题量不够的同学最容易翻车的地方。一道在多个面经里反复出现的题是“反转链表”要求分别用迭代和递归两种方式实现。看起来简单但很多人在递归版上卡住因为不清楚递归函数返回的到底是新链表的头节点还是当前节点。这种题就是在考察你对指针引用的掌控力和递归思维清晰度。类似的还有“判断链表中是否有环”“找两个链表的交点”“删除链表倒数第N个节点”都是同一级别的经典题。另一类高频题是二叉树相关的前序中序后序遍历、层序遍历、最近公共祖先、二叉树最大深度。网易的面试官很喜欢在二叉树题目上加条件比如“二叉树每个节点存储了父节点指针求两个节点的最近公共祖先”这个变体会把简单题升级成中等难度考察你能否根据额外条件优化时间和空间复杂度。刷这类题时不要只看题解一定自己在白纸上画出递归过程逐层展开才能真正建立递归直觉。动态规划在2018年真题里出现的概率不高但一旦出现就是拉分题。常见的有背包问题、最长递增子序列、编辑距离。我建议DP复习做到能独立推导状态转移方程即可不追求刷太多难题因为面试官更看重的是你面对陌生DP题时的分析路径先定义状态、再写转移方程、再处理边界而不是直接背出标准解法。2.3 操作系统与网络服务端性能问题的底层真相操作系统和网络相关的题在游戏研发岗和平台开发岗中都是必考内容但考察角度不同。游戏研发岗更关心进程和线程在游戏引擎中的应用比如为什么游戏主循环通常跑在一个主线程上、多线程渲染的同步问题怎么解决平台开发岗则更关心并发模型和高并发网络处理。高频考点第一梯队进程和线程的区别、死锁产生的四个必要条件、线程同步的方式互斥锁、读写锁、条件变量、信号量、用户态和内核态切换。这些题没有太多技巧关键是在理解原理的基础上结合场景描述。比如问“什么场景适合多进程什么场景适合多线程”最好的回答不是说“进程稳定、线程轻量”而是结合游戏服务器的实际例子不同游戏房间之间用进程隔离房间内玩家用线程协作这样的答案会让面试官眼前一亮。网络部分TCP三次握手和四次挥手几乎年年考但面试官会追问“为什么是三次而不是两次”“TIME_WAIT状态为什么需要存在”。这些追问考察的是对可靠性传输本质的理解。平台开发岗还会问select、poll、epoll的区别以及Reactor和Proactor模型尤其是epoll的水平触发和边缘触发这是游戏服务器高并发通信的基础属于必背知识点。我当时准备网络题目时踩过一个坑只背结论不理解TCP状态转换图的来龙去脉。后来面试官问我“大量TIME_WAIT连接出现在哪一端、怎么处理”时我愣了半天。实际上服务端主动关闭连接就会出现大量TIME_WAIT处理手段包括调整内核参数、让客户端主动关闭、或者使用长连接复用。这种问题没有标准答案考察的是你把协议栈知识和实际系统调优结合的能力。2.4 图形学与游戏引擎初级岗也要懂渲染管线很多准备初级游戏研发岗的同学不重视图形学觉得自己不做引擎开发只要会写Unity脚本就够了。这是个大误区。网易互娱的面试真题里图形学基础占了相当比重而且初级岗位同样会考到。高频题目包括渲染管线的各个阶段分别做什么、顶点着色器和片元着色器的区别、模型变换视图变换投影变换的含义、左手坐标系和右手坐标系的区别、纹理采样的原理、Z-Buffer算法。这些概念不要求你达到能手写渲染器的水平但必须能用通俗的语言讲清楚。举个例子面试官可能会问“一个三维模型从建模软件里导出到最终显示在屏幕上经历了哪些变换”标准回答是模型空间到世界空间是模型变换世界空间到相机空间是视图变换相机空间到裁剪空间是投影变换最后经过视口变换映射到屏幕坐标。如果还能补充一句“投影变换里又分为透视投影和正交投影游戏里通常用透视投影UI和地图用正交投影”面试官就会觉得你是真的理解而不是背概念。Unity和Unreal引擎相关的题目在初级岗面试中出现频率较高比如Unity的脚本生命周期、Update和FixedUpdate的区别、Prefab和场景资源的管理方式。这些问题本身不难但容易被忽视。我建议至少在面试前完整过一遍官方文档的常用模块而不是只依赖平时写项目的经验项目经验往往是零散的文档能帮你建立体系化认知。3. 平台开发岗的差异化考点从单机思维到分布式思维3.1 数据库与缓存的设计题平台开发岗笔试和面试中数据库题目占比明显高于游戏研发岗。2018年出现的高频考点包括MySQL的索引原理B树结构、聚簇索引和非聚簇索引、事务的ACID特性、事务隔离级别、乐观锁和悲观锁、SQL语句的优化方法。这些属于后端开发的基本功但也恰恰是新手容易只背不用的部分。真题里有一道很有代表性的设计题“游戏玩家有等级、金币、充值金额等字段需要按充值金额排行也要支持按等级查询玩家列表应该怎么设计索引”如果回答“直接加索引”就太笼统了面试官期待的是你分析索引的适用场景充值金额排行适合用覆盖索引加缓存等级查询如果经常做范围查询可以在等级字段上建二级索引同时考虑区分度区分度太低的字段建索引效果反而不理想。Redis相关的题目在2018年也开始增多比如Redis支持哪些数据类型、每种数据结构底层实现是什么、缓存穿透缓存击穿缓存雪崩三个问题的区别和解决方案。这三个问题几乎是平台开发岗面试的必问三连不仅要能说清是什么还要给出应对方案缓存穿透可以用布隆过滤器缓存击穿可以用互斥锁或逻辑过期缓存雪崩可以用过期时间加随机值分散、熔断降级、多级缓存。3.2 分布式一致性面试官真正想听什么平台开发岗和游戏研发岗最大的不同在于前者必须习惯分布式环境下的各种问题。2018年网易的真题已经开始涉及分布式相关内容包括CAP定理、分布式锁的实现方式、消息队列的引入场景、幂等性设计。CAP定理是必问项但单纯背出“一致性、可用性、分区容错性三者不可兼得”是远远不够的。面试官更希望听到的是在游戏平台的实际场景中你怎么根据业务需求做取舍。比如一个游戏论坛的点赞计数可以接受轻微的不一致换取高可用而一个充值订单系统绝对不能丢数据必须把一致性放在首位。把CAP和实际业务结合是面试拿高分的核心技巧。平台开发岗还特别喜欢考察“接口幂等”问题玩家在一次网络抖动中重复提交了充值请求服务端怎么保证不会重复扣费或重复发道具合理的回答分三层接口层面通过唯一请求号去重服务层面通过数据库唯一索引兜底业务层面通过状态机保证状态流转的幂等性。这类问题考察的不是知识储备量而是工程经验的完整度。这里顺便说一句近几年的平台开发技术栈越来越多元化跨平台开发工具链比如C#/.NET在游戏平台后台也有不少应用尤其是内部工具类系统用跨平台方案能省去很多环境适配的麻烦。面试时如果能提到你用过的具体平台、中间件或者开发框架会比单纯讲理论有说服力得多。3.3 为什么平台岗也考游戏逻辑题很多同学疑惑平台开发又不写玩法为什么要考游戏逻辑题我在实际工作中找到了答案平台系统是给游戏业务服务的如果你完全不懂游戏运行机制设计出来的排行榜、匹配、日志、计费系统大概率不符合业务真实需求。2018年平台开发岗面试中出现过类似题目“一个跨服排行榜系统要支持千万级玩家实时查看排名怎么设计”这道题表面考后端架构实际上需要你理解游戏的实时性要求高、读写比例悬殊的特点。常规回答思路是分桶存储分数区间、用跳表或有序集合维护排名、异步落库、CDN加速排行页面、热点玩家缓存。如果你还能想到“排行榜的分数必须是可校验的防止作弊”这个点就能明显超出预期。所以平台开发岗的面试准备建议你在夯实数据库、分布式、Linux基础之上有必要花时间了解一款主流游戏的基本流程登录、创建角色、进入关卡、同步状态、保存回放、结算奖励每一环对应哪些平台服务对理解岗位职责非常有帮助。4. 真题实操演练手把手拆解三道高频题4.1 算法题手写LRU缓存淘汰这是一道在2018年各岗位笔试和面试中都出现过的经典题也是我现在面试别人时几乎必考的一道题因为它能考察候选人对哈希表、双向链表、C封装、边界条件处理的综合能力。题目要求设计一个LRU缓存支持get和put操作get和put的时间复杂度要求O(1)。思路拆解O(1)的get意味着要有哈希表O(1)的put且要维护访问顺序意味着要有双向链表哈希表的value存链表节点的迭代器就能在O(1)时间内找到节点并移动到链表头部。淘汰时删除链表尾部节点同时删除哈希表中对应的key。参考实现C#include list #include unordered_map class LRUCache { public: LRUCache(int capacity) : cap_(capacity) {} int get(int key) { auto it mp_.find(key); if (it mp_.end()) { return -1; } // 将访问的节点移动到链表头部 lst_.splice(lst_.begin(), lst_, it-second); return it-second-second; } void put(int key, int value) { auto it mp_.find(key); if (it ! mp_.end()) { it-second-second value; lst_.splice(lst_.begin(), lst_, it-second); return; } if (lst_.size() cap_) { // 删除链表尾部节点 int oldKey lst_.back().first; lst_.pop_back(); mp_.erase(oldKey); } lst_.emplace_front(key, value); mp_[key] lst_.begin(); } private: int cap_; std::liststd::pairint, int lst_; std::unordered_mapint, std::liststd::pairint, int::iterator mp_; };面试时比写对代码更重要的是先说清楚思路并且主动分析复杂度。另外提醒一个细节面试官如果问“为什么用list而不是vector”你要能答出list的splice和insert操作不会导致迭代器失效而vector在扩容时会使所有迭代器失效这是选型的关键理由。4.2 设计题吃鸡类游戏的服务器架构怎么设计2018年正是吃鸡类游戏最火的时期网易也推出了自己的吃鸡产品所以“大逃杀类型游戏服务器架构设计”成为那一年出现频率很高的设计题。这道题在游戏研发岗和平台开发岗都出现过只是侧重点不同。基础回答分模块拆解客户端连接统一接入网关集群网关负责连接管理和流量转发匹配服务独立部署负责撮合玩家进入房间房间服务负责一场对局的逻辑包括玩家进入、物资生成、安全区收缩、淘汰判定战斗内状态同步服务负责转发玩家的位置、动作等实时信息对局结束后结果写入数据服务用于排行榜和战绩查询。再往上走一个层级面试官会追问并发和同步问题一局游戏100名玩家每个玩家每秒上报10次位置信息这个房间服务的单机瓶颈怎么评估此时需要你掏出计算器算一下100人乘以10次每秒就是1000次每秒的写入每一次写入包含玩家ID、坐标、朝向、时间戳估算100字节也就是每秒100KB的流量单机完全能扛住但如果一个服要同时承载10万玩家就需要把不同房间分布到不同机器上同时引入消息队列做削峰。另一种追问角度是同步方案选型。我会在下一节详细展开帧同步和状态同步因为这是整个设计题中区分度高的一部分。我还被追问过“服务器宕机了怎么办”这类问题没有标准解关键是给出备份、主从切换、对局重连等思路展示你的容灾意识。4.3 场景题FPS游戏中的状态同步与帧同步状态同步和帧同步是游戏开发面试的高频话题在2018年真题里既有直接提问的也有隐藏在设计题里的。明确区分这两个概念再结合适用场景分析是拿分的核心。状态同步的核心思路是客户端把操作指令发给服务器服务器经过逻辑计算后把最终的游戏状态广播给所有客户端。帧同步的核心思路是服务器只转发玩家的操作指令所有客户端各自用自己的逻辑代码执行同一套帧运算保证结果一致。用通俗的说法状态同步是“服务器说了算客户端只负责展示”帧同步是“所有客户端拿到同一份操作清单各自算一遍结果应该相同”。面试官会追问两类问题。第一类“为什么MOBA游戏常用帧同步而FPS游戏常用状态同步”参考回答MOBA游戏单位数量少、技能逻辑复杂度高但状态变化维度有限帧同步可以把逻辑计算压力分散到客户端节省服务器成本而FPS游戏玩家移动速度极快位置状态变化频繁帧同步很容易因网络波动导致逻辑分叉状态同步配合插值和预测能提供更好的体验。第二类追问“状态同步下的延迟补偿怎么做”这里可以展开讲客户端预测、服务器回滚、延迟插值等机制。即使不能答得特别深入至少要让面试官看到你知道网络延迟是游戏同步的核心挑战并且知道业界主流的应对思路。我当时面试被问到这个层面时坦白说了自己了解不深入但立刻补充了我在小项目中实际用过的客户端插值方案面试官反而认可了这种“知道边界、坦诚沟通”的态度。5. 面试复盘求职过程中的避坑指南5.1 笔试环节的常见失分点我参与过笔试阅卷后发现编程题失分的原因往往不是不会做而是细节处理不到位。排名第一的失分点是完全不写注释或不写函数签名阅卷人需要花很长时间理解你的代码意图。排名第二的失分点是边界条件缺失比如链表题目没有处理空链表、动态规划题目没有初始化边界状态。还有一个很多人忽视的点题目要求的输入输出格式。笔试系统是自动判题还是人工阅卷要求不一样但如果你严格按照题目给的输入输出示例来写至少不会因为格式问题扣分。笔试时间分配上建议先花五分钟把每道题都读一遍优先做自己有把握的题不要在一道题上死磕。我当年就见过一个同学在最后一秒提交了未编译通过的代码其实那道题只要换个方向写就很简单。笔试结束后如果系统支持查看用例通过情况记得把通过用例的数据下载下来复盘自己哪些边界情况没想到这些往往是面试手撕环节的加分素材。我整理自己的刷题错题本时每一道题都记录了“这次踩了什么边界条件的坑”面试前翻一遍比重新刷题效率高得多。5.2 技术面的表达技巧如何让面试官听懂你技术面试不仅是技术考察也是沟通能力考察。很多同学技术不错但表达混乱导致面试官无法判断真实水平。我总结了一个“三步法”先回答结论再解释原理最后补充场景。比如面试官问“为什么TCP是三次握手而不是两次”不要一上来就罗列SYN、ACK的报文细节而是先说结论三次握手能保证双方的收发能力都得到确认防止历史重复连接初始化造成的资源浪费。然后解释第一次握手确认客户端发送能力、第二次握手确认服务端收发能力、第三次握手确认客户端接收能力。最后补充一个实际场景网络中有延迟的重复SYN包如果只有两次握手服务端无法区分这是新连接还是延迟报文会白白建立连接。这样结构化的回答面试官很容易跟上你的思路。遇到不会的题怎么办我的建议是不要立刻说不会先把你理解到的部分说出来再向面试官确认“这道题我目前能从这几个方向分析但细节我不确定您希望我往哪个方向深入”这种处理方式至少展示了你的分析能力和学习意愿比直接放弃好得多。我面过不少人遇到不会的题能冷静拆解的人最终评价普遍高于那些遇到陌生问题就慌乱的候选人。5.3 简历与项目经历怎么包装项目经历是面试中最大的谈资但前提是你真能讲清楚。当年我修改简历时发现很多同学写的项目描述只是罗列技术栈比如“使用Unity开发了一个射击游戏”面试官问“这个项目的性能瓶颈在哪你怎么优化的”就答不上来。写项目的建议是每个项目写清楚背景、你的职责、核心难点、解决方案、最终效果。尤其是核心难点需要提前准备好回答。比如你在开发平台工具时遇到了数据库慢查询怎么定位的、怎么改索引、执行时间从多少毫秒降到多少毫秒这种具体数字最有说服力。简历中不要写不熟悉的技术名词因为你写的每一项都可能被面试官追问。我当时在简历里写了一句“熟悉Docker容器化部署”结果被追问镜像分层原理、容器网络模式差点答不上来。后来把简历改成了“使用Docker搭建了CI环境并解决镜像构建缓存问题”反而成了面试中能出彩的项目点。游戏研发岗的简历如果有demo、游戏原型、技术博客、GitHub仓库建议附上网易的面试官很愿意在面试前看你的实际作品作品比语言描述更有说服力。我自己面试别人时如果候选人作品里有一个完整可运行的小游戏哪怕玩法简单我都会额外加分因为这说明你至少能把一个想法做到闭环。6. 写在最后对求职者的几条实在建议整理这批真题的过程中我最大的感受是游戏研发和平台开发的知识体系虽然有差异但底层都离不开扎实的计算机基础和动手实践能力。2018年的题放到今天核心考点依然稳定变化的是技术栈的丰富程度不变的是面试官对人选基本功的考察。如果时间有限建议优先攻克三件事一是C对象模型和内存管理把虚函数、智能指针、内存泄漏排查相关的问题彻底吃透二是高频数据结构和算法题刷两遍以上达到闭眼能写的熟练度三是准备两个自己真正参与过的项目能清晰讲出难点和解决方案。最后一个小建议面试不只是被考察也是你在考察团队。面试快结束时的问题环节可以问面试官“团队目前最大的技术挑战是什么”“新人的培养路径是怎样的”对方的回答里能看出团队的技术氛围和重视程度。选一个让你愿意长期成长的地方比单纯拿一个Offer更值得认真对待。