腾娱面经
面了很多次腾娱,干脆直接汇总在这一篇。
三角洲
一面30min。二面40min。二面挂。主要都是项目拷打和实习。无八股算法
UE的GC
UE的Gameplay框架
反射如何处理C++与蓝图之间的转换
UE智能指针
Lyra的如何做输入还有资源的多平台适配
Lyra的UI框架
手游常用的渲染管线
单例模式的缺陷
事件消息中心的解耦
代号二杠三
主要是八股拷打,二面挂。
设计一个洗牌算法
移动构造赋值的实现、应用场景
move的源码实现,与foward的区别
如何防止移动构造赋值时分配新的内存、被移动对象是否移动以后被回收
C++11以后string的建议实现
C++17 std::string_view
C++20 std::span
C++ std::allocator
forward应用场景、源码实现
模板特化、实例化的概念与区别
模板元编程实现类型列表
线程池和对象池的设计实现
PCB的组成
进程与线程
快排
堆栈实现
哈希表原理
模板方法
原型模式
UE反射
UE RPC的实现
共享指针实现
弱指针实现
Lambda表达式捕获方式,this是否默认捕获
inline的作用,.h文件的成员函数不写inline会怎么样
如何防范栈溢出攻击
未知组
主要拷打实习产出,一面挂。
值传递和引用传递
数组和链表的区别
定长数组扩容优化
如何解决网络波动情况下,UE的FastArray按位同步出错的问题
雪中悍刀行
二面挂
一面(45min)
GameState和GameMode,PlayerController和PlayerState
实习产出拷打
实习有个改源码的产出,说一下
【直接打开引擎改给他看】
UE的UMG和Slate的关系是?
属性同步的原理
RPC
ProtoBuf有哪些优势?
如果游戏在某个场景下突然卡顿,你怎么排查?
UE的智能指针
了解过WeakPtr的具体原理吗
【没有,但是SharedPtr我了解过】
SharedPtr呢?
【懒得动嘴了,手撕了简易版的default_deleter,控制块和MakeShared,一边写一边讲给他听】
项目拷打
手撕:
给定字符串数组,把元素拼接到一个字符串里面,但是每个元素由','分隔开
判断链表是否有环(写一半不让写了,说太麻烦)
二面(60min)
压力面,深入拷打然后还出了一些陷阱题。
“类的默认构造函数是什么样的”
“一般是浅拷贝”
“那要是成员变量里有个string,不就有深拷贝了吗,你这理解不行啊”
【你™也没说成员变量里有什么啊】
这种对话反复出现,到最后我不知道为什么情绪一下子上头了吼了对面两句,挂了也是正常的事。
逆战未来
想要会做gp的。看不上我,简历都没看,拖着问了40多分钟,没了。
只能说大厂的✌就是✌,面试个外包摄像头不开,上来就是一句你觉得你实习做过什么有价值的东西,就知道又是个没看简历的主。果不其然,想要一个商业项目里做过gp的。那你要不想想能在中大厂商业项目里有gp产出的实习生为什么要来你个臭外包公司啊。真跟你分享一下最近的技术收获,你又觉得搞UI,改UI系统源码没水平。那看来贵组外包对实习生很不错嘛,能让实习生做GP战斗。
说了没在商业项目里做过gp,简历上的玩具gp你又看不上,一直追着问gp优化,你™听不懂人话吗。让你给点提示,跟nm个人机一样一直重复“你再想想”。
我想你莫的筹备,面试之前看看简历眼睛是会瞎是吧。看不起别来烦人啊傻逼
魔方在研UE手游
虽然没说是什么项目,但根据背景信息猜测是某个边缘半死不活的二次元FPS游戏。
我不太喜欢多人游戏,加上项目也比较边缘,也拿到了一个单机游戏的offer,就把这个offer拒了。
一面(60min)
实习产出
设计一个资源加载接口,要求判断该资源本地是否存在,存在则本地加载,不存在则向服务器请求?
设计一个图片资源加载接口,解决对于同一个Image对象,可能存在频繁更换序列化资源的问题?
设计一个排行榜系统,考虑如何与服务器商定请求数据,以及轮询请求的时机?
设计一个类三角洲的背包系统,单元格大小一致,但是每个物品占据单元格大小不一致,怎么设计方便背包物品的快速排序、以及如果要在拖动物品时根据物品大小和背包状况有不同表现时该怎么更好的优化?
【用图形代理模式最好。然后数据表记一下每个物品的占据的单元格大小,以左上角为每个物品的锚点最好】
我看你之前都是做端游,那手游中,每个手机的屏幕尺寸大小不同,所以需要动态调整UI大小和渲染优化,怎么做?
【幽默,除了你家谁会用UE做手游,咋地我面你家还得默认我在你家实习过是吧】
UE的内容本地化方案了解多少
【FText+StringTable】
指针和引用
帧同步和状态同步
MOBA用帧同步还是?MMO呢?
二面(20min)
属性同步
FastArray
PushModel
设计一个子弹对象池,从哪些方面考虑子弹对象池大小
GC
GAS中GE三种时间效果
三面(30min)
实习产出
高帧率下,让一个UI跟随鼠标移动会有UI跟不上鼠标的问题如何解决?
聊天框因为聊天文本的大小不同,所以每条聊天消息的高度不同,那么如何动态计算每次渲染聊天文本时滑动条的长度?
UE的富文本只支持修改文字大小、颜色、字体和正斜等,如果想实现MarkDown里面的删除线效果怎么做
【派生一个自定义的富文本类,重写富文本装配器的SetText函数,检测特定标签,然后加一张横线的图片就行。至于图片的长度要动态调整。这个可以看看单个横线图片可以覆盖几个字,(跟美术商量一下,原始的横线图片刚好1个字最好)然后写一个UI动态材质,用TextureCoordinate管理这张图片,在Shader里,乘法代表这个图片被平铺渲染多少次,可以暴露一个float或者int的动态参数,代表当前标签内有几个字或者渲染的像素宽高,分解提取TextureCoordinate的R通道,根据参数去做乘法,动态平铺到水平方向(其实就是根据文字的宽度动态在水平方向上复制横线图片)】
国际通用的英文文本显示方案中,如果每一行末尾的那个单词超出了本行的显示范围,就会被渲染到下一行,UE里也是这样。但是如果玩家的某一条消息是中英混杂的,例如“嘻嘻aaaaaaaaaaaaaaa”,那么所有的'a'都会被判定成一个单词,被渲染到第二行,第一行只有“嘻嘻”这两个字,看着非常不美观。现在希望后面的'a'能正常在第一行显示,填充完第一行以后再换行,这个怎么做
【UE的文本更新方案是:调用SetText -> WidgetTree标记脏数据触发更新 -> 文本装配器解析文本,主要是把所有标点符号标记在一个BreakCandites数组中 -> TextLayout中的FlowLineLayOut函数进行流式渲染,主要是遍历BreakCandites把文本分割,然后计算每个分割块中的文本像素大小,与高度和宽度边界对比。那一堆a里面就是因为没有标点符号才会被TextLayout判定成一个单词。所以办法是:继承UE的富文本装配器接口,重写这个接口的SetText函数,这个接口函数会对文本进行分行处理,在这里用Slate的FontMeasureService,从每一行的第一个字符开始逐字符截取子串,计算这个字串的像素宽度是否超过换行宽度(换行宽度通常是文本块的Size.X),如果大于换行宽度就在那个字符那里插入一个无内容的符号(空格、零宽字符都可以),这样FlowLineLayOut就会在这个符号那里换行了】

查看10道真题和解析