【C++游戏引擎开发】第1周《线性代数》(1):环境配置与基础矩阵类设计

发布于:2025-03-28 ⋅ 阅读:(35) ⋅ 点赞:(0)

一、开发环境配置

1.1 启用C++ 20

在VS2022中新建项目后右键项目
在这里插入图片描述

1.2 启用增强指令集

在这里插入图片描述

1.3 安装Google Test

vcpkg安装使用指南

vcpkg install gtest:x64-windows

# 集成到系统目录,只需要执行一次,后续安装包之后不需要再次执行
vcpkg integrate install

二、基础矩阵类设计

核心需求:动态大小、内存对齐(SIMD友好)、基础接口。

2.1 完整代码

#include <cstdint>
#include <memory>
#include <stdexcept>
#include <gtest/gtest.h>

// 内存对齐配置:AVX2需要32字节对齐
constexpr size_t kSimdAlignment = 32;

class Matrix {
public:
    Matrix(size_t rows, size_t cols)
        : rows_(rows), cols_(cols),
        data_(static_cast<float*>(_aligned_malloc(rows* cols * sizeof(float), kSimdAlignment))) {
        if (!data_) throw std::bad_alloc();
    }

    ~Matrix() {
        _aligned_free(data_);
    }

    // 拷贝构造函数(深拷贝)
    Matrix(const Matrix& other) : Matrix(other.rows_, other.cols_) {
        for (size_t i = 0; i < rows_ * cols_; ++i) {
            data_[i] = other.data_[i];
        }
    }

    // 获取行、列数
    size_t rows() const { return rows_; }
    size_t cols() const { return cols_; }

    // 元素访问(行优先存储)
    float& operator()(size_t row, size_t col) {
        return data_[row * cols_ + col];
    }
    const float& operator()(size_t row, size_t col) const {
        return data_[row * cols_ + col];
    }

private:
    size_t rows_;
    size_t cols_;
    float* data_;
};

TEST(MatrixTest, ConstructionAndAlignment) {
    Matrix mat(4, 4);
    EXPECT_EQ(mat.rows(), 4);
    EXPECT_EQ(mat.cols(), 4);

    // 验证内存对齐(地址是否为32的倍数)
    uintptr_t ptr = reinterpret_cast<uintptr_t>(&mat(0, 0));
    EXPECT_EQ(ptr % kSimdAlignment, 0);
}

TEST(MatrixTest, CopyConstructor) {
    Matrix mat1(2, 2);
    mat1(0, 0) = 1.0f;
    Matrix mat2 = mat1;
    EXPECT_EQ(mat2(0, 0), 1.0f);
}

int main(int argc, char** argv) {
    testing::InitGoogleTest(&argc, argv);
    return RUN_ALL_TESTS();
}

2.2 运行测试结果

在这里插入图片描述


三、注意事项

3.1 ​SIMD兼容性检查

  • 确保CPU支持AVX2指令集(Intel Haswell及以上,AMD Excavator及以上)。
  • 运行时崩溃?检查内存对齐是否合规。

3.2 浮点精度控制

  • 后续求逆误差验证需使用双精度或高精度算法,此处暂时用单精度。