多益网络二面(技术面)
岗位是游戏客户端
oc了,这边发一个面经,后面的答案不完全是我答的,我自己整理的时候查了一些资料整理出来的答案,仅供参考
1.说说渲染管线
主要分三个阶段:应用阶段、几何阶段和光栅化阶段
应用阶段:准备数据如模型数据、光源信息、摄像机信息等,然后剔除不需要渲染的物体比如不可见的物体,最后设置一些渲染参数如材质、纹理、shader等,然后调用draw call指令。
几何阶段:主要是顶点着色器进行数据计算的过程,流程为顶点着色器、曲面细分着色器(可选)、几何着色器(可选)、裁剪、屏幕映射。首先顶点着色器会将模型空间转化为裁剪空间,并且输出顶点的颜色信息,然后就是根据我们相机视野进行裁剪,剪去我们看不见的东西,然后就是屏幕映射,有两种投影方式:正交和透视,将三维空间转化为我们看到的二维画面。
光栅化阶段:主要是Fragment Shader进行数据计算的过程,首先是获取三角形边界,然后进行颜色填充,其中会对纹理信息、光照、着色方式进行计算,最后形成一个个片元,然后还有一些深度测试、模板测试之类的东西,最后混合在一起,会有一些半透明物体这种情况。
2.有了解pbr(基于物理的渲染)吗?
没
3.为什么不继续学OpenGL进阶了?
后面去学unity了
4.有学c#吗?学了多久?
没有系统的学过C#主要是已经学过C++用起来没有太大差别。
5.有了解过智能指针吗?说说他们三个的区别
有
Unique_ptr:确保只能有一个指针指向资源,独占式,可以通过Move移交权限给其他Unique指针。
Shared_ptr:共享指针,可以由多个指针指向资源,并进行计数,当没有指针指向资源时自动释放。
Weak_ptr:通常和shared_ptr一起使用,可以获取shared_ptr的一些状态信息,还可以用来解决Shared_ptr的循环引用的问题。
6.什么是编译和链接?
编译:将高级语言转化为机械语言,让机械能看懂我们程序的代码
链接:将我们的代码转化为可执行文件,把一些系统组件和代码整合在一起,比如我们引入的库和标准库。
7.深拷贝和浅拷贝的区别
深拷贝会完全复制一份新的对象,包括对象中里层的子对象,而浅拷贝则仅仅复制最外层的对象,更深层的对象将与原对象共用。
8.虚函数是怎么实现的?
C++11新特性,final表示虚函数不能被继承,override:检查派生类虚函数是否重写了父类的虚函数,没有重写会报错。
虚函数表:用于存放虚函数的地址,一个含有虚函数的类至少会有一个表,该表一般位于某类型的对象实例在内存中的最开始的位置。虚函数用虚函数表和虚函数指针实现多继承则会有多个虚函数表,每个父类有一个,而自己的虚函数放在第一个表中父类的虚函数指针后,在重写父类虚函数后放在每个有该方法的父类的虚函数表的最前方。
9.多叉树和二叉树的区别
多叉树最多拥有多个子节点,二叉树最多拥有两个子节点
10.后序遍历是怎么实现的?
假设有一个根节点,根节点有一个左子节点有一个有子节点,首先先遍历左右子节点,最后遍历根节点,也就是指在遍历时最后遍历父节点。
11.讲一讲进程、线程和协程
进程:进程是程序一次动态执行的过程,是程序运行的基本单位,每个进程会有独立的内存空间,不同进程通过一些通信方法来通信:如管道、消息队列、共享内存、信号量、信号和Socket。
线程:一个进程中会有多个线程,是CPU调度的最小单位,各个进程共享一个进程的内存,不同线程之间主要通过共享的内存通信。
协程:一个线程中会有多个协程,协程完全由用户进行控制,是一种用户态的轻量化线程。
12.有了解排序算法吗?归并排序怎么实现的?时间复杂度?空间复杂度?是稳定的吗?
有,时间复杂度O(nlogn),空间复杂度O(n),归并排序是稳定的排序
13.算法:实现归并排序
14.期望薪资是多少?
反问: