游戏客户端工作一年后的社招跳槽总结
开篇碎碎念
(想看干货可以跳到第三部分,想看面经可直接跳到最后)
时隔一年多,连我自己都没想到还会再更新牛客……新朋友欢迎点开主页看上一篇帖子。现在上班之后,仿佛时间又加速了。在过去的一年里,虽然积累了不少项目经验,但由于一些原因——简单说就是全栈太杂、技术较老、成长见顶——我决定尽快寻求新的突破。遂骑驴找马一个多月。了一个多月。如今下家已定,也顺利提了离职。
回首这一个多月,感慨颇多。最大的感慨应该是:骑驴找马是真的累呀!然后:有了大厂背书(应该算吧),简历的通过率确实比校招时高了不少。这也不禁让我回想起校招时的艰辛,如果当年能早点觉醒,攒点实习经历,或许就不会走得那么困难了。现在醒悟早就晚了,只能写在这里提醒后来的朋友。
投递情况与感受
这次社招就没有像校招那样海投了,面试过的公司大致有这些:腾讯(王者,洛克),网易(无限大,永劫,某在研,遗忘之海),莉莉丝,游卡,途游,英雄游戏,巨人网络,波克城市,创梦天地,库洛等。基本都是在BXSS投递的。最后只拿到一家offer,offer之后别的流程都拒了。这时候可能有朋友要问了,米呢?我也想问,米呢?!原来简历就过不了啊😪那最后去哪了呢,当然是要去抓宠了
hr特别好,和面试官也聊得比较来,流程推得快到飞起,从一面到正式offer只有两周。

整体面下来的直观感受,中厂更喜欢围绕项目来问,甚至全程只问项目,八股基本只有大厂爱问。一年经验对大厂来说,就是校招pro版,依然重基础的同时也会深挖项目。其他公司就是正常社招,会更偏向业务而不是算法八股。当然也可能是我面试的公司比较少,结论不具有一般性。
然后……一年经验真的很难跳呀,因为这个阶段比较尴尬。感觉中小厂会更喜欢经验再丰富一些的;大厂会接受一年经验,但是要求有很扎实的基础。而再往后,工作年限继续增多,就会更看重以往工作经验和岗位的匹配度(需要更垂直的工作经历)。当然,也非常看运气,需要刚好有适合你的空位。我现在能面试到的岗位大部分是系统向,我过往的工作内容也确实更偏系统,因为系统向的内容可能更偏功能一些,新人上手更快,所以新人阶段接触这方面的功能会更多些……
一些复盘和建议
项目
可以肯定的是,不管是什么厂,你简历上的项目、你在过去工作中实际做过的需求,永远是最核心、最需要好好准备的。要捋清楚需求,你是怎么思考和实现的,用到了什么技术,这些在面试时要能流畅地表达出来。同时也不能只停留在表层,要关注与你负责的模块相关联的功能和底层,最好主动翻阅了解一下它们的底层实现。而且,即使你负责的功能没有涉及到什么底层,也需要去看看项目里最通用的底层框架,面试时很可能会问,比如:事件系统、ui管理类、资源加载、网络同步等。
然后,面试官可能还会问你假如在更多更复杂的情形下,或者策划提出了更进一步的需求,你的功能又该如何实现和扩展,所以一定要提前去思考可能的提问方向,不然面试时现想容易卡壳或者回答得不如人意。这种可能是压力面。
笔试和手撕
绝大部分公司没有笔试。极个别有笔试的,考察内容和校招时的笔试差不多…考408甚至还有编译原理…
一个多月的面试里只遇到两次手撕,都是偏向业务实际场景的,没有纯粹的算法题手撕,分别是简单的玩家数据存取系统和红点系统。不过我最近翻牛客,发现社招面试时手撕还是有不少的。所以力扣hot100仍需要熟悉,保持手感。
AI
这个真值得专门开一个小标题。我90%以上的面试,在大概最后十分钟的时候,面试官都问了“在工作中有没有使用ai,是如何使用的”。面试官这么问,肯定是希望听到你有使用ai,有去了解和关注ai的一些前沿使用,比如skills和mcp。ai真的是大势所趋了,是实实在在地渗透进了日常开发。
跳槽原因
如果你是骑驴找马,那还有比较重要的一个问题,就是你看机会的原因,你为什么要跳槽。这个一定要针对岗位好好包装一下,提前想好话术。
比如说我面试时就遇到一家,问我看机会的原因,我答不希望做双端,更想做客户端一些,结果面试官说他们现在就想招做双端的。我chovy,你jd给我写好的啊,明明写的招客户端,结果面试又要做双端。面试当然也不出所料地挂了。早期的时候还有一家问原因,我当时说不太喜欢现在项目的游戏类型,然后面试官反问我那你喜欢什么类型?是怎么判断喜不喜欢的?全靠主观吗?于是这个也挂了。
就是说,面试官和HR其实并不关心你具体是因为什么要跳,他们更在意你会不会因为相同的原因再次跳槽。所以理由要往客观、正向的方向说,比如“希望接触更成熟的技术栈”“想在更大型的项目中成长”。
如何准备
如果问我是怎么准备的,emmm其实准备得也挺碎的。
因为上班的地方离租的房比较远,通勤时间比较长,所以上下班路上会看八股或者技术文章。至于项目,需不需要在工作项目的基础上再准备一些别的,我的看法是,如果你的工作内容很饱满,产出足够,并且用到的技术很好,那一般就是不需要的。如果觉得产出不够,或者技术栈老旧,那要么自己对现有项目做拓展或者包装,要么自己再搓项目。
我的话,因为项目的技术比较落后嘛,所以我的做法是针对项目里落后的框架,学习和复现更优秀的框架。如果面试时问到老项目里的相关功能是如何实现的,我会结合自己重新实现的方案进行回答。早期我就没做好,只是被动的回答面试官问的问题,后来复盘认为应当自己主动表达老技术的局限性,阐述更优秀的方案。
关于引擎
可能又有人问了,主播主播,洛克是ue做的呀,为什么要转ue呢?怎么才能转ue呢?
这方面其实我没什么能交待的,学什么引擎都可以。ue确实在中大厂的机会会更多一些,而中大厂又相对来说更看学历一些。所以,如果学历背景一般,我个人认为unity路线可能会更加稳妥,因为岗位数量更多;如果目标是中大型项目和大厂,那么ue可能更适配,发展前景更好。
至于转引擎,工作之后也是有机会转的,但还是越早转越好,要尽早把握机会。公司接不接受转引擎,看岗位jd或者直接问hr。如果下定决心要转,那最好是去深入学习新引擎,然后做个项目。如果只是随缘转,可转可不转的,那可以不用学新引擎,但是毫无疑问,c++是一定要过关的(尤其是想转ue的话),然后需要展现出你有足够的潜力和学习能力,让面试官相信你能够很快转到新的引擎。
最后,
一个多月的骑驴找马,说长不长,说短不短。累是真累,但现在回头看,每一步都有用。从全栈杂活到专注客户端,从老项目到新引擎,不仅仅是一次跳槽,更是求职路的一大步。但愿近期就不更新这种帖子了(笑
希望本文对正在看帖的你有一点帮助。欢迎留言或私信交流
顺便问问有没有同在深圳或者鹅的友友
祝大家都能去想去的地方,抓到想抓的宠~
(别走,后面还有面经)

面经汇总
以下是从所有面试中选取的一些有价值的问题,归类整理而来。对项目的深挖就没整理进来了
括号内的回答并非我面试时的回答,也不是标准答案,仅供参考
C++
- 介绍智能指针
- weak ptr为什么能打破循环引用?底层实现原理?
- unique ptr有什么实际业务场景需要使用?shared ptr和weak ptr呢?
- 使用过C++多线程吗?有什么线程同步的方式?
- const int*,int* const,const int* const
- 如果我就想修改const int变量的值,可以怎么做(…?)
- const修饰成员函数的作用
- 空类对象占用多少内存?(1字节)如果它就是0字节,会有什么严重后果?(…?给我问住了。我说为0的话就不能区分两个不同的对象了,面试官认为这不是严重后果。我说指针随便指向一个地方,就可以说是这个空类的对象,进行访问的话会出问题,面试官说空类本来也没数据,不会进行访问。答案欢迎讨论)
- 指针占用的内存大小?在不知道系统,不使用sizeof的前提下,如何知道指针的大小?
- 什么是内存对齐?然后举了一个例子问内存布局
- 多继承
- 在多继承下,子类对象的内存布局?(先声明先存储,先基类再派生。父类对象按继承顺序排布在子类对象里,最后是子类独有数据)
- 如果多继承的父类里有虚函数呢?(有虚函数的父类都会有vptr,在子类中的对应父类对象的开头有各自的vptr,所以子类中会有多个vptr。如果父类中有的有虚函数,有的没有,那么有虚函数的会排布在前面)
- 如果派生类自己也有虚函数呢?(当调用派生类的虚函数时,直接使用第一个基类的vptr。这一块很复杂,不细写了。面试官还是仁慈了,没有结合虚继承来问,考虑vbptr的情况会更复杂一些)
- 什么是右值引用?解决了什么问题?
C#
- 介绍C#的GC算法
- 讲讲分代,为什么要分代,分代的依据是什么(绝大多数对象生命周期极短;存活越久的对象,继续存活的可能性越大。新生对象默认第0代,新生大对象第2代)
- 介绍delegate,event,Action,Func
- 装箱拆箱是什么
- 如何避免装箱
- C#编译之后是什么(IL)
lua
- table的底层实现
- 如何在lua中实现面向对象
- 如果不用metatable,还有什么方法能实现面向对象(…?大概思路是要用闭包,每次new新的对象时都要给成员函数做新的闭包)
- lua为什么能热更
- lua GC的原理
- C++与lua交互的原理
- 业务中如何减少lua GC
408
- 进程和线程的区别
- TCP和UDP的区别,分别适合什么场景(这个一般还会结合项目实际场景再追问。可能再拐一下unity的UnityWebRequest)
- OSI网络模型
- MTU是什么
unity
- unity里为什么要少触发GC?如何减少
- UGUI和NGUI的合批
- ui动静分离的原理
- 场景里的合批
- 物体之间的渲染顺序是如何确定的
- ui上的粒子特效层级不正确,有穿透或遮挡,如何解决
- 如何自动监测一个界面的DrawCall?(当时特意问了一下面试官,unity里有现成的获取DrawCall或者Batch数量的接口吗,答没有。所以思路可能是修改UGUI源码,在Canvas的willRenderCanvases里监听ReBatch,获取合批的结果)
- unity NavMesh导航底层的算法?
- unity协程是如何实现的
- 为什么只能在unity主线程中操作GameObject?如果想用多线程该怎么做?(大概要说unity底层为了性能所以没有做线程同步,是线程不安全的。多线程一般是来处理CPU或者IO密集型操作,线程之间是交换普通数据,而不是UnityEngine.Object,还需要自行处理线程同步的问题。另外可以用Job System)
- Mono和IL2CPP对泛型的处理有什么不一样(从JIT和AOT去考虑)
- Mono和IL2CPP的GC有什么区别(特别mark一下这个题,在我面试的这三年时间里,这个问题一共只遇见两次,一次米一次鹅。特别注意,二者的GC本质都是Boehm GC,都是非精准的。回答这个问题需要结合IL2CPP的源码。解答关键是IL2CPP生成的C#类对应的C++类Il2CppClass中,有一个gc_desc字段,用于指示类的各个字段是否是引用。在IL2CPP的Boehm GC运作时,会参考这个字段,快速排除不是引用的字段,因此IL2CPP的GC比Mono的GC更精确一些。更详细的解释可以自行搜索)
其他各种
- z-test和z-write
- 状态同步和帧同步?帧同步的缺点?
- 对象池有什么作用?当一个对象回收进池时,需要注意什么问题?
- 介绍状态机和行为树
- 垃圾回收有些什么算法(引用计数,标记清除,复制算法)
- A*
- 看你项目里用了A*,还有什么寻路算法?是出于什么考量在项目里选择了A*
- A*寻路的原理
- 如果场景有主干道,策划希望寻路时优先去主路,该怎么实现?
- 场景有传送门,可以连接场景里任意两个位置?
- 场景有加速路段?
- 同时寻路的物体特别多,可以怎么优化?
- 地图特别大,网格有上万个?(A*的优化方法有不少,值得去专门整理 )
- 讲讲ECS
- 结合ECS,对A*可以如何优化?
- MVC架构?工作里制作ui时利用MVC设计了哪些类?
- 在实际工作对ui用了什么优化方法?
- 如果打开一个界面时有明显卡顿,可以如何优化?(这里又说了一下如何确定卡顿掉帧的原因)
- Protobuf
- 编码的原理
- 如果协议加了新的参数,为什么能兼容旧协议
- Protobuf的优化方法(常用字段的编号尽量在16以内;如果字段常出现负数,可以用sint)
- 事件系统是如何设计的?如果只订阅事件不取消订阅会有什么问题?如何实现自动取消订阅?(思路是将事件的订阅绑定到这个GameObject的生命周期上,做法是在订阅的同时在GameObject上添加一个脚本,在这个脚本中的生命周期函数中执行取消订阅)
- 有两个玻璃球,如何用最少扔出次数确定楼层高度(经典智力题,然而我没准备T_T)
- 求平面外一点到平面的距离
- 如何检测平面内两个多边形是否有碰撞
over~前路漫漫亦灿灿,人生海海皆星辰
#社招##大厂面试问八股多还是项目多?##游戏客户端开发工程师##我的求职总结#