Funplus-宝可梦大世界项目
项目经历
有点硬核,对着简历一条条问的,每条都要问个细节。
状态机与行为树的对比,优缺点之类的
check
lua与C#的交互(tolua怎么调用C#,以及C#怎么调用lua函数)
核心就是lua和C#之间有个虚拟栈,lua调用C#就把参数压入栈,然后C#从栈里取值,运行完函数逻辑后,如果有返回值就把返回值压入栈供lua取用;C#调用lua也是同理。
lua的GC流程
Mark and Sweep算法。
- mark阶段,从根集遍历可达性,对于可达的对象标记为灰色;将灰色集合对象遍历一遍,把有引用的且未被标记的对象加入灰色集合里,已经遍历过的灰色对象标记为黑色(表示本次gc不回收)。
- sweep阶段,从对象全集里(一个链表),遍历未标记颜色(白色)的对象并释放。特别注意的是,在gc阶段刚创建的对象会被标记为另一个白色,避免这个对象刚创建就被销毁。
追问:有啥针对lua GC的优化吗?
lua GC有个问题就是内存碎片,解决方案是用对象池,提前申请连续的内存,避免频繁GC带来的碎片化空间。
lua的元表是什么?有什么好处吗?或者说有什么应用?
元表定义了元方法,当lua table触发特殊机制的时候会访问元表的元方法。
常见元方法:__index,__newindex
利用元表机制,可以实现面向对象的继承、只读table之类的。
网易互娱-燕云十六声-使用Messiah引擎(C++ & Python)
一面
感觉一面的面试官都比较新手,不是很会面试,而且还是两个人上的。。。面试体验挺差的,大部分都在问八股文,而且由于双方技术栈没对上,所以没啥可问的空间。
哦对了,还有一点让我觉得体验很差的地方是,人家面试我的时候问啥我就答啥,连我薪资都问去了,结果到我反问环节的时候我问啥人家都不说。。。我就问了项目的进度,大概还要开发多久,战斗组人力配比啥的,都不回答。。让我问后头的面试官。。。这感觉太敷衍了。
lua的GC
老生常谈了,过
C#的Dictionary结构是啥?
没了解过。。不过倒是知道c++的unordered_map
想问多线程的问题
没做过,不了解,别问了
互斥锁、资源锁的差异
不会。。
做过内存池吧?一个多对象的内存池,如果很大,该怎么办?
人家好像是想问这个内存池的释放策略,不过我一开始答了利用操作系统的虚拟内存管理手段,让操作系统帮助我们载入使用中的内存指针。后面被拨回正规后,答了利用LRU算法来管理,将最不常使用的池子释放掉。
追问:LRU的实现机制用的是什么数据结构?
一个哈希表+一个链表
C++相关,比如智能指针
不会,虽然曾经准备校招的时候确实背过,不过怕被人家把底裤问穿,还是说了不会,hahaha
Navmesh的烘焙流程?
常见的寻路算法
floyd、Dijkstra、A*
A*的结果是不是最优解(最短路)?
其实只要启发函数的评估够精确,那A*的结果确实是最优解。
Dijstra和A*的区别?
额,面试的时候没答好,后续问了大佬,需要重新去思考一下这部分内容了。主要来说,有关算法的区别的问题,一律先从时间复杂度和空间复杂度上作比较。
有用过啥设计模式吗?
- 单例模式
- 工厂模式
算法题:反转链表
LeetCode 206
二面
相较一面来说,二面的面试官更专业,感觉很锐利,一下就能看透本质。
项目经历
项目里对lua底层做过啥优化?
额。。我一个大头兵,我哪知道,这种事轮不到我来做吧。。
后续问了一下,我们的lua直读方案就是一种优化。待补充。
Lua的闭包与其他语言的闭包有啥不同吗?
Lua的坑点?
说了说for循环这个东西,在lua里是一开始就确认好遍历次数的,不像别的语言,每次执行的时候计算一次
还有and or代替三元运算符也是有问题的,常见的认知是:a and b or c,当a为true,返回b;反之返回c。
local openFunc = true
local temp = 0
local other = 10
local state = openFunc and (temp and temp == 1) or other
print("state:",state)
不过上述的返回值却是other,本质上因为 b == false,所以返回了other。
算法题:最长公共子串
LeetCode 1143 最长公共子序列、718. 最长重复子数组。
标签:12,C#,面经,lua,对象,遍历,GC,内存,2023 From: https://www.cnblogs.com/aisingioro/p/17878631.html