疯狂游戏一面

公司规模:100-499,投递岗位:引擎开发

c++

  1. 右值引用

    <aside> 💡

    右值一般指的是将亡值,比如非引用的函数返回值,临时表达式..

    右值引用可以绑定到一个右值上面,可以利用右值实现移动构造函数以及移动拷贝函数,因为传入的是右值,所以可以直接接管其资源不需要额外的创建存储以及拷贝操作。

    </aside>

  2. 完美转发

    <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>

  3. 用过哪些STL容器 - 没深问

    <aside> 💡

    vector-动态数组

    deque-双端队列,通过一个map加多段等长连续内存出现

    list - 双向队列

    forward_list - 单向队列

    map/unordered_map/multi_map

    set/unordered_set/multi_set

    </aside>

  4. 用得最多的C++特性

  5. union,解释下面的数据结构代码,如果往value里面存一百,结果是多少

union pixelStruct{
	struct{
		uint8_t r;
		uint8_t g;
		uint8_t b;
		uint8_t a;
	},
	uint8_t c[4];
	uint32_t value;
}
  1. 给了一个浮点数的表示方式的结构体,问是什么意思,大概就是有1个符号位,8个指数,23个尾数,加起来32位,允许精确控制变量的位数,问这个有什么用。(在 游戏引擎图形学 中,自定义浮点格式(如 10-bit, 16-bit, 24-bit 浮点数)主要用于 优化存储和计算: ✅ 降低存储成本:标准 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;

项目

  1. float16 为什么会导致问题,跟float32比(忘光了…),32位到16位是怎么变化的…为什么会有精度问题

    <aside> 💡

    计算机能表示的浮点数是离散的,浮点数越大,两个可表示浮点数之间的距离就越大,那么浮点运算时的累计绝对误差就会变大。

    FP16的尾数位只有10位,指数位5,FP32有23个尾数位,8个指数位,相比之下FP16的精度小很多,计算时候带来的累计误差也会变大,导致问题

    </aside>

  2. 低精度为什么会导致光线于包围盒,三角形求交的问题(复习一下求交过程)

    <aside> 💡

    光线与三角形求交:

    1. 最常用的方法,假设光线与三角形的交点是 O+tD,其中t未知。可以计算交点的重心坐标,判断u,v是否符合u,v≥ 0, u+v≤0来判断是否与三角形有交点,同时求解出t </aside>
  3. openGL和别的API比,有什么优缺点

    <aside> 💡

    openGL相比Vulkan和DirectX 12性能较差,提供的API封装度比较高,可控制的程度比较小,不是很灵活。比如资源管理都是API自动管理,Vulkan这些则提供了更细粒度的API来控制…

    </aside>

  4. 引擎中哪些部分可以用多线程来处理 - 多线程相关的内容

    <aside> 💡

    加速结构的构建及更新,可以用多线程来做。对于日志的IO等等,也可以用多线程来做

    </aside>

  5. 浮点数的表示方式

    <aside> 💡

    目前的计算机表示浮点数基本都遵循IEEE 754标准,一个浮点数由符号位,指数位和尾数位组成,其中尾数位存储的是有效数字。

    </aside>

  6. 问了下游戏里面的时间系统是什么

总结

把低精度路径追踪写在了第一个项目,结果问我精度相关的问题我是一点不会…