后台总能看到类似的提问想进游戏行业做研发是不是把LeetCode刷够三百题再把C Primer翻三遍就稳了说实话方向对了一半但真正坐到面试官对面会发现游戏研发岗尤其看重“这个知识点落到游戏里是怎么用的”。我把网易互娱2019年游戏研发、初级游戏研发、平台开发岗的部分真题做了一次复盘这些题目有的是当年面经区流传出来的有的是我和同行一起回忆整理的现在按考察维度拆开揉碎讲清楚每类题背后的意图和答题逻辑。这份梳理适合两类人一类是准备投游戏研发岗校招或社招的候选人另一类是刚入行不久、想系统补基础的游戏开发新人。即使你不是冲着网易去的这套考察体系也基本代表了国内中大型游戏公司研发岗的通用标准吃透了走到哪里面试都不慌。1. 网易互娱游戏研发岗面试到底在筛什么1.1 研发、初级研发、平台开发三个方向的能力侧重先搞清楚一件事游戏研发、初级游戏研发、平台开发岗名字听起来像同一类岗位实际考察侧重点很不一样。游戏研发岗更偏客户端工作内容围绕玩法逻辑、战斗表现、UI系统、引擎功能扩展展开面试时C、数据结构和算法、图形学基础是重头戏。初级游戏研发岗对项目经验要求低一些但基础题问得更细算法题占比也更高典型表现是“八股文”和手撕代码各占半边天。平台开发岗则偏服务端和后端基础设施工作内容跟游戏逻辑的耦合度低一些但更强调网络编程、Linux、分布式、数据库、服务器架构面试里TCP/UDP、多线程、高并发这些内容会明显增多。所以拿到真题第一步不是急着做而是先对标自己投的是哪个方向。我见过不少候选人拿着平台开发的题准备客户端面试或者反过来结果被问到自己不熟悉的方向时完全懵掉。这不是能力问题是备考方向一开始就偏了。1.2 从面试流程看各环节的技术权重网易互娱的校招流程一般是笔试、一面、二面部分岗位还有HR面。笔试以选择、简答和编程题为主考察范围宽但深度不算太深一面偏基础面试官会拿着一份题库逐项问C、操作系统、网络、算法都会覆盖到心态上更像是“摸底”二面开始贴近项目实际会深挖某个具体模块的实现细节也会给一个场景让你当场做设计考察的不再是知识点记忆而是你面对开放问题时的思路。这份真题复盘我按知识点分成了几块顺序基本对应面试中出现的频率C永远是大头数据结构和算法紧随其后客户端再加图形学平台开发再加网络和服务器。每个模块下面我都留了一部分“延伸思考”这些不会在题目原文里出现但面试官很可能顺着你的回答往下问提前想清楚比背答案有用得多。2. C基本功真题复盘从内存到虚函数经典题背后的意图2.1 内存分布与智能指针必考里的必考有一道高频题几乎是每次面试都会遇到的程序在运行时的内存分布是怎样的栈和堆有什么区别哪些变量分别放在哪里。这道题本身不难但答得好不好很容易拉开差距。多数候选人能说出栈区存局部变量、堆区存动态分配内存、全局变量在静态区到这就停了。但面试官真正想听的是你写过代码之后的理解比如栈内存由编译器自动分配和释放、速度很快但空间有限堆内存由程序员手动申请和释放、速度慢但空间灵活还要知道一个进程的虚拟地址空间从高地址到低地址大概是怎么排的内核空间、栈区、共享库映射区、堆区、BSS段、数据段、只读代码段。延伸到智能指针考题就变成了shared_ptr、unique_ptr、weak_ptr的区别和底层实现。很多人会把八股文背得很顺但问到“shared_ptr的引用计数存在哪里”就卡壳了。正确回答是引用计数通常存在堆上分配的控制块里shared_ptr对象本身只保存裸指针和控制块指针。再往下问“weak_ptr如何解决循环引用”就一定要讲清楚weak_ptr不增加引用计数它通过一个独立的弱引用计数来跟踪对象的存活状态访问时先lock()提升为shared_ptr如果对象已销毁则得到一个空的shared_ptr。我自己的经验是这类题想答出亮点最好顺手说一下实际项目里怎么用。比如多线程环境下shared_ptr的引用计数操作是原子性的但指向的对象本身不保证线程安全所以用之前还是要加锁或用原子操作。能主动提到这一层的候选人给面试官的印象会明显不一样。2.2 虚函数表与多态回答到哪一层才算过C多态是另一道必考题表现形式各不相同。有的面试官直接让手写一段代码定义一个基类和一个派生类问输出什么有的会问“构造函数和析构函数能不能是虚函数”。这类题表面考语法实际考的是对虚函数表机制的理解。完整的作答逻辑应该是这样的存在虚函数的类会生成一个虚函数表vtable对象的内存布局最前面是一个虚函数指针vptr指向这个虚函数表。构造对象时vptr会先指向基类的虚函数表基类构造函数执行完后再指向派生类的虚函数表这就是为什么构造函数中调用虚函数不会发生多态。析构函数必须声明为virtual否则通过基类指针delete派生类对象时只会调用基类析构函数派生类资源无法正确释放造成内存泄漏。再往下可能会问多重继承情况下对象里的vptr有几个答案是多个有几个基类就有几个vptr派生类自己的虚函数会追加到第一个基类的虚函数表里。能答到这个细节基本上就能证明你看过底层实现而不是只背了结论。2.3 STL底层实现vector扩容与map迭代器失效STL是游戏研发岗的高频考点毕竟项目代码里天天用。vector、map、unordered_map各自的底层数据结构怎么扩容迭代器什么时候失效这些都是必须能立刻答出来的基础题。vector扩容是个经典题。很多候选人知道“容量不够时重新分配一块更大的内存”但被追问“扩容倍数为什么是1.5或2而不是固定增加N个元素”时就开始逻辑不清。合理回答是如果每次只增加固定数量整体插入复杂度会退化成O(n)而按倍数增长总代价均摊下来是O(1)。至于1.5还是2本质是空间和时间的权衡——倍数越大均摊复杂度越稳定但空间浪费更严重。map和unordered_map的迭代器失效问题也常被拿出来对比。map底层是红黑树插入和删除操作不会导致其他元素的迭代器失效只要不删除当前指向的元素迭代器就还有效。但vector一旦发生扩容所有迭代器全部失效即使不扩容在中间插入元素也会使插入点之后的迭代器失效。另外一个很细的考点是unordered_map在rehash时迭代器同样全部失效而map不会。这些细节如果项目里踩过坑会印象特别深没踩过就只能靠背所以我建议准备面试前不妨自己写个小demo故意去访问失效迭代器实际报错一次比背十遍都管用。3. 数据结构与算法题手撕代码题的复习方向与翻车点3.1 经典算法题排序、查找、链表操作网易游戏研发岗的算法题不算变态基本不出LeetCode hard范围但非常看重代码的完整性和边界条件的处理。手撕快排几乎是保留项目要求现场写一个能跑的版本还要分析时间复杂度和最坏情况怎么避免。快排的坑在于partition函数的区间控制用闭区间还是开区间递归时区间怎么收窄写错一个下标就是死循环。建议平时固定一种写法练熟不要每次写都不一样。链表题也出现得很频繁比如反转链表、判断链表是否有环、找链表中点。这类题主要考察指针操作的基本功。反转链表用迭代法时一定注意保存下一个节点再改指向否则链表就断了判断链表有环用快慢指针快指针每次走两步慢指针每次走一步如果相遇说明有环。搜索题则集中在二分查找和二叉树的遍历。二叉树的层序遍历要用队列前中后序遍历要用递归或显式栈面试时大概率让你“写个非递归版本看看”所以递归版本熟之外非递归也要能顺手写出来尤其是前序遍历的非递归模板写法要背成肌肉记忆。3.2 算法复杂度分析为什么总被追问有一类题不会单独作为一道大题但会在你写完任何代码之后被追问这段代码的时间复杂度是多少空间复杂度是多少还能不能优化。这里有个很多候选人会踩的坑能把标准答案背出来但不会分析自己刚写的代码。比如写了一个双重循环应该立刻说出O(n^2)写了一个递归二分应该说O(log n)。一旦答不上来前面代码写得再对也会被扣分因为面试官会认为你是背下来的而不是理解后写的。追问“还能不能优化”时思路一般沿着几个方向走能不能用哈希表把查找从O(n)降到O(1)能不能用双指针把嵌套循环降成单层能不能用动态规划去掉重复递归。回答不一定要真的给出最优解但要让面试官看到你在有意识地思考复杂度而不是做完就扔。3.3 做题时容易翻车的细节我当年候选阶段找人模拟面试发现一个普遍问题题目理解明明没问题思路也对了但一上手写代码就各种小错。最典型的有三类。第一类是边界条件二分查找里的left和right相等时要不要继续循环快排递归里lowhigh的终止条件漏了就是栈溢出。第二类是数据范围意识int会不会溢出需要不需要用long long很多题看似简单实际测试用例故意卡这个。第三类是输入输出细节C用cin、cout还是scanf、printf大数据量下效率差好几倍候选人如果一直用cin却不关闭同步在需要读大量数据的题里很可能超时。解决这个问题的唯一办法是多动手写而且是像考试一样在ACM模式下写不要依赖编辑器提示。我建议准备阶段每天保持两三道手写代码题写完先在脑子里面模拟一遍测试用例再跑真实数据。坚持一个月手感和稳定性都会有明显提升。4. 图形学与引擎基础研发岗的“专业分水岭”4.1 渲染管线GPU一步步做了什么图形学基础是客户端游戏研发岗区分度最高的考察领域。笔试面试里最常出现的一个题是描述一下渲染管线的主要流程。一个完整的可渲染管线的流程是应用阶段CPU端做剔除、提交渲染数据→ 顶点着色器把模型空间的顶点变换到齐次裁剪空间→ 光栅化把图元拆成像素片元→ 片元着色器计算每个片元的颜色→ 逐片元操作深度测试、模板测试、颜色混合→ 输出到帧缓冲。面试官通常会进一步追问“顶点着色器和片元着色器里分别能做什么、不能做什么”以及“两个着色器之间的插值是怎么回事”。比如法线、UV这些从顶点着色器输出到片元着色器的数据都会经过光栅化阶段的插值这也是法线贴图里TBN矩阵要在片元着色器里重新归一化的原因。渲染管线题之所以重要是因为它直接反映你对渲染性能瓶颈的理解。如果这段流程能讲清楚后面的优化题基本也能顺下来。4.2 坐标变换矩阵推导另一道高频题是一个物体从模型空间到屏幕空间经历了哪些坐标变换这个问题本质是MVP矩阵的推导Model矩阵把物体从模型空间变换到世界空间View矩阵把世界空间变换到观察空间Projection矩阵把观察空间变换到裁剪空间最后做透视除法映射到NDC再经过视口变换到屏幕坐标。很多候选人能背出“Model、View、Projection”三个单词但问到“正交投影和透视投影的区别是什么投影矩阵为什么长这样”就答不上来。其实核心就是那个齐次坐标w分量的用途透视投影里w被设为-z透视除法让远处的物体看上去更小正交投影不改变w所以没有近大远小的效果。理解到这个层面面试官基本就满意了。4.3 优化方向与DrawCall图形学部分的压轴题大概率是性能优化方向。问法通常很开放游戏掉帧了你怎么定位是CPU还是GPU瓶颈或者是DrawCall太高有哪些优化手段优化手段的答题框架一般从三方面展开。第一减少DrawCall静态物体合并网格动态物体做合批UI用图集减少材质切换次数这些都是日常项目里最有效的做法。第二减少顶点数和像素处理量做遮挡剔除、视锥剔除、LOD控制阴影贴图分辨率。第三减少复杂计算把能预计算的都预计算比如光照贴图、环境探针减少实时灯光数量Shader里避免在片元着色器做高开销运算把能挪到顶点着色器的计算尽量往上挪。回答时最好能结合具体场景比如“我负责的场景里有大面积的草一开始每根草都是一个独立Mesh后来改成GPU实例化DrawCall从一千多降到了几十”这种实战例子比干巴巴列目录有说服力得多。5. 平台开发岗考题网络、服务器与数据库5.1 TCP粘包问题拆包方案怎么设计如果投的是平台开发岗网络编程就是绝对核心。有一道经典题TCP是流式协议没有消息边界多个数据包发过来后对端收到时可能会粘包怎么解决。标准解法要先把粘包产生的原因说透TCP为了保证传输效率可能把多个小的发送缓冲区数据合并成一个报文段发送接收端一次read读到的可能是多个应用层消息拼在一起的数据。解决方案一般有三种固定长度消息在每个消息末尾加分隔符以及在消息头增加长度字段。实际实现中第三种最通用比如先读4字节的包头解析出整个报文的长度再读对应长度的消息体。面试官通常还会追问“如果网络不好一次只读到半个包怎么办”。这时候要答出应用层接收缓冲区的概念每次read到的数据先追加到缓冲区然后循环尝试从缓冲区里解析完整消息不够就继续等下一批数据。能画出这个状态循环这道题基本就稳了。5.2 select/poll/epoll的适用场景服务端高并发是平台开发岗绕不开的话题select、poll、epoll是三个迟早要对比的知识点。表层答案比较容易select有FD_SETSIZE上限默认1024个文件描述符每次调用都要把整个fd_set从用户态拷贝到内核态遍历的是全部fdpoll解决了数量限制但仍然是线性扫描epoll是事件驱动机制只返回就绪的文件描述符适合大量连接但活跃连接较少的场景。更显水平的答法是说出epoll的两种触发模式尤其是边缘触发ET下的坑。ET模式要求用户必须一次性把socket上的数据读完否则之后很难再收到可读事件所以ET模式下while循环read时要处理EAGAIN错误码水平触发LT则比较宽容没读完还会继续通知。面试官追问你“实际项目里你会用哪个”时诚实的回答是LT容易写对、ET性能更优但容错性差线上为了防止丢数据很多人会选LT或ET配合非阻塞IO加循环读取。这种“我知道坑在哪”的表达比单纯背概念有价值得多。5.3 数据库索引与缓存设计题平台开发岗也会考数据库高频方向是索引和缓存。索引题常问“为什么MySQL Innodb用B树而不是红黑树或者哈希索引”。回答核心在于磁盘IO的特点B树矮胖每一层节点对应磁盘一页一次IO能加载更多索引项三层就能支撑几百万行数据的索引查找红黑树太高最坏情况树深几十层查询时磁盘IO次数不可接受。哈希索引适合等值查询但范围查询不支持而游戏排行榜、商品列表这类业务经常需要范围排序。缓存题常以设计方案的形式出现Redis宕机了怎么办缓存和数据库怎么保证一致性缓存穿透怎么解决。回答时要有层次感缓存击穿用互斥锁重建缓存穿透用布隆过滤器拦截不存在的key雪崩用过期时间加随机值错峰。最后的落脚点一定是衡量一致性要求对一致性要求高的数据用先更新数据库再删缓存的方式配合一个较短的过期时间作为兜底。这种对实际情况的把控面试官能从你说话的细节里感受出来。6. 面试里的隐藏考察点与备战建议6.1 智力题与数学题想考的不是答案网易的面试里偶尔会出现一些智力题和数学题比如“1000瓶药里有一瓶毒药怎么用最少的小白鼠找出来”“两个人抛硬币先抛到正面的赢先手赢的概率是多少”。这类题的考察目的很直接不是看你见没见过原题而是看你在一个陌生问题面前能不能保持冷静能不能通过拆解子问题找到递推路径。我的建议是平时可以刷一遍常见的概率题和位运算题但更重要的是一旦遇到没见过的题先把自己的思考过程说出来。面试官不怕你慢怕的是冷场。哪怕思路暂时不完整只要在大方向上尝试用二分法、状态转移、二进制编码等方式去套都能让面试官看到你的逻辑能力。6.2 项目经历的叙述方式二面最核心的部分其实是项目经历。面试官会挑一个你写的系统一层一层往深里问你这个模块为什么这样设计如果请求量翻十倍哪里会先扛不住线上出过什么问题是怎么排查的。这地方最忌讳的是只讲功能不讲取舍什么“我用Redis做了缓存提升了性能”这种话等于没说。更好的叙述框架是项目背景和目标技术选型时比较过哪些方案、为什么取这个舍那个实现过程中遇到的最大问题是什么、怎么定位的、最后怎么解决如果再给一次机会哪些地方会重构。每个踩坑都能对应到一个具体的知识点上这样面试官顺着问下去问到的都是你准备过的范围。6.3 备战时间线建议如果你从现在开始准备我会给一个大概的时间分配。头两周先把C语言层面的重点过一遍重点看内存、多态、STL底层语法书看不下去就直接找面经题跑效率更高。第三周开始集中刷算法题每天保证两道优先覆盖链表、树、前缀和、双指针、动态规划这些高频考点。第四周转到计算机基础和图形学/网络按岗位方向取舍。最后一周做模拟面试每个知识点都用“先讲结论、再讲原理、最后举例”的方式过一遍。这段时间不需要面面俱到但核心知识点必须做到能不看资料讲出来。拿一个自己做过的小项目做炮弹把涉及到的技术细节全部吃透哪怕项目规模不大能讲深讲透也足够撑起二面的一半时间。我在实际求职和后来帮人模拟面试的过程中最深的体会是游戏研发岗面试考察的从来不是某一道题的标准答案而是你平时写代码时有没有真正思考过底层机制。浮于表面的人问两轮就会露馅踏踏实实钻研过的人即使某道题没见过也能靠清晰的思维框架一步步推出来。这份真题复盘只是一个索引真正有价值的是顺着这些题把自己知识体系里模糊的地方一项一项补完。等到你觉得自己能从原理层面给别人讲懂这些题目的时候面试也就稳了。