Files
XCEngine/README.md

375 lines
15 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# XCEngine
基于 DirectX 12 的游戏引擎项目,支持体积渲染、跨平台渲染后端和核心模块单元测试。
## 项目概述
XCEngine 是一个正在开发中的游戏引擎,采用 RHIRender Hardware Interface抽象层设计支持 DirectX 12 和 OpenGL 多种渲染 API。项目采用模块化设计包含核心库和单元测试。
## 技术栈
- **渲染 API**: DirectX 12, OpenGL 4.6+
- **语言**: C++17
- **构建系统**: CMake
- **测试框架**: Google Test
## 项目结构
```
XCEngine/
├── engine/ # 核心引擎库
│ ├── include/XCEngine/
│ │ ├── Containers/ # 容器模块
│ │ │ ├── Array.h # 动态数组
│ │ │ ├── String.h # 字符串类
│ │ │ ├── HashMap.h # 哈希表
│ │ │ └── Containers.h # 模块统一头文件
│ │ ├── Core/ # 核心基础模块
│ │ │ ├── Types.h # 基础类型别名
│ │ │ ├── RefCounted.h # 引用计数基类
│ │ │ ├── SmartPtr.h # 智能指针
│ │ │ ├── Event.h # 事件系统
│ │ │ └── FileWriter.h # 文件写入
│ │ ├── Debug/ # 调试与日志模块
│ │ │ ├── Logger.h # 日志系统
│ │ │ ├── LogLevel.h # 日志级别
│ │ │ ├── LogCategory.h # 日志分类
│ │ │ ├── LogEntry.h # 日志条目
│ │ │ ├── ConsoleLogSink.h # 控制台输出
│ │ │ ├── FileLogSink.h # 文件输出
│ │ │ ├── ILogSink.h # 日志槽接口
│ │ │ ├── Debug.h # 调试宏
│ │ │ └── Profiler.h # 性能分析
│ │ ├── Math/ # 数学库
│ │ │ ├── Vector2.h # 二维向量
│ │ │ ├── Vector3.h # 三维向量
│ │ │ ├── Vector4.h # 四维向量
│ │ │ ├── Matrix3.h # 3x3 矩阵
│ │ │ ├── Matrix4.h # 4x4 矩阵
│ │ │ ├── Quaternion.h # 四元数
│ │ │ ├── Transform.h # 变换
│ │ │ ├── Color.h # 颜色
│ │ │ ├── Rect.h # 矩形
│ │ │ ├── Sphere.h # 球体
│ │ │ ├── Box.h # 盒子
│ │ │ ├── Plane.h # 平面
│ │ │ ├── Ray.h # 射线
│ │ │ ├── AABB.h # 轴对齐包围盒
│ │ │ ├── Bounds.h # 包围体
│ │ │ ├── Frustum.h # 视锥体
│ │ │ └── Math.h # 数学库统一头文件
│ │ ├── Memory/ # 内存管理模块
│ │ │ ├── Allocator.h # 分配器接口
│ │ │ ├── LinearAllocator.h # 线性分配器
│ │ │ ├── PoolAllocator.h # 内存池分配器
│ │ │ ├── ProxyAllocator.h # 代理分配器
│ │ │ └── MemoryManager.h # 全局内存管理器
│ │ ├── Threading/ # 线程模块
│ │ │ ├── Thread.h # 线程类
│ │ │ ├── Mutex.h # 互斥锁
│ │ │ ├── SpinLock.h # 自旋锁
│ │ │ ├── ReadWriteLock.h # 读写锁
│ │ │ ├── Task.h # 任务基类
│ │ │ ├── LambdaTask.h # Lambda 任务
│ │ │ ├── TaskGroup.h # 任务组
│ │ │ ├── TaskSystem.h # 任务系统
│ │ │ ├── TaskSystemConfig.h # 任务系统配置
│ │ │ └── Threading.h # 线程模块统一头文件
│ │ ├── Resources/ # 资源管理模块
│ │ │ ├── ResourceTypes.h # 资源类型定义
│ │ │ ├── IResource.h # 资源接口
│ │ │ ├── ResourceHandle.h # 资源句柄
│ │ │ ├── ResourceManager.h # 资源管理器
│ │ │ ├── ResourceCache.h # 资源缓存
│ │ │ ├── ResourcePackage.h # 资源包
│ │ │ ├── ResourceFileSystem.h # 资源文件系统
│ │ │ ├── ResourcePath.h # 资源路径
│ │ │ ├── FileArchive.h # 文件归档
│ │ │ ├── DependencyGraph.h # 依赖图
│ │ │ ├── ImportSettings.h # 导入设置基类
│ │ │ ├── IResourceLoader.h # 资源加载器接口
│ │ │ ├── AsyncLoader.h # 异步加载器
│ │ │ ├── Texture.h # 纹理资源
│ │ │ ├── TextureLoader.h # 纹理加载器
│ │ │ ├── TextureImportSettings.h # 纹理导入设置
│ │ │ ├── Mesh.h # 网格资源
│ │ │ ├── MeshLoader.h # 网格加载器
│ │ │ ├── MeshImportSettings.h # 网格导入设置
│ │ │ ├── Shader.h # 着色器资源
│ │ │ ├── ShaderLoader.h # 着色器加载器
│ │ │ ├── Material.h # 材质资源
│ │ │ ├── MaterialLoader.h # 材质加载器
│ │ │ ├── AudioClip.h # 音频资源
│ │ │ ├── AudioLoader.h # 音频加载器
│ │ │ └── Resources.h # 资源模块统一头文件
│ │ └── RHI/ # 渲染硬件接口抽象层
│ │ ├── RHITypes.h # RHI 类型定义
│ │ ├── RHIEnums.h # RHI 枚举
│ │ ├── RHICapabilities.h # 硬件能力查询
│ │ ├── RHIFactory.h # 设备工厂
│ │ ├── RHIDevice.h # 渲染设备抽象
│ │ ├── RHICommandQueue.h # 命令队列抽象
│ │ ├── RHICommandList.h # 命令列表抽象
│ │ ├── RHIBuffer.h # 缓冲区抽象
│ │ ├── RHITexture.h # 纹理抽象
│ │ ├── RHIShader.h # 着色器抽象
│ │ ├── RHISampler.h # 采样器抽象
│ │ ├── RHIFence.h # 同步栅栏抽象
│ │ ├── RHISwapChain.h # 交换链抽象
│ │ ├── RHIPipelineState.h # 管线状态抽象
│ │ ├── RHIPipelineLayout.h # 管线布局抽象
│ │ ├── RHIDescriptorPool.h # 描述符池抽象
│ │ ├── RHIDescriptor.h # 描述符抽象
│ │ ├── OpenGL/ # OpenGL 后端实现
│ │ │ ├── OpenGLDevice.h
│ │ │ ├── OpenGLCommandQueue.h
│ │ │ ├── OpenGLCommandList.h
│ │ │ ├── OpenGLSwapChain.h
│ │ │ ├── OpenGLPipelineState.h
│ │ │ ├── OpenGLBuffer.h
│ │ │ ├── OpenGLTexture.h
│ │ │ ├── OpenGLShader.h
│ │ │ ├── OpenGLSampler.h
│ │ │ ├── OpenGLFence.h
│ │ │ ├── OpenGLVertexArray.h
│ │ │ ├── OpenGLRenderTargetView.h
│ │ │ └── OpenGLDepthStencilView.h
│ │ └── D3D12/ # DirectX 12 后端实现
│ │ ├── D3D12Device.h
│ │ ├── D3D12CommandQueue.h
│ │ ├── D3D12CommandAllocator.h
│ │ ├── D3D12CommandList.h
│ │ ├── D3D12SwapChain.h
│ │ ├── D3D12PipelineState.h
│ │ ├── D3D12Buffer.h
│ │ ├── D3D12Texture.h
│ │ ├── D3D12Shader.h
│ │ ├── D3D12Sampler.h
│ │ ├── D3D12Fence.h
│ │ ├── D3D12DescriptorHeap.h
│ │ ├── D3D12RootSignature.h
│ │ ├── D3D12RenderTargetView.h
│ │ ├── D3D12DepthStencilView.h
│ │ ├── D3D12ShaderResourceView.h
│ │ ├── D3D12UnorderedAccessView.h
│ │ ├── D3D12ConstantBufferView.h
│ │ ├── D3D12QueryHeap.h
│ │ ├── D3D12Screenshot.h
│ │ ├── D3D12Types.h
│ │ ├── D3D12Enum.h
│ │ └── D3D12Common.h
│ └── src/ # 实现文件
│ ├── Containers/
│ ├── Core/
│ ├── Debug/
│ ├── Math/
│ ├── Memory/
│ ├── Threading/
│ ├── Resources/
│ └── RHI/
├── tests/ # 单元测试
│ ├── containers/ # 容器测试
│ ├── memory/ # 内存管理测试
│ ├── threading/ # 线程模块测试
│ ├── core/ # 核心模块测试
│ ├── math/ # 数学库测试
│ └── RHI/ # RHI 抽象层测试
│ ├── OpenGL/ # OpenGL 后端测试
│ └── D3D12/ # D3D12 后端测试
├── mvs/ # 示例程序
│ ├── HelloEarth/ # 基础渲染示例
│ ├── VolumeRenderer/ # 体积渲染器NanoVDB
│ └── ui/ # 编辑器 UI
├── docs/ # 设计文档
│ ├── api/ # API 文档
│ └── plan/ # 开发计划与架构设计
└── build/ # 构建目录
```
## 快速开始
### 前置要求
- Windows 10/11
- Visual Studio 2019 或更高版本
- CMake 3.15+
### 构建项目
```bash
# 创建构建目录
mkdir build && cd build
# 配置 CMake
cmake .. -A x64
# 编译
cmake --build . --config Debug
```
### 运行测试
```bash
cd build/tests
ctest -C Debug --output-on-failure
```
或直接运行测试可执行文件:
```bash
build/tests/containers/Debug/xcengine_containers_tests.exe
build/tests/memory/Debug/xcengine_memory_tests.exe
build/tests/threading/Debug/xcengine_threading_tests.exe
```
## 核心模块说明
### Containers容器
- **String**: 动态字符串类,支持常用字符串操作
- **Array**: 模板动态数组,自动内存管理
- **HashMap**: 模板哈希表,支持自定义键类型
### Core核心基础
- **Types**: 基础类型别名int8、uint32 等)
- **RefCounted**: 引用计数基类,支持多线程安全释放
- **SmartPtr**: 智能指针实现Ref、UniqueRef
- **Event**: 事件系统,支持订阅/发布模式
- **FileWriter**: 文件写入工具
### Debug调试与日志
- **Logger**: 分级日志系统Info、Warning、Error
- **ConsoleLogSink**: 控制台日志输出
- **FileLogSink**: 文件日志输出
- **Profiler**: 性能分析工具
### Memory内存管理
- **IAllocator**: 内存分配器接口
- **LinearAllocator**: 线性分配器,适合帧分配
- **PoolAllocator**: 内存池分配器,适合固定大小对象
- **ProxyAllocator**: 代理分配器,跟踪内存使用统计
- **MemoryManager**: 全局内存管理器
### Threading线程
- **Thread**: 线程封装类
- **Mutex**: 互斥锁
- **SpinLock**: 自旋锁,适合短临界区
- **ReadWriteLock**: 读写锁
- **TaskSystem**: 多线程任务系统
- **Task/TaskGroup**: 任务和任务组管理
### Math数学库
- **Vector2/3/4**: 向量运算
- **Matrix3/4**: 矩阵运算
- **Quaternion**: 四元数
- **Transform**: 变换(位姿)
- **Color**: 颜色
- **Rect**: 矩形
- **Sphere/Box/Plane**: 基本几何体
- **Ray**: 射线
- **AABB/Bounds**: 包围体
- **Frustum**: 视锥体
### Resources资源管理
- **ResourceManager**: 全局资源管理器,资源加载/卸载
- **ResourceCache**: 资源缓存,支持引用计数
- **ResourceHandle**: 资源句柄,安全引用资源
- **ResourcePackage**: 资源包批量管理
- **AsyncLoader**: 异步资源加载器
- **ImportSettings**: 资源导入设置(纹理/网格/材质)
- **IResourceLoader**: 资源加载器接口
- **Texture/Mesh/Shader/Material/AudioClip**: 各类资源类型
### RHI渲染硬件接口
XCEngine 采用 RHIRender Hardware Interface抽象层设计支持多渲染后端。
#### 设计原则
- **求同存异**: 提取各 API 共同特性,统一抽象接口
- **分层抽象**: 核心抽象层 → 后端实现层 → 平台适配层
- **特性降级**: 后端不支持的特性优雅降级
- **底层逃逸**: 后端特有方法通过重载暴露
#### 抽象接口
- **RHIDevice**: 渲染设备抽象
- **RHICommandQueue**: 命令队列抽象
- **RHICommandList**: 命令列表抽象
- **RHISwapChain**: 交换链抽象
- **RHIPipelineState**: 渲染管线状态抽象
- **RHIBuffer/RHITexture**: 资源抽象
- **RHIShader**: 着色器抽象
- **RHISampler**: 采样器抽象
- **RHIFence**: 同步栅栏抽象
#### 后端实现
- **OpenGL 后端**: OpenGL 4.6+ 支持
- **D3D12 后端**: DirectX 12 支持
#### 测试覆盖
- OpenGL 后端: 41 个测试用例通过
- D3D12 后端: 编译通过
## 测试覆盖
| 模块 | 测试用例数 |
|------|-----------|
| Containers | 51+ |
| Memory | 19 |
| Threading | 13 |
| Math | 通过 |
| RHI (OpenGL) | 41 |
| RHI (D3D12) | 编译通过 |
## mvs 示例程序
mvsMultiple Version Samples展示游戏引擎的各类功能。所有示例均基于 RHI 抽象层开发,可无缝切换 DirectX 12 或 OpenGL 后端。
### HelloEarth开发中
基础的跨平台渲染示例,展示如何:
- 初始化 RHI 渲染环境(支持 D3D12/OpenGL
- 加载和渲染静态网格
- 使用几何着色器
- 纹理映射
- 常量缓冲区更新
### VolumeRenderer开发中
XCEngine 的体积渲染模块,基于 NanoVDB 实现云、烟雾等体积数据的实时渲染:
- NanoVDB 格式体积数据加载
- 光线步进Ray Marching渲染
- HDDA 空间跳跃加速
- 体积阴影Volumetric Shadow
- 动态光照参数调节
### UI Editor开发中
Unity 风格的编辑器 UI基于 ImGui 实现:
- 场景层级面板
- 属性检查器
- 游戏视图与场景视图
- 项目资源浏览器
- 控制台日志面板
## 文档
更多详细设计文档请参考 `docs/` 目录。
## 许可证
MIT License