Files
XCEngine/docs/api/rhi/d3d12/d3d12-command-allocator.md

81 lines
1.9 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.
# D3D12CommandAllocator
DirectX 12 命令分配器的 D3D12 实现,封装了 `ID3D12CommandAllocator`
## 头文件
```cpp
#include <XCEngine/RHI/D3D12/D3D12CommandAllocator.h>
```
## 公共成员函数
### 构造函数与析构函数
#### `D3D12CommandAllocator()`
默认构造函数。
#### `~D3D12CommandAllocator()`
析构函数,确保调用 `Shutdown()`
### 初始化
#### `bool Initialize(ID3D12Device* device, CommandQueueType type = CommandQueueType::Direct)`
初始化命令分配器。
- `device`: D3D12 设备
- `type`: 命令类型,必须与命令列表类型匹配
- 返回: 初始化是否成功
#### `void Shutdown()`
释放命令分配器。
### 操作
#### `void Reset()`
重置命令分配器,丢弃所有已记录的指令。
#### `bool IsReady() const`
检查分配器是否准备就绪GPU 不再使用)。
### 属性
#### `ID3D12CommandAllocator* GetCommandAllocator() const`
获取底层 `ID3D12CommandAllocator` 指针。
## 内部成员
| 成员 | 类型 | 描述 |
|------|------|------|
| `m_commandAllocator` | `ComPtr<ID3D12CommandAllocator>` | D3D12 命令分配器 |
| `m_type` | `CommandQueueType` | 命令类型 |
## 使用示例
```cpp
// Create allocator
D3D12CommandAllocator allocator;
allocator.Initialize(device->GetDevice(), CommandQueueType::Direct);
// Create command list with allocator
D3D12CommandList cmdList;
cmdList.Initialize(device->GetDevice(), CommandQueueType::Direct,
allocator.GetCommandAllocator());
// Use command list...
cmdList->Close();
cmdQueue->ExecuteCommandListsInternal(1, &cmdList);
// Wait for GPU to finish
cmdQueue->WaitForIdle();
// Reset allocator for next frame
allocator.Reset();
cmdList->Reset(allocator.GetCommandAllocator(), nullptr);
```
## 备注
- 命令分配器必须在 GPU 完成所有关联命令后才能重置
- 每个帧通常有独立的命令分配器以支持帧间并行
- 命令分配器创建开销小,可以频繁创建销毁