第一次面试经历

自己准备了很长的一段时间,因为之前都比较浪,没有复习就去笔试,所以导致前面很多的笔试都做得不好,没能拿到面试机会。
虽然这是一次电话面试,但因为是第一次面试,所以比较紧张,面试官也比较紧张。准备了很多面试题都没有考,因为面试官会从一些例子中抽象出问题让我们来解决,而不是单纯的问问题。
自己答得不好的几个地方:
一个姓名对应一个学号,我们应该用什么方式存储
第一个想到的是map,set
但是面试官说假设不能用stl容器
然后我第一个想到的是链表,然后链表的实现确实太过复杂
后来面试官就跟我说了hash表,其实我对hash表只是有个大概了解,然而没有实现过,所以我就跟它说了一些概念。
其实我觉得hash表也算是一个容器,在c++里面虽然不是stl容器,但是也有这个的运用。
其实hash表是一个数组+链表的一个组合,先是创建一个比较大的数组,然后通过散列函数进行存储,如果有相同的散列值,则会在后面用链表的方式进行连接,相同的索引也能访问到,确实比链表要好得多。

游戏中怎么选择出离自己最近的10个怪物,怪物存储在数组里面
我一开始想到的是排序,快排。
然后面试官说有没有比快排更快的一种方法,由于数量比较庞大,即使是快排也会很耗内存。
我当时就懵逼了,因为快排是目前为止最快的嘛。
然后我就想起来之前在网上看到过的一种选择方法,假设1000个怪物,我们先分成10组,每组100个,然后这100个来进行快排,然后选出最近的10个。然后就得到了100个数据,前十的数就确保在这100个数之内了。
然后再把这100个数进行快排,然后就得出了前10个。
时间复杂度为O(nlog2 n),但是它的系数会比下面的一个方法要大。
但是当时说得不是很好,思路不太清晰,就被面试官否定了。

后来面试官让我说一下快排的思路,我说完后,他就让我在原有的基础上进行改进。
当时我再次懵逼,感觉自己已经把所有的思路都说完了。
后来一想才发现,确实还能有改进的地方,我们先选出一个标杆数据,然后进行快排一次,得出一个定位值,如果这个定位值小于10的话,我们就从定位值的右边进行扩展,如果这个定位值大于10的话,我们就从定位值的左边进行扩展,直到定位值等于10为止,就找出了前十的数据。
while(index!=(k-1))
{
if(index>k-1)//如果大了就直接往内缩,直到等于为止
{
end=index-1;
index=Partition(input,start,end);
}
else//如果小了则往外靠,直到等于为止
{
start=index+1;
index=Partition(input,start,end);
}
}
最坏的情况和快排一样,都是O(n^2),最好的情况为log2 n快了一个倍数级。

还有一个UDP和TCP的问题。
一开始我觉得无论什么游戏,只要是商业化的都用TCP,因为它安全可靠,而UDP更适用于局域网。
其实它是一个相对的问题,网上也很多不同的讨论。
后来面试官问我说如果TCP丢包了会怎样。
然后我就说可能会失帧,然后导致玩家瞬移之类的。
面试官又问我UDP丢包了会怎样。
我就说可能玩家瞬移的幅度不大,失帧的幅度会更小一点。
然后面试官就问如果在一个王者荣耀游戏里面,你更会接受哪一种。
我就说UDP,其实面试官是在引导我作出最好的判断。
现在得出来一个总结:虽然UDP不安全,但是很多需要实时的游戏都会用到它。
比如说一些竞速类的,赛车类的,动作类,moba类的都会使用UDP。
而一些卡牌类的,即使有掉包也不会影响太大的游戏都用TCP。

面试官问我还有什么问题的时候,我应该跟他说把我答不上的知识解析一下才对。
没有收到第二轮面试,说明彻底凉了,现在返回来添加一个问题。

FPS游戏中是否需要子弹?
因为我之前做过这样一个小demo,所以面试官就问我是怎么做的。
其实我只用到了射线检测,之前做坦克大战时用到过子弹,所以什么时候需要子弹,什么时候不需要子弹呢?
即时射击:其实很多的FPS时不需要子弹的,直接用射线检测就可以,但是这样会违背一个真实性。
弹道射击:有真实的子弹,需要控制速度,时间,风向等,可能会用作更高级的射击或者是慢速射击。
但是这两个都会有问题的存在,如果用射线检测的话,因为得到的结果是即时的,就算是很远的人也很难去躲避子弹,缺乏一个真实性,不能做弧线。
如果用子弹的话,子弹的速度,方向什么的都要计算,导致变得复杂,而且如果用碰撞体的话,可能会穿透,如果出现掉帧的情况,子弹可能就会不中。
当时面试官问到这个情况,我想的是当子弹离目标有一段距离的时候,在子弹的尖端做射线,这样算是一个折中的方法,我也不知道对不对,很后悔之前没有问面试官。
https://www.zhihu.com/question/63674137

穿透目前的解决方案有:增大碰撞体,减慢速度,利用射线检测,这三个比较靠谱的方法,显然前两个会违背子弹的一个设计,所以很多情况都会在子弹尖端做射线检测。

猜你喜欢

转载自blog.csdn.net/qq842447820/article/details/82971204