十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

游戏开发校招笔试复盘:搜狐畅游补招C++与引擎考点详解

游戏开发校招笔试复盘:搜狐畅游补招C++与引擎考点详解 1. 为什么一份两年前的笔试题还值得翻出来细看先交代一下背景。我是2017届的2016年秋季跟着大部队跑秋招投了一堆游戏公司搜狐畅游是其中之一。正常批次挂在了群面环节后来十一月底收到短信说补招批次开放技术岗笔试可以再投一次。于是就有了这篇复盘。现在回头看那场笔试给我的最大感受是**它和互联网公司的校招笔试思路明显不一样。**同样是写代码、考基础畅游的题明显更偏客户端、偏引擎、偏游戏逻辑而不是纯粹的“通用后端八股”。如果你准备的是游戏开发岗刷LeetCode当然有用但你更需要知道游戏公司到底想招什么样的人。先给结论搜狐畅游2017校招游戏开发补招笔试整体分成五块——计算机基础选择、C专项、游戏引擎与图形学基础、算法编程题、逻辑智力题。题量不算大但覆盖面很杂时间控制不好容易翻车。下面我按实际考试顺序把每一块的考察逻辑和我的应对思路拆开讲。2. 补招笔试的考场规则与真实时间线2.1 补招到底是什么和正式批有什么不同先说个很多同学容易搞混的点。补招不是“人家挑剩下的岗位”而是公司根据正式批的HC招聘名额剩余情况临时开放的追加批次。常见情况就三种正式批发了offer但学生毁约、某些部门突然扩编、项目组临时缺人需要尽快到岗。2016年那个时间点畅游正好在内部调整手游和端游项目都有缺口所以补招的岗位不是“没人要的边角料”反而很多是核心研发组的急缺岗位。补招的流程比正式批紧凑得多通常简历筛选通过后一周内就安排笔试笔试通过后两三天面试面试基本两轮技术一轮HR节奏非常快。2.2 笔试答题环境与时间分配策略畅游那年的补招笔试用的是在线笔试平台具体是哪个平台我记不太清了但形式都一样摄像头监控、限时答题、切屏会被警告。总时长120分钟题目分成选择题和编程题两大类。我当时犯了个错误就是强迫症发作选择题每道都想算到底结果前面花了一个多小时到编程题只剩二十分钟。这是最蠢的失误因为编程题分值占比非常高一道等于五六道选择题。说下合理的分配方案题型题量建议用时策略计算机基础选择10道15分钟会就选不会先蒙一个跳过C专项8道15分钟注意虚函数、内存布局这类高频题引擎/图形学7道15分钟不会的果断放弃不要恋战编程题2道45分钟先写思路注释再写代码逻辑智力题3道15分钟写出推理过程别只给答案剩余时间-15分钟回头检查标记的题目这个时间表是我后来复盘时重新优化的当时实际执行得一塌糊涂。你看了能少走弯路。2.3 补招笔试的评分逻辑还有个很重要的事这类笔试一般不是按百分制算的而是按排名。面试官拿到的是一份成绩列表按分数排序后取前面一定比例的人进面试。所以不存在“考60分万岁”的说法而是“你必须比同一批人考得好”。这就意味着难题做不出来没关系别人也做不出来关键是简单题不能丢分。所以我的建议是如果你哪一块完全不会比如图形学矩阵推导直接放弃把时间投到你有把握的题上保证正确率。这一条对任何校招笔试都适用但补招名额少竞争比正式批更集中尤其重要。3. 计算机基础选择看似送分实际陷阱集中在三处3.1 题型构成与典型题目还原选择题一般是单选多选混合多选少选都不得分所以拿不准的选项宁可少选。畅游的计算机基础题不算难但覆盖面广我印象比较深的考点有这几个方向数据结构二叉树遍历序列还原、哈希冲突处理、堆排序建堆过程操作系统进程和线程区别、死锁必要条件、虚拟内存分页计算机网络TCP三次握手状态变迁、TCP和UDP区别、HTTP状态码含义数据库索引失效场景、事务ACID特性、简单SQL语句结果判断举一个当时考了的典型题给出一棵二叉树的前序遍历和中序遍历要求写出后序遍历。这题本身不难但很多人卡在了“递归还原树”这一步上花了太多时间。这种题就是典型的“会者不难难者不会”需要你手很熟看到前序中序就能直接写出后序而不是现场推导。再比如另一道一个系统有12个进程并发执行每个进程最多需要3个同类资源问系统至少配置多少个资源才能保证不会死锁。答案是12乘(3减1)加1等于25。这考察的是死锁避免中的资源分配逻辑。这类题在牛客网上刷过就能秒解没刷过现场想容易错。3.2 为什么游戏公司也考这些“通用基础”可能有人会问我去做游戏开发为什么要考数据库和操作系统这就要理解游戏公司的技术栈构成。游戏客户端虽然是C和引擎为主但整个研发团队不是只有客户端。你会跟服务器端打交道要理解网络同步、数据库存储、服务器压力。而且客户端本身就是操作系统之上的程序内存管理、多线程渲染、文件IO全都离不开操作系统基础。说白了这些题考的不是你会不会背知识点而是你有没有一个计算机专业的完整知识底架。所以准备这部分别指望刷几道题就能过。我的做法是把《操作系统概念》和《计算机网络》的重点章节过了一遍配合牛客网的专项练习刷了大概两百道题。对于时间有限的补招考生我的建议是优先刷操作系统和数据结构网络次之数据库最后。3.3 高频考点速查表这里分享一个我自己整理的速查表是根据那段时间刷题和考试经验总结的不一定覆盖所有题目但命中率很高科目必考知识点易错点数据结构二叉树遍历、堆、哈希表、链表反转递归写法不熟、边界条件漏判操作系统进程线程、死锁、页面置换算法进程与线程的概念混淆网络三次握手、TCP拥塞控制、HTTP状态码TCP与UDP的适用场景分不清数据库索引、事务隔离级别、连表查询IN与EXISTS的语义搞混淆4. C专项游戏客户端的第一道门槛4.1 从考题看畅游对C能力的真实要求游戏客户端开发尤其是引擎层和底层工具链C是绕不开的语言。Unity虽然有C#但很多公司都有自己的引擎底层或基于C的框架Unreal更是纯C。畅游自研的引擎和工具链都跑在C上所以这一块考得深是拉开差距的关键。我个人遇到的题目几乎全是下面这几类的变体虚函数与多态这类题考察你对C对象模型的理解深度。典型的出题方式是给一段代码问输出结果。比如基类构造函数里调用虚函数输出的是什么很多人会说“根据实际对象类型调用”但正确答案是基类版本因为构造期间动态类型是基类。这种题你光知道“虚函数实现动态绑定”是不够的必须理解vptr的初始化时机。内存管理new/delete、malloc/free配不配对是基础。更深一层会问为什么会内存泄漏RAII是什么智能指针的循环引用问题怎么解决我当时遇到的是关于shared_ptr引用计数的问题问两个对象互相持有shared_ptr会不会内存泄漏答案是会。STL底层vector扩容机制一般是1.5倍或2倍、map底层红黑树、unordered_map哈希表这些几乎必考。有一个我印象很深的题往vector里不断push_back问迭代器什么时候失效。答案是扩容时所有迭代器失效中间插入删除时后面元素迭代器失效。C11新特性当年C11已经普及C14刚出来。移动语义和右值引用是热门考点考察方式通常是让你分析一段用std::move的代码问是否避免了拷贝。4.2 一题多考的经典例题复盘拿我当时实际遇到的一道题举例题目大意是class Base { public: virtual void func() { cout Base endl; } ~Base() { cout ~Base endl; } }; class Derived : public Base { public: virtual void func() { cout Derived endl; } ~Derived() { cout ~Derived endl; } }; int main() { Base* p new Derived(); p-func(); delete p; return 0; }输出是什么如果基类析构函数不是virtual又输出什么这个题简单但展开可以问出很多层次第一层p-func()输出Derived因为虚函数动态绑定第二层delete p调用的是Base的析构函数非虚时只析构基类部分Derived的析构不执行内存泄漏第三层如果析构函数设为virtualdelete p会先调用Derived析构再自动调用Base析构输出~Derived然后是~Base第三层如果改成“为什么析构函数要声明为virtual”这就是典型的面试追问。这个例子说明选择题的考点往往是连续的你在试卷上看到的只是一道选择题背后其实串起了C对象模型的多个关键点。复习时一定要沿着一个考点把整套知识链过一遍而不是孤立背答案。4.3 补招考生的C救急方案如果你的C基础比较薄弱但笔试就在一周后我的建议是别想着把《C Primer》从头啃完没时间也没必要。优先攻克四个方向虚函数、构造函数、析构函数的执行顺序和动态绑定规则指针和引用的区别、const在不同位置的含义vector/map/unordered_map底层及常见操作复杂度智能指针shared_ptr/unique_ptr/weak_ptr的适用场景这四个方向覆盖面广又是选择题最爱出的。剩下的比如模板元编程、异常安全、多线程并发笔试阶段考到概率相对低面试阶段再深入准备也不迟。我当时就是靠这个优先级安排在有限时间里把C专项拿下了。我不保证你的考题和我的完全一样但知识重点的分布节奏应该不会差太多。5. 游戏引擎与图形学基础笔试里最“游戏公司”的部分5.1 引擎题考的是用过的深度不是广度很多同学担心引擎题觉得自己没实际做过完整项目心里没底。但畅游的引擎题其实没有现象中那么难它不考你用没用过冷门API而是考你对引擎运行机制的理解。我当时遇到的题大致有这些类型Unity的MonoBehaviour生命周期函数执行顺序Awake、OnEnable、Start、FixedUpdate、Update、LateUpdate以及它们各自的使用场景FixedUpdate为什么适合物理处理——因为它的调用频率固定不受帧率波动影响场景中物体的坐标变换世界坐标、局部坐标、屏幕坐标之间的转换逻辑资源加载方式对比Resources.Load和AssetBundle当时Addressables还没普及这里透露一个不是秘密的秘密很多考生对引擎的了解停留在“会拖组件”的层面能讲清楚生命周期、坐标系、资源加载原理的人其实很少。你只要把这几块吃透笔试就超过了大部分人。5.2 图形学题矩阵、向量、渲染管线三件套图形学是游戏客户端岗的必考项因为引擎渲染的底层就是图形学。但这个板块的题出得很有规律基本绕不开这几个方向。向量与矩阵运算这是最基础也最好拿分的。点乘判断向量方向关系、叉乘计算法向量或判断左右关系、矩阵平移旋转缩放、MVP矩阵模型-视图-投影变换流程。考的通常是概念和简单计算不太会出高阶推导。渲染管线一提到渲染管线很多人会慌因为是英文术语塞在一起。但往简单了说就是顶点数据在CPU侧准备好上传到GPU经过顶点着色器、光栅化、片元着色器最后输出到帧缓冲。笔试考的一般是每个阶段的输入输出是什么、坐标变换在各个阶段的角色。Shader基础不会让你现场写一个Blinn-Phong但可能会问漫反射和镜面反射的区别、法线贴图是做什么的、为什么法线要从切线空间转换到世界空间。这类题是考察你有没有真正写过Shader而不是只背过概念。我的情况是这样Unity用过一段时间但图形学底子很薄考前突击看了渲染管线的资料又把向量矩阵的运算规则过了一遍。结果图形学部分的题蒙对了一半另一半确实不会。好在选择题分值均摊下来损失还在接受范围内。5.3 没做过完整游戏项目的人怎么应对这部分这个提醒主要给那些项目经验少的同学。笔试中涉及引擎和图形学的题很难靠临时抱佛脚完全补上但你可以做一件事——把你用过的东西往深处想一层。比如你在Unity里拖过一个Cube让它旋转。那么你可以逼自己回答以下问题Cube的Transform数据存在哪里局部坐标还是世界坐标旋转用四元数还是欧拉角为什么用四元数场景中的摄像机是怎么决定看到什么的视锥体剔除是引擎做的还是你写的移动物体时用transform.position修改和用Rigidbody.AddForce有什么区别这些问题一开始可能答不上来但每解决一个你的引擎理解就深了一层。笔试时哪怕具体题目没见过也能凭对底层机制的理解推断出合理答案。6. 算法编程题不拼奇技淫巧拼的是代码习惯6.1 编程题的做题策略先写注释再写代码编程题是笔试的大头分值占比最高也是很多人的心理阴影。但说实话畅游的编程题目在线笔试平台上属于中规中矩的水平难度介于LeetCode的Easy和Medium之间比互联网大厂的Hard题温柔多了。那为什么还有人做不出来不是不会而是时间不够、代码习惯差。我当时第二道编程题就吃了这个亏思路是对的但直接上手写代码写到一半发现自己没考虑边界情况又回去改改完又发现循环变量写错了来回折腾了半天。后来我总结了一套稳定输出的流程这里分享给你先读题两遍圈出输入范围和边界条件数组为空、长度为一、输入最大值在草稿纸上手写思路确定用什么数据结构在代码注释里写出你的算法步骤比如“遍历数组用哈希表记录出现次数再找出次数超过一半的元素”对照注释写代码每写完一个步骤就检查一个步骤没有测试用例的话自己手工模拟一两个小用例走一遍这个流程在考试高压环境下尤其有用。注释不是写给面试官看的是写给“写代码写到一半忘了思路的自己”看的。6.2 两道可以复盘的编程题第一道题我记得很清楚大意是给定一个字符串找出第一个只出现一次的字符返回它的下标不存在则返回-1。这题解法很直观第一次遍历统计每个字符出现的次数第二次遍历找出第一个次数为1的字符。复杂度O(n)。可以用unordered_map或者数组如果题目说明只有小写字母直接用int[26]更快。我当时用的就是数组版本因为题目给了“字符串只包含小写字母”的条件。这里有个经验读题时一定要留意字符集范围这决定了你能不能用固定数组代替哈希表。第二道题是链表相关的大意是判断链表有没有环有的话返回环的入口节点。这题用快慢指针一个走两步一个走一步相遇说明有环。要返回入口节点则需要从头节点再走一个指针和相遇点指针同时步进再次相遇的位置就是环入口。这一块涉及的数学推导不算复杂但如果你只会判断有没有环、不会求入口就只能拿到一半的分。所以准备算法题我强烈建议你练习时不仅要会做还要能把题目的每种变体都推演一遍。链表求环这个问题网上有大量资料核心逻辑就那几行一定要做到闭着眼睛能写出来。6.3 算法复习优先级考虑到补招时间紧我不建议你在笔试前刷大量Hard题。我的排序建议第一优先级数组操作、字符串处理、链表反转与环、栈与队列第二优先级二叉树遍历递归和非递归、DFS/BFS第三优先级动态规划入门题背包、爬楼梯、最长子序列第四优先级排序算法快排、归并的手写实现按照这个顺序刷每类题精刷10道左右基本就能覆盖90%的校招笔试编程题考点。我身边有朋友就是这么干的最终拿到了比我还好的offer。7. 逻辑智力题游戏策划思维在开发岗笔试中的体现7.1 为什么技术笔试要考逻辑智力题看到逻辑题容易让人疑惑觉得跟技术没有关系。但游戏公司特别喜欢出这类题因为它们考察的是你面对复杂规则时的拆解能力。做游戏开发你天天要和游戏规则打交道比如技能伤害怎么算、经验曲线怎么设计、掉落概率怎么配这些全都是逻辑推理。畅游笔试题里逻辑题占比不大大概3道但决定了你能不能进面试的“玄学因素”。因为基础题大家都会一些C题和算法题又能拉出差距如果两个人前面成绩差不多逻辑题的完成度就可能成为排序的关键。7.2 题型示例倒水问题与天平问题最经典的是倒水问题。给你一个5升桶和一个3升桶没有刻度要量出4升水怎么办解法是5升桶装满倒入3升桶5升桶剩2升3升桶倒空把5升桶里的2升倒入3升桶再把5升桶装满倒入3升桶3升桶当前有2升只能再装1升5升桶就剩4升。这类题的通用解法是状态搜索把“当前两个桶各有多少水”当成一个状态每一步操作就是从当前状态转移到另一个状态手动枚举就能出答案。笔试里你不需要写代码只要按步骤写清楚过程就行。天平找假币属于另一类经典——12个球一个重量异常不知偏轻还是偏重用天平称三次找出它。这道题我当时没做出来后来看了答案才明白用三分法的思路。这类题的特点就是看着就烦一旦想通其实并不复杂。如果你备考时间充裕建议搜一下十大经典逻辑题过一遍基本就够应付笔试了。7.3 逻辑题的答题技巧过程比答案更重要这一点必须强调逻辑题的答题一定是“推演过程”比“最终答案”重要。在线笔试平台一般会给一个文本输入框不像选择题可以靠蒙。哪怕这道题你没做出来把你的思考过程写下来比如“我先尝试将天平两边各放4个球如果平衡说明假币在剩下4个中……”面试官看到了会认为你有结构化思维比留白强得多。这也是补招和正式批一起考试时的一个隐藏加分点——正式批的同学往往更注重算法题逻辑题写得很简略而你会发现好好写过程反而能给面试官留下更好的印象。8. 备考周期与行动路线针对不同基础的分配方案8.1 还剩一周怎么办补招笔试的通知一般很突然从收到通知到考试可能就一周时间。这时不要贪多抓住三个核心C的虚函数、内存管理、STL底层占比最高提分最快数据结构算法的数组、链表、二叉树题高频且可快速刷熟引擎基础中Unity生命周期和坐标变换这两个最好临时补充图形学和逻辑题这时候可以放一放因为短期突击性价比太低。我当时也是这么做的图形学一半靠蒙但C和算法稳住了还是顺利进入了面试。8.2 还剩一个月怎么办如果有一个月你的备考可以更从容。我的建议是把时间切成三块第一周系统过C基础。找一本像样的C书把类、继承、虚函数、智能指针、STL容器这几章认真读一遍再做配套练习题。目标是构建完整的C知识体系而不是零散记忆。第二周集中刷算法。找牛客网或LeetCode按照数组、字符串、链表、二叉树、DFS/BFS、动态规划的顺序每天做五道题隔天复习错题。这个量不需要非常大但务必保证每道题都真正理解了。第三周专项突破。针对游戏公司偏爱考的引擎、图形学、逻辑题进行集中补充。如果没用过Unity就去b站找个基础教程把基本操作和生命周期过一遍没用过Unreal也没关系C基础扎实的话Unreal的题也能靠底子推断。第四周模拟考试。找一套往年的游戏公司校招笔试题严格限定时间做一遍。模拟比刷题更重要因为模拟能暴露你的时间分配问题而这个只能靠真实考试才能发现。8.3 复习资料的筛选心得关于复习资料我踩过一些坑。市面上的面经帖质量参差不齐有些是培训机构写的内容看起来很高端实际考不到。我的经验是牛客网的题库比LeetCode更贴近国内校招出题风格优先刷C看《C Primer》第6版的高亮章节就够了不用通读操作系统看高校公开课的笔记比啃书效率高得多图形学入门看《Unity Shader入门精要》虽然是Unity方向的但图形学基础知识覆盖得好逻辑题直接搜“经典智力题合集”基本够用参考资料的坑在于“贪多嚼不烂”。我见过太多人下载了十几个G的资料包最后一份都没看完。补招备考的核心动作不是收集资料而是把最核心的知识过三遍。9. 笔试之后从技术题到面试之间的衔接9.1 笔试后马上要做的两件事笔试交卷不代表万事大吉。我的经验是考完当天趁记忆还热立刻做两件事第一把每道题的知识点记录下来尤其是做错的题和蒙对的题。记录格式很简单题目描述、我的答案、正确答案、知识点、应该复习的方向。这个表格是后续面试备战的第一手素材。第二把编程题的代码在本地重新写一遍跑通所有测试用例。很多同学笔试时手忙脚乱代码写了个七七八八可能没跑通但思路已经形成了。这时候补完代码面试被问到“你笔试那道题是怎么解的”时你能拿着完整代码条理清晰地讲这在面试官那里非常加分。9.2 笔试和面试之间如何衔接畅游的补招流程是笔试通过后大概两三天内约面试。时间非常紧张所以一定要提前准备自我介绍和项目介绍。程序员的自我介绍不是背简历而是要把简历上写的项目和技术栈串成一个有逻辑的故事。举个例子如果你简历写了“使用Unity开发了一个ARPG游戏Demo”面试官大概率会追问这个项目的客户端架构是怎么设计的技能系统怎么做的用了状态机还是行为树怪物AI怎么实现感知、追踪、攻击的状态怎么切换场景中的物体加载是同步还是异步为什么性能方面做了哪些优化DrawCall有没有控制这些问题你至少要把80%的答案在脑子提前过一遍不要到面试现场才临场组织语言。9.3 我见过的两种面试表现差异我有两个同学一起走畅游的流程笔试分数差不多但面试表现天差地别。一个笔试完后直接躺平面试时支支吾吾另一个笔试完立马把项目所有技术细节过了一遍面试时聊得很深最后拿到了offer。这个对比想说明一个道理补招的笔试只是筛选漏斗的第一层真正的区分度在面试。笔试决定了你能否入场面试决定了你能不能被选中。很多补招考生在笔试后反而泄气觉得“剩下的交给命运”这是最可惜的。你能把笔试的准备做到这个程度面试阶段更不能松懈。10. 回看这场补招笔试我最想提醒自己的三句话补招已经过去很多年了我也从当年那个对着试卷发慌的应届生变成了带过一些新人的“老油条”。回看那场笔试如果让我给当年的自己发三条消息我会说以下这些内容。第一笔试考的不是你“知道什么”而是你“在有限时间内能调动什么”。复习得再充分考试时也会遇到不会的题这不重要。重要的是你如何分配时间把会做的题都做对。这一条比多刷一百道题都值钱。第二游戏开发岗的笔试和互联网通用岗位的笔试有本质区别。它考的是你的游戏技术底盘——C、引擎理解、图形学而不是纯粹的算法和系统设计。很多同学在LeetCode上刷得很开心结果到了游戏公司笔试发现引擎题一道不会这就是准备方向和岗位要求错位了。第三笔试之前的心态比平时的努力更重要。补招本身带有“最后一次机会”的意味很多同学容易心态失衡觉得自己必须表现得完美无缺。实际上补招的名额虽然少但竞争者也没那么多因为大部分优秀的应届生已经在正式批拿过offer了。你只要表现得比剩下这批人好一点点就有机会。最后无论你现在投递的是补招还是来年再战希望这份复盘能帮你少踩一些我踩过的坑。祝你们笔试顺利我们面试场上见。
返回列表