Files
XCEngine/docs/api/rhi/d3d12/d3d12-fence.md

107 lines
2.3 KiB
Markdown

# D3D12Fence
DirectX 12 栅栏同步对象的 D3D12 实现,封装了 `ID3D12Fence`
## 头文件
```cpp
#include <XCEngine/RHI/D3D12/D3D12Fence.h>
```
## 继承关系
```
RHIFence (interface)
└── D3D12Fence (implementation)
```
## 公共成员函数
### 构造函数与析构函数
#### `D3D12Fence()`
默认构造函数。
#### `~D3D12Fence() override`
析构函数,确保调用 `Shutdown()`
### 初始化与销毁
#### `bool Initialize(ID3D12Device* device, uint64_t initialValue = 0)`
初始化栅栏。
- `device`: D3D12 设备
- `initialValue`: 初始信号值
- 返回: 初始化是否成功
#### `void Shutdown() override`
关闭栅栏并释放事件句柄。
### 信号操作
#### `void Signal() override`
发送信号,将值增加 1。
#### `void Signal(uint64_t value) override`
发送信号,设置指定值。
#### `void Wait(uint64_t value) override`
等待栅栏达到指定值。
#### `uint64_t GetCompletedValue() const override`
获取当前完成值。
#### `bool IsSignaled() const override`
检查是否已达到信号值。
#### `void* GetEventHandle()`
获取事件句柄,用于自定义等待。
### 原生接口
#### `void* GetNativeHandle() override { return m_fence.Get(); }`
#### `ID3D12Fence* GetFence() const`
获取底层 `ID3D12Fence` 指针。
## 内部成员
| 成员 | 类型 | 描述 |
|------|------|------|
| `m_fence` | `ComPtr<ID3D12Fence>` | D3D12 栅栏对象 |
| `m_eventHandle` | `void*` | 同步事件句柄 |
| `m_signalValue` | `uint64_t` | 最后信号值 |
## 使用示例
```cpp
D3D12Fence fence;
fence.Initialize(device->GetDevice());
// CPU-GPU 同步
cmdQueue->Signal(fence.GetFence(), 1);
fence.Wait(1);
// 多帧同步
uint64_t frameFenceValues[3] = {0, 0, 0};
int frameIndex = 0;
void RenderFrame() {
uint64_t fenceValue = frameIndex + 1;
cmdQueue->Signal(fence.GetFence(), fenceValue);
// Wait for this frame's previous render to complete
if (fence.GetCompletedValue() < frameFenceValues[frameIndex]) {
fence.Wait(frameFenceValues[frameIndex]);
}
frameFenceValues[frameIndex] = fenceValue;
frameIndex = (frameIndex + 1) % 3;
}
```
## 备注
- 栅栏用于 CPU-GPU 和 GPU-GPU 同步
- 事件句柄可用于 `WaitForSingleObject` 等 Win32 API
- 多帧缓冲时常用栅栏确保帧间资源安全