2026/4/18小于 1 分钟
线程安全的无锁命令分配器池,继承自 CommandPoolBase。
设计
template <D3D12_COMMAND_LIST_TYPE Type>
class CommandAllocatorPool : public CommandPoolBase {
Handle Acquire(uint64_t currentGpuCompletedValue) override;
void Release(const Handle& handle) override;
void ReleaseWithFence(const Handle& handle, uint64_t fenceValue);
Allocator* GetAllocator(size_t index);
Stats GetStats() const;
};
2026年5月10日小于 1 分钟
线程安全的命令列表池,支持快速获取/释放。
CommandList
命令列表封装类,作为 ID3D12GraphicsCommandList 的句柄:
class CommandList {
CommandList();
explicit CommandList(ID3D12GraphicsCommandList* cmdList);
ID3D12GraphicsCommandList* Get() const;
bool IsValid() const;
void Reset(ID3D12CommandAllocator* pAllocator, ID3D12PipelineState* pInitialState);
void Close();
void ResourceBarrier(UINT NumBarriers, const D3D12_RESOURCE_BARRIER* pBarriers);
void DrawInstanced(UINT VertexCountPerInstance, UINT InstanceCount, UINT StartVertexLocation, UINT StartInstanceLocation);
void SetPipelineState(ID3D12PipelineState* pPipelineState);
void SetComputeRootSignature(ID3D12RootSignature* pRootSignature);
void Dispatch(UINT ThreadGroupCountX, UINT ThreadGroupCountY, UINT ThreadGroupCountZ);
};
2026年5月9日小于 1 分钟
命令系统中枢,负责协调所有命令系统组件。
职责
- 管理三种类型(Graphics/Compute/Copy)的命令队列、分配器池、命令列表池
- 提供工作线程接口:获取序号、申请/释放资源、提交命令
- 提供主线程接口:帧边界同步、批量回收资源
- 管理帧围栏值,支持三缓冲或多缓冲模式
设计
使用 std::unordered_map 统一管理三种类型的池:
class CommandManager {
// 统一句柄类型
using AllocatorHandle = CommandPoolBase::Handle;
using CommandListHandle = CommandPoolBase::Handle;
private:
std::unordered_map<D3D12_COMMAND_LIST_TYPE, std::unique_ptr<CommandQueue>> m_queues;
std::unordered_map<D3D12_COMMAND_LIST_TYPE, std::unique_ptr<CommandPoolBase>> m_allocatorPools;
std::unordered_map<D3D12_COMMAND_LIST_TYPE, std::unique_ptr<CommandPoolBase>> m_commandListPools;
};
2026年5月9日大约 2 分钟
命令队列封装,负责提交命令到 GPU。
职责
命令队列是 GPU 执行通道,是命令的最终目的地。现代 GPU 支持三种队列类型:
| 队列类型 | 能执行的命令 | 典型用途 |
|---|---|---|
| Graphics | Draw、Dispatch、Copy、Clear | 主渲染 |
| Compute | Dispatch、Copy、Clear | 计算着色器、后处理 |
| Copy | Copy、Clear | 资源上传、纹理拷贝 |
2026年5月9日小于 1 分钟
用于安全进行 DX12 异步命令提交的命令系统。
目录结构
Renderer/Core/Command/
├── CommandManager.h # 命令系统中枢
├── CommandQueue.h # 命令队列封装
├── Allocator/
│ ├── CommandAllocator.h # 命令分配器
│ └── CommandAllocatorPool.h # 命令分配器池
├── CommandList/
│ ├── CommandList.h # 命令列表封装
│ └── CommandListPool.h # 命令列表池
└── Fence/
├── Fence.h # 围栏对象
└── FenceManager.h # 围栏管理器
2026年5月9日大约 1 分钟
Fence - 极简围栏资源包装
设计原则:无状态、无行为,仅作为 DX12 原生资源的 RAII 容器。
class Fence {
explicit Fence(ID3D12Device* device, uint64_t initialValue = 0);
~Fence();
// 禁止拷贝和移动
Fence(const Fence&) = delete;
Fence& operator=(const Fence&) = delete;
Fence(Fence&&) = delete;
Fence& operator=(Fence&&) = delete;
// 访问器
ID3D12Fence* Get() const;
HANDLE GetEventHandle() const;
};
2026年5月9日大约 1 分钟
调度层负责构建 DAG(依赖图),决定任务的执行顺序和并行策略。
两种执行范式对比
| 维度 | 静态流水线(The Pipeline) | 动态事件(The EDA) |
|---|---|---|
| 对应层级 | L3 调度层(DAG)+ L2 数据层(Systems) | L1 通信层(Message Arena) |
| 典型场景 | Input → Physics → Animation → Logic → Render | 资源加载完成、网络包到达、玩家输入 |
| 依赖方式 | 硬编码依赖(Hard Dependency)task_A.then(task_B) |
软依赖(Loose Coupling)subscribe("ResourceLoaded") |
| 实现机制 | 原子计数/信号量(纳秒级) 无需查表,无需内存分配 |
消息总线/观察者模式(微秒级) 涉及锁、哈希查找、内存分配 |
| 冲突解决 | 编译期/初始化期规划 通过分片(Sharding)或强制串行 |
运行时处理 通过事件队列排队 |
2026年5月2日大约 5 分钟
管理连续大块内存的内存分配器。
概述
- 管理大块连续内存(64MB+)
- 提供
Allocate(size, align)和Free(ptr)接口 - 不关心存储内容类型,不关心调用者身份
成员变量
| 成员 | 类型 | 说明 |
|---|---|---|
m_memoryBase |
void* |
物理内存起始地址 |
m_totalSize |
size_t |
池总大小(如 256MB/512MB) |
m_strategy |
AllocatorStrategy |
分配算法(Bitmap/Linear/Buddy) |
m_poolID |
uint8_t |
逻辑 ID,对应 Handle 中 4-bit ID |
m_name |
std::string |
调试名称(如 "Texture_Streaming_Pool") |
2026年4月30日大约 2 分钟
真正的状态池,存储句柄元数据。
职责
- 管理生命周期:生成 Handle,维护 Generation 防止 ABA
- 存储元数据:State (Loading/Ready), Type (Mesh/Texture), RefCount
- 存储物理指针:维护 DataPtr 数组,指向 DataPool 中的物理内存
内存布局
采用 SoA 布局,每个字段独立数组并按 Cache Line (64B) 对齐:
| 数组 | 类型 | 说明 |
|---|---|---|
| Type Buffer | ResourceType[] |
资源类型 |
| State Buffer | ResourceState[] |
当前状态 |
| Generation Buffer | uint32_t[] |
版本号(ABA 防护) |
| DataPtr Buffer | uint64_t[] |
指向 DataPool 的指针 |
| Valid Buffer | bool[] |
槽位有效性 |
2026年4月30日小于 1 分钟

