当前位置: 首页 > news >正文

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

一、开发环境配置

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 浮点精度控制

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

相关文章:

  • pyqt 信号与槽
  • 生物中心论
  • mysqlworkbench导入.sql文件
  • Linux应用:线程基础
  • MATLAB中iscell函数用法
  • 内嵌式触摸显示器在工业视觉设备中的应用
  • python策略模式
  • OpenBMC:BmcWeb 生效路由2 Trie字典树
  • 《Tr0ll2 靶机渗透实战:弱口令+SUID+两种缓冲区溢出+ 提权完整+fcrackzip暴力破解+shellshock漏洞+脏牛三种root提权复盘》
  • 企业级大模型微调
  • SAP-ABAP:SAP IDoc技术详解:架构、配置与实战
  • 若依专题——基础应用篇
  • 如何实现多维度风险排查与合规管理?
  • 如何防御TCP洪泛攻击
  • 考研408-数据结构完整代码 线性表的链式存储结构 - 单链表
  • 多网络选择路由(windows环境)
  • 分布式共识算法解密:从Paxos到Raft的演进之路
  • 容器C++
  • CI/CD(八) gitlab搭配Jenkins的ci/cd配置
  • OpenHarmony NativeC++应用开发speexdsp噪声消除案例
  • wordpress所有分类/四川seo快速排名
  • 真实的做视频网站/semester
  • 名师工作室建设网站/新河seo怎么做整站排名
  • 自己电脑做网站用备案/营销型网站的公司
  • 鲜花团购网站建设/宣传网站怎么做
  • 江苏宜安建设有限公司网站/搜索引擎优化的步骤