第一次面试小结——网易游戏

隐藏

本周六收到网易盘古工作室的电话面试,作为一名非计算机科班出身的人,能给我这样的机会已经非常感激了。也不知道面试结果如何,总之我的实力目前还很欠缺。需要抓紧学习!争取以后能有机会吧~

面试的心态

作为第一次面试,内心还是有些小小的紧张的。回过头来看,还有一些不足。首先,面对问题不够沉着。尤其面试官给了我一段时间思考的时候。心里面总想快点找到解,而实际上这样反而思维容易跳偏,所以导致思路混乱。几个很简单的问题,都没有抓住。这样反而起到反面的效果。

另一方面是因为以前看书没做总结和记录。虽然当时感觉良好,但还是会遗忘,所以以后看书一定要用思维导图或者写代码,或者写到博客上才行。

第三,没有准备笔和纸,这样面对图形学要画图的问题时候,一紧张就懵了。没想到啊~

总结就是:面试时要冷静面对看书一定要做总结全面的准备

需补充的知识点

从这次面试上来看。需要补充OpenGL以及图形学的相关知识。

面试中的问题

以下几个问题需要考虑:

1. 关于渲染

CryEngine 3 如何做到如此逼真的实时渲染画面?

关键词:预处理

2. 关于C++的smart指针

参见关于C++的智能指针

3. 关于C++的异常处理catch和throw

子问题:throw可不可以放在基类的析构函数中。

如何用C语言实现异常/状况处理机制?


为什么C++中,析构函数、operator delete、以及operator delete []按照惯例不会抛出异常?

vzch的答案:

不是不会,是不能。这是你自己要确保的。如果你写出了一个会抛异常的析构函数和operator delete,那就是你的bug要改。

至于原因嘛。一般来说new挂了,try-catch会帮你析构掉那些new之前成功处理的东西。当然了你的构造函数自己要try-catch恢复,因为构造函数失败了,类是不完整的,所以相对应的那个析构函数是不运行的。如果这个时候delete也挂了,那简直无法恢复了。以前我看Windows关于如何在x86处理器上实现try-catch的文章曾经指出(我只剩下一点印象了不保证完全正确),嵌套抛出的异常在某些情况下有可能会忽略所有stack unwind。也就是说你正常的、在上层的函数的try-catch里面要跑的析构函数和所有的catch,不运行了。

4. 如何判断直线穿过三角形

当时的回答:思路是先求出直线与三角形所在平面的焦点。(面试官说思路是正确的。)

关于求焦点,我想到一个是联立直线和平面的方程求解。(面试官说直接有公式求解,也就是反正也是三个方程的解,直接得到。)分析原因,这里一方面是紧张了没有想到。想想其实很简单啊。另一方面,书看少了没记住。平常做数值模拟时习惯性地觉得联立方程是一件很可怕的事情,意味着计算量极大,惯性思维啊!对于这种三次方程而言直接解就是了。

另一个想法是利用点积,叉积求焦点。当时思路乱了,没回答上来。现在回忆一下觉得思路是错的。

另外,关于三维上的平面用什么方程表示,有些懵了,就是\(a1 \times X + a2 \times Y + a3 \times Z = b\)啊,这个很简单。当时是担心把平面方程和直线方程搞混了,这么简单的问题要是回答错了岂不是直接悲剧了。不冷静啊。

后来想到了用两个矢量的线性组合确定一组平行平面,再根据一个平面上的点,获得平面方程。其实这样思路是对的,而且用在三点求平面的情况要好一些,只是不是面试官要我回答的答案,面试官这么简单的问题应该只是一个引子。

话说记得在学习《线性代数的》的有天早晨专门思考了什么是平面,什么是线,什么是空间之类的问题。说明学的知识哪怕自我感觉良好也要在实践中不断加强才行。否则就悲剧了。

还有就是貌似我当时把叉积说成了旋度,虽然是一个意思,但旋度是数值模拟里的概念,面试官可能更了解叉积。而且,我觉得不应该用旋度这个概念。这个概念给人一种错觉,觉得旋度的大小说明了旋转的程度,其实是两个矢量构成的平行四边形的面积,一定程度上有一点旋转的程度的味道在里面,只是不是根据角度,而是面积。所以感觉叉积好一点,避免了容易引起的歧义。

引申问题:如何判断在三角形内

第一个想法是根据该点p到三个三角形端点A、B、C所形成线段pA,pB,pC的内角和为360度。

考虑特殊情况在边上也成立。

考虑特殊情况在端点上需要判断。

再考虑数值计算的精度问题。

5. 判断两个二维线段相交

当时想到的方案是求焦点判断焦点到端点的长度。这个思路是可行的。但是面试官提示有效率问题或者更优解。

现在给一个冷静的思路:

首先是确定判断相交于不相交有什么区别,可能的思路是:

  1. 根据焦点到端点的距离,这个是上述思路。可能计算较慢。
  2. 必须满足一条线段A将另一条线段B一分为二,B的端点被切分在A的两边(A、B相互成立)。这样定义一个法线n来判断,跟法线n在同方向为正,反方向为负。
  3. 围成的四边形内角和为360度。(需要注意端点顺序)
  4. 跟2的思路一样,只是不是用法线,而是用切线。

猜测方法可能是2或者4。这个有待考证。

引申问题:如何判断三维线段相交

个人猜测:

  1. 如果是相交,必定在同一个平面内,先判断。
  2. 在判断了在同一个平面内之后再根据2维线段的判断方法判断,重点是找经过该平面的线段A的法线n_A,
  3. 可以根据该平面的法n与该线段A求叉积得到。(貌似用切线比法线方便啊)
-----EOF-----

Categories: life Tags: 面试 智能指针 图形学