天美 成都 游戏客户端开发 面经
面试时间: 2022/4/21
今天面试了天美的游戏客户端,部门没听清,好像是J2
面试时长30-40min
一、项目介绍
主要是围绕以前做过的项目介绍功能实现。
做这个功能是怎么想的。以及我用到了贝塞尔曲线,所以被问了贝塞尔曲线。
不记得曲线的公式了,只记得实现时的原理,感觉没有答好
二、图形学
之前的贝塞尔曲线也算图形学
光线是否打到三角形内
动画相关,mesh怎么跟着骨骼移动(感觉没答好)
还有一个问题忘了,我回答的是关键帧,具体每一帧位置角度对关键帧插值
三、c++八股
虚函数表的实现,多重继承时的内存分布
虚函数表是类内还是对象内(这一块没有答好)--> 虚函数表是针对类的,一个类的所有对象的虚函数表都一样
C++的编译器应该是保证虚函数表的指针存在于对象实例中最前面的位置(这是为了保证取到虚函数表的有最高的性能——如果有多层继承或是多重继承的情况下)。
这意味着我们通过对象实例的地址得到这张虚函数表,然后就可以遍历其中函数指针,并调用相应的函数。目前gcc 和微软的编译器都是将vptr放在对象内存布局的最前面。
- 虚函数表属于类,类的所有对象共享这个类的虚函数表。
- 不同对象虚函数表是一样的(虚函数表的第一个函数地址相同);
- 每个对象内部都保存一个指向该类虚函数表的指针vptr,每个对象的vptr的存放地址都不一样,但是都指向同一虚函数表。
vector和list的区别 -->
vector底层实现是数组;list是双向 链表。
vector支持随机访问,list不支持。
vector是顺序内存,list不是。
vector在中间节点进行插入删除会导致内存拷贝,list不会。
vector一次性分配好内存,不够时才进行2倍扩容;list每次插入新节点都会进行内存申请。
vector随机访问性能好,插入删除性能差;list随机访问性能差,插入删除性能好。
vector支持随机访问,list不支持。
vector是顺序内存,list不是。
vector在中间节点进行插入删除会导致内存拷贝,list不会。
vector一次性分配好内存,不够时才进行2倍扩容;list每次插入新节点都会进行内存申请。
vector随机访问性能好,插入删除性能差;list随机访问性能差,插入删除性能好。
强制转换相关 --> 多重继承下,子类指针原本指向子类, 现在强制转换指针类型,问怎么变换的 (没有答好)
自定义类时,静态转换会判断转换类型之间的关系,如果转换类型之间没有任何关系,则编译器会报错,不可转换
class A{};
class B : public A{};
class C{};
void main() {
A *pA = new A;
B *pB = static_cast<B*>(pA); // 编译不会报错, B类继承于A类
pB = new B;
pA = static_cast<A*>(pB); // 编译不会报错, B类继承于A类
C *pC = static_cast<C* >(pA) // 编译报错, C类与A类没有任何关系。error C2440: "static_cast": 无法从"A *"转换为"C *"
}
四、算法
乱序数组中找第k大的数 --> 可以用堆排序和快排实现
快排的基本思想,时间复杂度
五、其他
实习时间