公司规模:100-499,投递岗位:引擎开发
右值引用
<aside> 💡
右值一般指的是将亡值,比如非引用的函数返回值,临时表达式..
右值引用可以绑定到一个右值上面,可以利用右值实现移动构造函数以及移动拷贝函数,因为传入的是右值,所以可以直接接管其资源不需要额外的创建存储以及拷贝操作。
</aside>
完美转发
<aside> 💡
完美转发指的是,一个模板函数,可以原封不动地把参数传递给另外一个函数(保留参数的const,以及引用属性等等)。
利用右值引用+引用折叠配合forward函数,来实现完美转发
void foo(int& x) { cout << "左值引用\\n"; }
void foo(const int& x) { cout << "const 左值引用\\n"; }
void foo(int&& x) { cout << "右值引用\\n"; }
template <typename T>
void wrapper(T&& t) {
foo(std::forward<T>(t)); // 完美转发
}
// 为什么需要这么麻烦?
// 如果传入的参数t是右值,在函数体内部使用的话,它就会被当成左值,因为有名字的变量都是左值
</aside>
用过哪些STL容器 - 没深问
<aside> 💡
vector-动态数组
deque-双端队列,通过一个map加多段等长连续内存出现
list - 双向队列
forward_list - 单向队列
map/unordered_map/multi_map
set/unordered_set/multi_set
</aside>
用得最多的C++特性
union,解释下面的数据结构代码,如果往value里面存一百,结果是多少
union pixelStruct{
struct{
uint8_t r;
uint8_t g;
uint8_t b;
uint8_t a;
},
uint8_t c[4];
uint32_t value;
}
float(IEEE 754, 32-bit)占用 4 字节,而 自定义格式(如 10:5:16)可以更小,减少显存占用。)#include <stdint.h>
// 冒号是C的位域,用来定义结构体中的位级存储
typedef struct {
uint32_t mantissa : 23; // 尾数部分(假设是 23 位)
uint32_t exponent : 8; // 指数部分(8 位)
uint32_t sign : 1; // 符号位(1 位)
} CustomFloat;
float16 为什么会导致问题,跟float32比(忘光了…),32位到16位是怎么变化的…为什么会有精度问题
<aside> 💡
计算机能表示的浮点数是离散的,浮点数越大,两个可表示浮点数之间的距离就越大,那么浮点运算时的累计绝对误差就会变大。
FP16的尾数位只有10位,指数位5,FP32有23个尾数位,8个指数位,相比之下FP16的精度小很多,计算时候带来的累计误差也会变大,导致问题
</aside>
低精度为什么会导致光线于包围盒,三角形求交的问题(复习一下求交过程)
<aside> 💡
光线与三角形求交:
openGL和别的API比,有什么优缺点
<aside> 💡
openGL相比Vulkan和DirectX 12性能较差,提供的API封装度比较高,可控制的程度比较小,不是很灵活。比如资源管理都是API自动管理,Vulkan这些则提供了更细粒度的API来控制…
</aside>
引擎中哪些部分可以用多线程来处理 - 多线程相关的内容
<aside> 💡
加速结构的构建及更新,可以用多线程来做。对于日志的IO等等,也可以用多线程来做
</aside>
浮点数的表示方式
<aside> 💡
目前的计算机表示浮点数基本都遵循IEEE 754标准,一个浮点数由符号位,指数位和尾数位组成,其中尾数位存储的是有效数字。
</aside>
问了下游戏里面的时间系统是什么
把低精度路径追踪写在了第一个项目,结果问我精度相关的问题我是一点不会…