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

【C++游戏引擎开发】《线性代数》(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 浮点精度控制

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

相关文章:

  • PHP安装HTML转图片的扩展GD库的使用
  • 江西核威环保科技:打造世界前沿的固液分离设备高新企业
  • 【C++】httplib:轻量级的 HTTP 服务器和客户端
  • 神奇的FlexBox弹性布局
  • R语言——循环
  • vue 自定义 tabs 控件,可自动左右滑动使得选中项居中显示
  • VulnHub-FALL通关攻略
  • CSS3学习教程,从入门到精通,CSS3 弹性盒子(Flexbox)布局全面指南(20)
  • linux ACL权限控制之用户权限控制程序设计
  • HO与OH差异之Navigation三
  • 【leetcode刷题日记】lc.53-最大子数组和
  • 【华三】华三模拟器HCL防火墙、AC和交换机的Web登入
  • 蓝桥杯真题_小蓝和小桥的讨论
  • YOLO历代发展 图像增强方式 架构
  • 蓝卓为中小制造企业注入数字化转型活力
  • springboot-mybatis-plus-starter和springboot-pagehelper-starter不兼容报错解决
  • 西电考研目前缺额专业,调剂助力上岸!
  • 深入理解二叉树、B树与B+树:原理、应用与实现
  • 26考研——查找_树形查找_平衡二叉树(AVL)(7)
  • 自建隐私优先的元搜索引擎:SearXNG 部署全指南
  • 游戏网页/百度网站优化软件
  • 怎样用微信做购物网站/windows优化大师官方下载
  • 廊坊网站建设佛山厂商/河北百度seo点击软件
  • 番禺 建网站 360元/网络排名优化软件
  • 做网站点击软件/百度推广官网首页
  • 新世纪建设集团有限公司网站/网址查询服务器地址