ARTICLE DETAIL

资讯详情

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

网易校招U3D工程师笔试全解析:从C#到渲染管线的考点复盘

网易校招U3D工程师笔试全解析:从C#到渲染管线的考点复盘 去年秋招一个学弟拿到了网易有道U3D工程师岗位的正式第二批笔试邀请当时他特别紧张因为听说这批卷子比提前批更细、更偏工程。他跑来找我我帮他做了一轮完整的题型拆解又把知识点逐个过了一遍。现在把整套复盘整理成文字给准备投游戏客户端、尤其Unity方向的后来者做个参考。这篇文章不保证覆盖每一道原题但把这套笔试背后真正想考的底层逻辑讲清楚比背几道题更有用。网易校招U3D工程师这套笔试卷子核心考察三块C#和算法的底子、Unity引擎的真实使用经验、渲染和性能优化的理解深度。先说结论这套题不是会写代码就能过的水平而是真写过Unity项目、并且思考过为什么的人才容易拿高分。下面按题型和知识模块逐层拆。1. 笔试全貌题型分布与考察逻辑1.1 从投递到笔试这套卷子出现的具体环节网易校招的流程一般是网申、笔试、面试正式第二批意味着你已经错过了提前批和内推通道竞争烈度更高。U3D工程师在有道这边做的业务不太像传统游戏大厂那样纯粹做MMO或竞技游戏更多是3D交互、教育硬件、智能工具这类场景。这意味着笔试题目会更偏工程化资源管理、内存优化、跨平台打包、启动性能这些点占比会比纯游戏岗更高。笔试统一在线完成平台是牛客网。我当时翻了近两年网易游戏、网易互联网、有道的多批U3D笔试题目发现题型结构非常稳定单选、多选、编程题是标配部分批次还会出现简答或设计题。编程题一般两道一道纯算法一道偏Unity场景化实现。整套题在90到120分钟之间时间压力主要来自客观题的数量和编程题的边界处理。从投递到笔试之间的时间窗口通常很短一周到两周。很多同学收到笔试邀请才开始刷题这是最大的误区。U3D岗位的笔试不像后端岗可以靠短期刷LeetCode冲刺它里面有大量引擎细节和渲染概念这类知识需要持续积累。学弟当时提前三天找我我给他的第一个建议就是把Unity官方手册的生命周期、物理、UI这几章重新翻一遍因为客观题几乎全从这些基础里出。1.2 题型结构与分值分配先算清楚答题策略不同批次的题量会有一点波动但整体框架可以这么看题型数量单题分值考察方向答题建议单选题20-252C#语法、Unity API、数据结构控制在40分钟内多选题8-123引擎机制、渲染、网络、优化不确定就不选编程题2-315-25算法、游戏逻辑/对象池等至少拿第一题满分简答/设计题0-210架构设计、项目复盘分点写关键词单选题覆盖最广从下列哪个不是值类型到Camera的clearFlags有几种再到下面哪些操作会造成GC Alloc都会出现。单选题的特点是细节多、范围大想靠押题过不现实只能靠平时积累。多选题是翻车重灾区因为它的计分规则通常是少选得部分分、错选零分。很多同学看到选项有点眼熟就手痒结果多选一个错误选项直接丢掉3分。我的策略很简单只选百分百确定的项。比如题目问哪些是协程的yield指令WaitForSeconds和WaitForEndOfFrame我确定Thread.Sleep我当然确定不是但如果有个选项是WaitForFixedUpdate我一时想不起具体语义就不选它。少拿一半分也好过整题零分。编程题是分差最大的部分。第一道纯算法题务必拿到满分因为这是最公平、最不依赖项目经验的题目第二道场景化题考察的是对象池、事件系统、LRU这类常见工程结构的实现以及你是否理解为什么在Unity里要这么写。面试官阅卷时不只看跑通没有还看代码结构、边界处理和注释习惯。1.3 出题人到底在筛选什么样的人把整张卷子摊开看出题意图很清楚筛掉只会拖拽组件、只会调用API的人留下理解引擎机制、能处理复杂逻辑、对底层原理有好奇心的人。这里举几个容易被忽视的细节。第一题目很少直白地问Update和FixedUpdate的执行频率而是给你一段混了协程、物理回调、动画事件的代码让你判断输出顺序。这类题考察的是引擎事件流的整体理解而不是单个API的记忆。第二多选题里高频出现以下哪些操作会产生GC Alloc。字符串拼接、LINQ、装箱、闭包捕获、foreach循环在部分老版本Unity中产生迭代器装箱全都会造成分配。这种题考的是你在真实项目里监控过性能而不是看过一篇优化文章。第三算法题的时间限制并不苛刻但题目会设计成朴素解法只能过一部分用例剩下用例需要你用哈希表或双指针优化。这就是在筛编码基本功和复杂度分析能力。这些信号归结成一句话笔试是过去一年甚至三年写代码习惯的复现考前突击只能补最表面的东西。2. Unity引擎高频考点逐项啃生命周期、协程、物理与UI2.1 Awake、OnEnable、Start的执行顺序与可反复触发的坑U3D笔试卷子里几乎必有一道生命周期题。这个知识点本身不难但出题人喜欢挖独立触发条件这个坑而不是单纯考AB C顺序。正常顺序是Awake脚本实例被加载时回调即使GameObject未激活也会调用→ OnEnableGameObject从未激活到激活、或组件从禁用变为启用时→ Start第一次Update前调用且仅一次。看下面这段代码你能判断输出吗public class LifecycleTest : MonoBehaviour { private void Awake() { Debug.Log(Awake); } private void OnEnable() { Debug.Log(OnEnable); } private void Start() { Debug.Log(Start); } private void OnDisable() { Debug.Log(OnDisable); } }如果这个组件所在的GameObject在场景中一开始就是激活的输出是Awake、OnEnable、Start。但如果GameObject一开始SetActive(false)等到运行时再SetActive(true)执行顺序变成Awake、OnEnable、Start但这次Start仍然只执行一次OnEnable则会因为这次SetActive(true)被调用一次。之后再SetActive(false)会触发OnDisable再次SetActive(true)又会触发OnEnable但Awake和Start都不会再触发。笔试里衍生出的经典问题是为什么不能在OnEnable里写只初始化一次的代码因为OnEnable在每次对象激活时都会执行。如果你在OnEnable里向某个全局字典注册自身重复激活就会重复注册导致逻辑异常。正确做法是把只做一次的初始化放在Awake或Start把每次激活都需要重置的状态放在OnEnable。这个区分在项目里非常实用笔试考的就是你有没有真的踩过这个坑。2.2 Update、FixedUpdate、LateUpdate与Time.timeScale的联动陷阱时间回调是另一个高频考点。FixedUpdate默认固定时间步长0.02秒也就是每秒50次是物理系统的驱动频率Update每帧执行时间间隔取决于帧率LateUpdate在所有Update之后执行通常用于相机跟随保证相机看到的画面是物体最新位置。笔试里经常这样出题一个刚体对象在FixedUpdate里做移动另一个普通对象在Update里做移动问为什么帧率变化时两者无法对齐。答案在于物理模拟的频率是固定的而渲染帧率是波动的。如果你在Update里直接改Rigidbody的position本质上是绕过物理系统去设置位置会和内部物理步进产生冲突表现为抖动或穿模。正确做法是操作Rigidbody时用MovePosition或AddForce让引擎在下一个物理步进中处理。Time.timeScale这个变量也是多选常客。它影响Update的deltaTime、协程的WaitForSeconds、动画播放速度但不会影响FixedUpdate的物理模拟频率。很多人以为Time.timeScale0就完全暂停了其实物理模拟还是以真实时间在跑只是渲染层面的Update不触发新逻辑。笔试题目会问timeScale0时以下哪些仍然会执行答案是FixedUpdate和WaitForSecondsRealtime协程。这类题就是区分游戏时间和真实时间的概念辨析理解本质就不会丢分。2.3 协程与异步送命题和高分题的分水岭协程是U3D笔试里的常青树因为它既能出送分题也能出高分题。送分题是协程是多线程吗答案是不是。协程仍然运行在主线程上它依赖Unity的消息循环来恢复执行。笔试里选是的人基本可以告别这个岗位了。真正的高分题是协程恢复时机的判断。看这段IEnumerator Test() { Debug.Log(1); yield return null; Debug.Log(2); yield return new WaitForSeconds(1f); Debug.Log(3); }yield return null表示下一帧继续WaitForSeconds表示等待指定游戏时间后恢复这里注意受Time.timeScale影响。WaitForEndOfFrame表示当前帧所有渲染和GUI完成后恢复常用于截图。WaitUntil则是每帧检查条件直到条件为真。如果笔试里让你实现一个倒计时功能用协程是最直接的方案public IEnumerator Countdown(int seconds, System.Actionint onTick) { for (int i seconds; i 0; i--) { onTick?.Invoke(i); yield return new WaitForSeconds(1f); } }这里有个隐藏考点循环里每帧调用new WaitForSeconds会创建新对象产生GC。更优写法是提前创建WaitForSeconds实例复用。如果你能写出这个优化笔试阅卷时会明显加分。协程和async/await的区别也是一个加分点。协程不能返回值、不能捕获异常、无法取消调度处理复杂异步流程时代码会很拧巴。Unity近年越来越推崇UniTask它在WebGL等平台上也能做到真正的异步。笔试不要求你用UniTask写代码但如果你知道协程不是线程和UniTask带来更完善的异步模型就在理解深度上超过大多数候选人。2.4 物理系统与UI Canvas两个容易混淆的刷新时机物理系统在笔试里考得最多的是触发器和碰撞器的判定条件。核心规则是两个物体发生碰撞至少一方有Rigidbody且双方都有Collider当Collider勾选IsTrigger时不再发生物理碰撞而是进入Trigger回调。注意如果两个都是Static Collider没挂Rigidbody的Collider它们之间不会产生碰撞回调因为引擎认为静态物体不参与动态物理计算。笔试里常给这样一个场景玩家角色有Rigidbody和CapsuleCollider地面只有BoxCollider问为什么角色会穿透地面。答案往往是角色移动时直接修改transform.position而不是通过物理系统驱动导致碰撞体没有参与物理模拟。这个考点在项目里也特别常见属于知道原理就不会犯的问题。UI方面Canvas的三种渲染模式是必背。Screen Space Overlay最简单UI总是绘制在最上层但无法和3D物体做正确遮挡Screen Space Camera把Canvas渲染在相机前方指定平面上能和3D物体产生遮挡World Space则把UI当作世界空间中的物体常用于血条、名字标签。笔试常考的是哪种模式适合血条答案是World Space因为它能跟随3D物体旋转和移动。UI相关的性能题也高频出现Canvas每次UI元素变化都会触发重建如果每帧动态改变大量Text或Image的位置会造成持续性的CPU开销。笔试通常会问如何优化频繁更新的UI答案包括将动态元素拆到独立Canvas、减少Layout Group的使用、文本不频繁变化时用TextMeshPro的静态模式等。这些点不背也能答关键是你有没有被项目里的UI卡顿虐过。3. C#语言与算法数据结构编程题的解题现场3.1 值类型与引用类型、装箱、委托与事件的语言底层C#基础题是单选题的大头。值类型和引用类型的区别大家都能说两句但笔试考的是混合场景里的行为预判。比如struct Point { public int X; public int Y; } class Rect { public Point Origin; } void Test() { Point p1 new Point { X 1, Y 1 }; Rect r1 new Rect { Origin p1 }; p1.X 10; Debug.Log(r1.Origin.X); // 输出什么 }结果是1。因为Point是结构体r1.Origin p1执行的是值拷贝后面改p1不影响r1。如果Point是class结果就是10因为引用赋值让两个变量指向同一块堆内存。这个例子是笔试里最常见的出题方式用struct/class组合考察你是否真正理解值语义和引用语义。装箱拆箱也是必考多选。值类型转为object或接口时会装箱在堆上分配内存拆箱时如果类型不匹配会抛InvalidCastException。笔试问以下哪些写法会造成装箱常见的坑有string.Format的参数、ArrayList.Add、Dictionaryobject, int的key、值类型作为接口类型传递。有个容易被忽略的点lambda表达式捕获int局部变量时结果是编译器生成闭包类不会装箱。很多人把闭包捕获和装箱搞混做题时要注意辨析。委托和事件的区别也常被拿来做下列哪个选项编译错误的题。事件对外只能通过和-订阅不能直接赋值不能像普通委托那样从类外部调用而委托字段可以任意赋值调用。有一个细节在类内部事件可以直接触发在类外部只能通过公开方法间接触发。笔试里遇到以下哪个对event的访问方式是合法的记住这个边界就能选对。3.2 手写算法题的常见套路先拿稳基础题网易U3D笔试的算法题综合校招情况看集中在字符串处理、链表、数组遍历、二叉树、二分查找和简单的动态规划。难度大概在LeetCode简单到中等极少出现竞赛题。第一题通常是很明确的标准题比如判断两个字符串是否互为字母异位词。字母异位词的标准解法是用计数数组public bool IsAnagram(string s, string t) { if (s.Length ! t.Length) return false; int[] count new int[26]; for (int i 0; i s.Length; i) { count[s[i] - a]; count[t[i] - a]--; } foreach (int v in count) { if (v ! 0) return false; } return true; }这道题能拉开差距的地方不在主流程而在边界两个空字符串是互为异位词的返回true长度不同直接返回false字符串里如果包含大写或空格计数数组的设计就要改。很多同学在IDE里写这种题毫无压力但笔试环境没有代码提示、没有编译调试手写错误率会明显上升。我的建议是平时练习时关掉IDE智能补全直接在纸上写写完自己走一遍示例和边界用例。链表反转也是高频手写题。迭代写法public ListNode ReverseList(ListNode head) { ListNode prev null; ListNode curr head; while (curr ! null) { ListNode nextTemp curr.next; curr.next prev; prev curr; curr nextTemp; } return prev; }这道题的坑在于最后返回的是prev而不是head因为循环结束时head已经指向null。我见过不少同学在笔试里写递归写法思路没错但链表很长时会有栈溢出风险迭代写法更安全。另外注意题目要求是否允许修改原链表有的变体要求反转部分区间需要额外处理边界节点。二分查找也是常客。笔试里考得多的不是标准二分而是在旋转排序数组中查找目标值这类变体。核心思路是每次比较mid和right确定哪半边有序再判断target是否落在有序区间内。这类题如果你没刷过现场容易卡壳建议考前把LeetCode的二分专题过一遍。3.3 从一道场景化编程题看Unity候选人的工程素养第二批笔试的编程题里偶尔会出现一个Unity相关的数据结构题比如实现一个简易对象池。题目会给一个泛型类的骨架让你补齐Get和Release方法核心要求是池为空时创建新对象对象释放时进入池中重复释放要报错或忽略。对象池为什么是高频题因为它直接关系到Unity性能优化的真实场景频繁创建和销毁GameObject会产生GC和CPU峰值在战斗、弹幕、特效场景中必须复用对象。笔试这道题考的不只是数据结构而是你有没有在项目里做过这种优化。一个常见实现public class ObjectPoolT where T : new() { private readonly StackT m_Stack new StackT(); public T Get() { return m_Stack.Count 0 ? m_Stack.Pop() : new T(); } public void Release(T obj) { if (m_Stack.Contains(obj)) { throw new System.InvalidOperationException(重复释放); } m_Stack.Push(obj); } }这里用Stack而不用Queue是有讲究的最近释放的对象大概率还留在CPU缓存里后进先出能提高缓存命中率。重复释放的检测用Contains虽然有点复杂度但能防止逻辑错误面试官看到这行代码就会觉得你有工程意识。再进一步如果对象是UnityEngine.Object比如GameObjectRelease时应当SetActive(false)而不是直接销毁Get时再从池里取出并SetActive(true)。这个版本更接近真实项目。第三个隐藏考点是线程安全。Unity主线程之外访问对象池几乎都有风险笔试里你不需要加锁但要明白这个类是否线程安全是一个设计问题。如果题目要求你支持多线程异步获取就需要用ConcurrentStack或加锁。不过U3D岗位里绝大多数场景都是主线程操作加锁反而会成为性能瓶颈。知道什么时候不加锁也是一种能力。4. 渲染与图形学U3D工程师绕不开的底层理解4.1 渲染管线从CPU提交到屏幕像素的必经之路图形学在这套笔试里的比重不低尤其是有道这种做3D交互和硬件的场景渲染相关题几乎是必出。考察方式不是让你默写Shader代码而是理解一个物体从场景数据变成屏幕像素中间经历了什么。渲染管线大致分三阶段应用阶段CPU、几何阶段GPU、光栅化阶段GPU。应用阶段做相机裁剪、可见性剔除、设置渲染状态、组织Draw Call几何阶段做顶点坐标变换、投影、裁剪把3D顶点变成2D屏幕空间的图元光栅化阶段把图元拆成片元做深度测试、颜色混合、写入FrameBuffer。单选题经常问视锥体裁剪发生在哪个阶段。答案是几何阶段具体说是顶点着色器之后的裁剪步骤。还有一个常见题深度测试发生在什么阶段答案在光栅化阶段中的逐片元操作。这些概念题不难但如果你没系统学过渲染管线现场很容易靠感觉蒙错。坐标空间变换也是必考。一个顶点要经过MVP矩阵变换从模型空间到世界空间、观察空间、裁剪空间最后做透视除法得到NDC坐标再映射到屏幕。笔试里常考的是顶点着色器输出的位置是哪个空间的坐标答案是裁剪空间Clip Space不是屏幕空间。很多人误以为顶点着色器输出的是屏幕坐标这是最常见的错觉。而Unity里的UnityObjectToClipPos就是把模型空间顶点直接变换到裁剪空间内部包含了MVP三个矩阵的乘法。4.2 Shader高频概念法线变换为什么要用逆转置矩阵Shader题的深度一般止步于概念加推导层面。最经典的考点是法线变换。普通顶点从模型空间变换到世界空间用模型矩阵左上角的3x3部分再乘位置向量就行。但法线不能这么处理因为当模型发生非均匀缩放时法线会失去与表面的垂直关系。想保持法线的垂直性需要用变换矩阵的逆转置矩阵inverse transpose来变换法线。很多人在笔试里答不上为什么只背了结论。常见变体题如果模型只做均匀缩放法线还需要逆转置吗答案是不需要。均匀缩放只是让法线长度变化方向不变归一化后无影响。但如果scale是(2, 1, 1)这种非均匀缩放就必须用逆转置。这道题能筛掉真正理解矩阵的人因为它不是靠记忆而是靠线性代数的直觉。法线贴图相关的考点也经常出现。法线贴图存储的是切线空间的法线方向这样可以复用到不同模型上避免每换一个网格就重新烘焙。光照计算前要把切线空间法线变换到世界空间或观察空间和光照方向同空间后才能计算点积。笔试里常考的是为什么法线贴图是偏蓝紫色的答案是法线方向在切线空间中偏向Z轴正向RGB里B通道蓝值较大。这种题不算难但见过和没见过差别很大。4.3 Draw Call、合批与内存优化性能题是综合压轴性能优化是U3D笔试里的综合大题经常以多选形式出现。核心是Draw Call也就是CPU向GPU提交渲染命令的次数。每次Draw Call都有固定开销Draw Call过多会让CPU成为瓶颈。常见优化方案有Static Batching静态合批适用于不移动的物体在构建时自动处理。Dynamic Batching动态合批运行时对满足条件的物体进行合批但顶点数有限制。GPU Instancing适用于大量相同Mesh、相同材质的物体比如草丛、岩石、粒子。SRP BatcherScriptable Render Pipeline下的合批减少材质属性设置开销。笔试常看的是哪些情况会导致合批失败。常见原因包括使用不同材质、模型顶点数超标、物体有非均匀缩放、修改了sharedMaterial导致材质实例化、使用SkinnedMeshRenderer、UI元素和3D物体混排等。最容易忽略的是代码里用material非sharedMaterial修改了颜色等属性这会在运行时创建新的材质实例硬生生拆掉原本能合批的物体。这个坑在真实项目里排查时极其痛苦笔试问出来就是考察实战经验。内存优化同样高频尤其是纹理和音频。Mipmap在3D场景中为什么要开启因为关闭后物体缩小到远处时会出现严重闪烁和锯齿为什么UI图集通常不生成Mipmap因为UI绘制时不会进行远景缩小Mipmap只会白白多占用约33%的内存。音频的加载类型也有考Decompress On Load适合短音效Compressed In Memory适合中等长度音乐Streaming适合背景长音乐选错会导致内存峰值或播放延迟。AssetBundle和资源管理也是常客。AssetBundle的依赖处理、引用计数、卸载时机如果项目里没有实际踩过坑笔试很难答得好。很多真题会考重复加载同一个AssetBundle是否会导致资源冗余答案是不会但SetAssetBundle的引用计数会叠加需要成对调用增删。这类知识点光看文档背不下来只有在工程里崩溃过、查过Profiler才记得牢。5. 复盘后的教训与备考路线给下一届同学的可执行方案5.1 现场容易犯的低级错误别人怎么丢的分上面聊了很多知识内容现在聊聊更实际的笔试现场到底怎么丢分。我帮学弟复盘时发现丢分点大部分不是不会做而是低级错误做错。第一是单选题死磕。遇到一道不会的题心里不服气花十分钟在那琢磨结果后面编程题时间不够。正确做法是不会的先标记跳过全部做完再回头蒙哪怕乱选也有25%的概率得分卡死在某一题上则永远拿不到分。第二是多选策略失误。多选题的计分规则往往是少选得部分分错选零分。很多人觉得部分分太少不值得硬要选满结果一错整题归零。我的建议是不确定的选项绝不选3分的题目拿1.5分比拿0分强得多。尤其是有六七个选项的多选出题人故意放入很多干扰项全选对的情况极少。第三是编程题不读题。题目要求返回结果有人直接打印题目要求原地修改链表有人新建了一个数组。这些错误不是能力问题是审题习惯问题。拿到编程题先用一分钟把题目要求、输入输出约束、边界条件划出来再动手写。这个习惯在LeetCode上刷题时就要养出来。第四是自测不足。代码写完了只跑示例不跑边界s.Length 0、head null、数组里全是负数这类用例几乎必然会挂。笔试平台用的是隐藏用例你的代码在示例上跑通没有任何意义。写完之后花两分钟把所有能想到的边界都过一遍这个动作能救回很多分。5.2 笔试前两周冲刺清单按优先级排序的备考路径如果你已经收到笔试邀请还剩两到三周时间可以按这个清单来安排优先级内容具体动作建议时长高C#语言基础结构体/类、装箱、委托/事件、字符串内存每天1小时高算法编程LeetCode分类刷字符串、链表、二叉树、二分每天2小时高Unity引擎生命周期、协程、物理、UI渲染模式每天1小时中图形学基础渲染管线、坐标空间、法线变换每天1小时中性能优化Draw Call、合批、GC、Mipmap、AssetBundle隔天1小时低网络同步TCP/UDP、帧同步/状态同步、延迟补偿有余力再看这个优先级是按投入产出比定的。C#和算法是编程题和选择题的双重保障投入最划算Unity引擎细节是U3D岗位的相对优势必须有渲染和优化是拉开差距的地方但如果时间不够优先保证前面三块。Unity部分一定要亲手验证。生命周期顺序、协程恢复时机、触发器和碰撞器的组合行为光看书很容易记混。建一个空工程挂脚本打Debug.Log跑一遍就全记住了。这种方式比死记文档有效得多也是业内公认最快的引擎记忆法。算法部分不要盲目刷难题。笔试目标是过不是竞赛。LeetCode热门100题里的字符串、链表、二叉树、二分、简单DP刷两遍足够应对网易笔试的算法题。遇到不会的题先看题解理解后隔天再默写一遍效果比题海战术好得多。5.3 答得不完美也有机会笔试和面试的衔接方法笔试不是终点很多同学考完觉得自己某题漏了边界、某道多选拿不准心态就崩了。实际上网易的面试环节会重新考一遍你的思考过程和项目经历笔试的瑕疵有机会在面试里用深度理解补回来。复盘时建议把错题整理成一张表题目考了什么知识点、我当时怎么想的、正确结论是什么、这个知识点有没有关联到我的项目。这张表不仅是笔试查漏补缺还可以在面试被问你对引擎的哪个模块研究比较深时直接把话题引到你擅长的领域。面试官每天面很多人一个能主动展示思考深度的候选人比被动等提问的候选人印象深得多。如果你有Unity项目经验哪怕只是一个Demo一定要提前想清楚三个问题项目里最复杂的交互逻辑是什么你做过哪些性能优化、效果如何如果重做一次你会怎么设计架构这三个问题几乎是面试官手中的三板斧提前把答案写在文档里胜率会明显提升。最后再多说一句。我陪学弟复盘这套网易2023校招U3D笔试时最深的感触是U3D笔试考察的从来不是你知道多少API而是你有没有在真实项目里踩过坑、思考过为什么。那些能答好生命周期、能讲清楚协程和线程区别、能说出法线变换为什么用逆转置矩阵的人大概率不是考前突击出来的而是平时写代码时就喜欢多问一句这个引擎底层到底怎么做的。如果你现在还有时间与其焦虑地刷题不如从今天开始养成读引擎文档和源码的习惯。这个习惯对笔试、面试甚至以后每一天的开发工作都是收益最高的长期投资。
返回列表