
快手2019年秋季校园招聘笔试试卷—游戏研发A试卷这份材料在游戏开发求职圈里流传过挺长一段时间。别管你是准备投大厂游戏岗的应届生还是已经在做客户端、引擎、玩法方向但想查漏补缺的初级开发它都值得静下心做一遍。原因很简单它基本框定了游戏研发校招笔试的考察边界从C语言细节、数据结构与算法到图形学基础、网络同步、游戏引擎基本功再到开放性设计题覆盖得很完整。你不需要靠它押中原题但通过拆解这份试卷你能搞清楚“游戏研发岗位到底在考什么”以及“出题人想看到什么”。我记得那年快手游戏业务正处于快速扩张阶段自研和发行都在铺对校招生的定位不是“来了就能做3A”而是“基础扎实、上手快、有游戏Sense”。所以试卷里不会出现特别偏门的引擎API题反而会在语言底层、算法思维、系统设计这些地方反复卡你。这篇文章我就从试卷整体结构、核心考点拆解、实操答题策略、常见翻车点四个维度来聊全部基于我自己的做题复盘和面试官经验大家可以直接拿去当备考参照。1. 试卷整体长什么样从题型结构看考察逻辑1.1 笔试的基本盘选择题与填空题先看客观题部分。A卷的选择题数量一般在20到30道之间覆盖的面非常杂但仔细归纳下来就是三块C语言、数据结构与算法、计算机图形学/网络基础。偶尔还会混入一两道游戏引擎相关的常识题比如Unity的脚本生命周期顺序、碰撞体与触发器区别之类但占比不大。C部分的选题思路很典型专门挑那些“你觉得你懂了但其实还没懂”的知识点下刀。虚函数怎么实现、析构函数为什么要加virtual、struct和class默认访问权限、动态内存分配与释放的配对这些几乎是必考。还有一类是“代码结果题”给一段含指针、引用、const修饰符纠缠在一起的小程序让你判断输出结果。这种题看着简单实际错一大片因为运算符优先级和类型隐式转换本身就容易藏坑。数据结构和算法部分相对直白重点考察时间空间复杂度分析、常见容器的底层实现与适用场景、链表与数组的优劣、二叉树遍历、基础排序的稳定性和复杂度。填空题偶尔会出现让你直接算一个递归函数时间复杂度的题比如T(n)2T(n/2)O(n)答案是O(n log n)。这类题靠背诵能拿分但最好还是理解主定理和递归树方法换一个形式你也能应对。图形学和网络部分在2019年那一批卷子里占比大概20%到25%。图形学考察的是3D变换中的矩阵、齐次坐标、渲染管线流程、摄像机坐标系、光照模型的基本概念网络部分则是TCP/UDP特性对比、帧同步与状态同步的区别、延迟抖动对游戏手感的影响。这个部分对于没系统学过图形学的同学来说会比较痛苦但它恰恰是区分游戏研发岗和普通后端岗的关键。1.2 大题才是分水岭编程题与设计题编程题一般三到四道从易到难排布。第一道通常是“签到题”比如数组处理、字符串解析属于送分题考察基本的编码能力和边界处理。第二、三道开始上强度常见的是搜索类题目比如迷宫最短路径、岛屿数量这类BFS/DFS模板题再配上动态规划比如背包问题或最长公共子序列的变体。第四道题往往会结合游戏场景比如“在二维网格地图上计算A点到B点的最短路径并且地图里存在动态障碍物”。这种题表面上还是BFS/A*但加了一个“动态”条件后很多人就开始慌了。实际上你只需要把地图状态作为搜索状态的一部分或者每次障碍物变化后重新规划都能拿不少分。关键在于你要能识别出它本质上是搜索问题而不是被游戏场景吓住。设计题通常是最后一道也是整张卷子最开放的部分。常见出题形式有“设计一个技能系统”“设计一个背包系统”“如何实现多人游戏中玩家的移动同步”。这类题没有标准答案但阅卷人心里有一套分层标准有没有拆解需求、有没有考虑模块划分、有没有聊数据结构和接口、有没有涉及异常情况和扩展性。很多同学在这道题上只写几行字这非常可惜因为设计题是展示你“游戏Sense”的最佳机会。1.3 为什么快手会这么出题观察整套试卷你会有一种感觉它不是想难倒你而是想看清楚你。游戏研发岗校招进来的新人前三个月大概率不会直接写核心战斗逻辑更多是改UI逻辑、做活动需求、修Bug。但你会不会写和你能不能理解底层原理决定了自己未来的成长曲线。所以笔试的重点就落在“基础扎不扎实”和“思路清不清晰”上。C和算法是看你的硬底子图形学和网络是看你有没有游戏领域的常识储备设计题则是看你有没有“系统思维”。在2019年快手游戏快速招人的阶段出题人希望筛出两类人一是科班出身基础过硬的二是跨专业但真正热爱游戏、自己做过Demo、思考过游戏逻辑的。A卷作为多套试卷中的一套整体难度属于中上但并没有到劝退的程度认真准备三到四个月完全可以搞定。2. 核心考点逐项拆解每个知识点背后的“为什么”2.1 C游戏研发的通用语言底线游戏研发岗笔试里C高频出现不是因为所有团队都在用C写游戏很多项目是Unity/C#或UE/C而是因为C能一次性考察内存管理、面向对象、模板编程、性能意识等多维能力。你可以把它理解为面试官想通过语言这道关判断你有没有能力在大型游戏项目里读代码、写代码和控制性能。最常考的几个C知识点我一个个说。虚函数与多态机制。这里不止考“虚函数是什么”而是考底层实现。你要清楚每个含虚函数的类会有一个虚函数表指针vptr指向该类的虚函数表vtable动态绑定通过这个指针间接调用实现。典型题目是“基类指针指向派生类对象调用虚函数输出什么”以及“为什么不建议在构造函数或析构函数中调用虚函数”。后者是因为构造时派生类部分还没初始化调用的是当前阶段的虚函数版本跟预期往往不同。内存管理。new/delete和malloc/free的区别、为什么需要配套使用、内存泄漏怎么检测、RAII原理以及智能指针之间的差异。shared_ptr用引用计数unique_ptr独占所有权weak_ptr用于解决循环引用。这里我建议在复习时动手写一个小Demo故意制造循环引用再打断观察对象是否析构比单纯背概念管用得多。内存布局与字节对齐。这类题几乎是每卷必出给一个包含int、char、double成员的struct让你算sizeof。核心规则就是成员按顺序排每个成员的起始偏移是自身大小的整数倍结构体总大小是最大对齐数的整数倍。你以为你算对了结果因为字段顺序不同sizeof从16变24这就是出题人最爱挖的坑。我自己的复习习惯是把所有C知识点过一遍后用“代码题口头解释”的方式自测。每看懂一个机制就在编译器里写个十行以内的小程序验证比如打印vptr地址、观察智能指针引用计数变化等。纸上谈兵永远不如动手一次记得牢。2.2 数据结构与算法不是刷题是思维方式游戏研发里算法用得最多的地方是寻路、空间划分、资源调度、AOIArea of Interest管理、技能伤害判定等。因此笔试题不会考那种纯数学性质的硬核竞赛题而是更偏“实用型算法”——你不需要会各种冷门数据结构但常见的树、图、哈希、堆、动态规划必须拿捏。BFS/DFS是寻路和地图相关题目的基础。做题时要注意BFS的层序遍历特性它天然适合求最短路径边权为1时而DFS更适合枚举所有路径或状态空间。递归写法虽然简洁但容易爆栈建议优先掌握显式栈和队列的写法。遇到“网格地图上的最短路径”这类题常见套路是定义一个方向数组比如int dir[4][2] {{0,1},{0,-1},{1,0},{-1,0}}然后for循环遍历四个方向边界判断里千万别漏了起点和终点重合的极端情况。动态规划是很多人的薄弱点。笔试里考察的DP通常不会太离谱基本都是背包、最长公共子序列、编辑距离、打家劫舍这种线性DP。理解DP的关键在于状态定义和转移方程。我推荐一个笨但有效的方法先把暴力递归写出来再改造成记忆化搜索最后改成递推。这个过程能让你深刻理解“状态从哪里来要往哪里去”而不是背一堆模板。举个例子01背包问题状态定义dp[i][j]表示前i件物品放入容量为j的背包的最大价值转移时要么不选第i件继承dp[i-1][j]要么选dp[i-1][j-w[i]]v[i]。很多人会背这个式子但题目一换比如“要求恰好装满背包”就不会处理了。这种变体其实是在初始化和状态定义上做文章不是新知识点。空间划分和图形学底层也会用到四叉树、八叉树、BVH包围体层次结构这些加速结构。笔试阶段不要求你手写八叉树但选择题很可能让你判断“大规模场景下高效碰撞剔除常用什么数据结构”。这类题靠平时积累游戏开发常识就能答对。2.3 图形学基础游戏画面背后的数学图形学是游戏研发岗笔试题里最劝退的部分但同时也是最能拉开区分度的部分。好消息是校招笔试对图形学的考察不会像图形学面试那样深入到底层渲染管线源码级别更多是概念、变换、光照与坐标系这些基础。首先是坐标系统与变换。你需要理解局部坐标、世界坐标、观察坐标、裁剪坐标和屏幕坐标这几个阶段的含义以及模型矩阵、视图矩阵、投影矩阵的作用。矩阵乘法的顺序经常考Vector3经过Model、View、Projection变换最终结果是MVP * V注意矩阵乘法没有交换律顺序反了画面就乱。这里可以结合左手坐标系和右手坐标系的区别来理解Unity是左手系OpenGL默认右手系而DirectX也是左手系——有些题目会给坐标系方向和旋转正方向绕晕不少人。其次是渲染管线流程。顶点数据怎么进GPU顶点着色器做什么光栅化产生片元片元着色器计算颜色深度测试和混合阶段怎么影响最终输出。笔试不会让你手写Shader但会问你“透明物体排序注意什么”“深度缓冲区的作用是什么”“Alpha Blend和Alpha Test的区别”。这些概念理解后很容易记住深度测试解决遮挡关系Alpha Test是直接丢弃片元Alpha Blend是把当前片元颜色和颜色缓冲已有颜色做混合透明物体要从远到近排序。光照模型也常出现。Lambert漫反射模型是NdotLPhong高光模型是pow(max(dot(R,V),0),shininess)Blinn-Phong换成了半程向量H性能更高。笔试可能给一个场景让你判断某个像素的亮度和颜色这里只需要搞清楚每个向量的方向和计算顺序即可。图形学避坑提示复习时不要一头扎进实时渲染高级话题先搞定变换矩阵、坐标系、光照模型、纹理映射、深度缓冲这几个基础点。再看一遍LearnOpenGL的前半部分配合Unity里的Transform和ShaderGraph做几次实验笔试里的客观题基本能全覆盖。2.4 网络与同步多人游戏绕不开的坎游戏研发笔试里的网络部分重点不是OS网络七层模型也不是TCP三次握手的细节而是“游戏服务器与客户端怎么通信”“多人游戏怎么保证一致性”。如果你报的是客户端岗位这部分通常考概念题如果报的是服务器方向那可能会上升到设计题。选择题里最经典的是TCP和UDP的对比。你要能说出TCP面向连接、可靠、按序、流量控制、拥塞控制UDP无连接、不可靠、开销小、延迟低。多人动作游戏里移动和技能指令通常用UDP因为实时性优先丢包可以用插值和预测掩盖而登录、排行榜、交易等关键逻辑用TCP保证可靠性。这里千万别只说“UDP快所以用它”要理解为什么在弱网环境下TCP的队头阻塞会带来输入延迟。帧同步和状态同步的区别也是高频考点。帧同步是所有客户端运行同样的逻辑只同步操作指令优势是同步数据量小、逻辑一致性强适合FTG和RTS状态同步是客户端上传操作、服务器运行权威逻辑并广播最终状态优势是防作弊、容易回放和断线重连但同步数据量大、对网络带宽要求更高。答题时可以结合一个具体游戏来分析比如吃鸡类游戏普遍采用状态同步而《王者荣耀》早期版本在弱网环境下采用了帧同步优化方案。再深一层如果设计题考到“怎么同步一个玩家在场景里的移动”你要能想到状态同步的思路客户端采集输入、发送给服务器服务器验证合法性、计算新位置然后广播给视野范围内的其他客户端。还要考虑网络延迟带来的问题所以在客户端做插值、在服务器做延迟补偿。答出这一整套链路阅卷人就会觉得你是真做过联机功能的人而不是只背了概念。3. 从笔试卷到面试题答题策略与准备路线3.1 笔试时间分配与答题节奏拿到试卷别急着动笔先花三到五分钟通读全卷把题目的难度和分值标注出来。这套题题型比较多通常建议先做客观题因为它耗时短、单位时间得分率高编程题按“第一道必须完全AC第二三道尽量AC第四道能把暴力分拿到”的原则排布设计题留出十五分钟左右写框架、画类图不要追求完美。客观题每道题平均时长为1到1.5分钟遇到想不起来的概念题不要恋战先跳过去。编程题优先看输入范围比如n 10^5那O(n^2)基本没戏直接考虑O(n log n)如果没给范围默认按较大量级处理。边界情况一定要在写代码时同步考虑空数组、只有一个元素、全相同元素、最大值溢出——这些往往是隐藏测试点的重点。答题时给自己的代码加几句关键注释如果遇到“部分通过”的判分机制清晰的注释和逻辑还能帮助阅卷人看到你的思路。3.2 一份可复用的复习路线如果离笔试还有三到四个月我建议按这个节奏准备。第一个月专攻C。参考《C Primer》或《Effective C》菜鸟教程配合把类、继承、多态、STL容器源码、智能指针过一遍。每天花半小时写代码重点写析构与拷贝控制、运算符重载、模板的简单应用。C笔试高频题网上有大量整理按主题刷一遍并整理错题本。第二个月主攻算法和数据结构。以LeetCode为主按“数组、链表、栈队列、哈希、树、图、DP”分专题刷每类至少刷15到20道。不用追求难题偏题但要保证高频题能无bug写出。游戏研发方向额外刷一下搜索类题目和A*算法哪怕笔试不考面试环节也可能现场让你讲。第三个月补充图形学和网络知识同时做一个游戏Demo来练手。图形学看LearnOpenGL和《Unity Shader入门精要》网络读《网络多人游戏架构与编程》前半部分或者看GDC分享里的同步方案。Demo不一定要完整重点是让项目包含移动同步哪怕是局域网、技能释放、伤害计算这些玩法逻辑这样你回答设计题时有真实案例可以引用。最后两周进入冲刺模式限时做整套笔试卷练手感复盘错题查漏补缺把自己做过的项目整理成文档画出架构图想清楚每个模块为什么这么设计。这套动作做完你面对笔试卷的状态会比毫无准备时有本质差别。3.3 做题之外如何让阅卷人记住你笔试卷虽然大部分是客观题但大题部分仍然能展现你的思维方式和工程意识。设计题不要只写“我要用状态机”要写出状态怎么抽象、事件怎么分发、数据存哪里、新技能怎么扩展。哪怕时间紧张写个类名职责关键接口的列表也比一段含糊的“方案说明”强得多。代码题里面变量命名规范、模块划分清晰、有异常分支处理这些都会让阅卷人读起来舒服。线上笔试平台可能只按测试用例判分但线下笔试或开放题会有人工审阅细节分和印象分都是真实存在的。我见过不少同学明明思路对了但代码里有一堆没用的变量和重复逻辑导致阅卷人找不到重点最终分数没拉起来非常可惜。4. 考生常见问题与避坑记录4.1 客观题里的“坑”与知识点盲区结合我看到的错题第一类高发错误是C运算符优先级。比如p到底是取p后指针自增还是指针自增后再取值正确答案是前者。因为后置自增优先级高于解引用但自增发生在整个表达式求值之后。这种“一行代码看起来没问题但结果不对”的陷阱就是客观题里最典型的坑。第二类是图形学坐标系混用。题目如果给出了世界坐标和摄像机坐标要你求屏幕上坐标很多人会把Projection矩阵直接套在模型坐标上忽略Model和View变换。实际上必须依次做Model变换、View变换、Projection变换最后再经视口变换到屏幕坐标。顺序错了所有数字都算不对。这类题建议在复习时用Unity实际操作一把把物体的Transform改成奇怪数值切换Scene和Game视图观察变化慢慢就有感觉了。第三类是网络协议细节。很多同学分不清UDP和TCP在游戏里的实际用途比如“排行榜数据”应该是TCP因为它要求可靠“实时位置”走UDP因为它能容忍丢包。这里要强调网络协议选择是“以需求为导向的权衡”不是单纯背条条框框。4.2 编程题的边界条件与编译环境编程题最气的永远是“本地运行没问题一提交就Runtime Error或Wrong Answer”。绝大多数原因是边界条件没处理好。数组下标越界最常见方向数组遍历时忘了判断是否越界负数和零处理不当比如排序时把负数排出了预期次序还有整数溢出dp数组累加时不加long long一到大测试点结果就爆了。提交前养成自测三步极限小值比如n0或n1极限大值构造最大数据范围重复值比如全部相同元素。如果测试用例没给足就用这“三件套”自测能挡掉大部分提交错误。还有一个容易被忽略的点编译环境是否支持C11以后的新特性。有些旧平台不支持auto或unordered_map写代码时尽量使用通用写法或者预判平台环境避免在编译阶段被卡住。4.3 设计题最容易丢分的地方设计题丢分的原因通常不是“方案不对”而是“没写清楚”。比如考“设计一个技能系统”很多人写“技能带伤害、冷却时间、消耗蓝量”然后就结束了。这只能拿基础分因为缺少层次技能释放是否要经过玩家输入校验技能效果是直接伤害还是BuffBuff怎么计时和叠加技能是否需要指定目标敌方AI要不要也走这套技能逻辑我建议做设计题时按这套框架组织答案先定义角色和技能的基本数据结构画出类图或者手写核心字段和方法签名再说技能释放的流程从输入检测到服务器验证到广播然后说技能效果的扩展机制让新技能可以通过配置表或脚本注册避免每次都要改核心代码最后补一嘴异常处理比如技能释放瞬间目标死亡、超出施法范围、客户端与服务端不同步。这套框架覆盖了需求分析、架构设计、扩展性和容错性四个维度基本能拿到设计题的高分。写在最后一点个人经验我在面试和阅卷过程中看过太多份笔试答卷一个特别直观的感受是能把基础题稳稳答对的人比那些只挑战高难题但漏洞百出的人在校招里更容易走到最后。因为游戏研发是一个强协作、重工程化的方向稳比炫技重要得多。你可以在设计题里亮出自己的想法但前提是你前面的选择题和编程题不能丢太多分。准备这套试卷时别抱着“做对就是赢”的心态把它当成一次游戏研发岗位的能力自检C语法过关了吗算法思维成体系了吗知道多人游戏怎么同步吗能把自己的想法有条理地写出来吗每一道题都是一面镜子。我自己的体会是做完复盘比刷十套新题更值钱遇到错题多问一句“它到底在考哪个底层能力”然后顺着这个能力点把相关知识串一遍比临考前突击十道同类型题都管用。希望这份拆解能帮你们少走点弯路。