2023-12月面经

发布时间 2023-12-05 23:50:42作者: Takagisan

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. 最长重复子数组。