3.3 KiB
3.3 KiB
D3D12SwapChain
DirectX 12 交换链的 D3D12 实现,封装了 IDXGISwapChain3。
头文件
#include <XCEngine/RHI/D3D12/D3D12SwapChain.h>
继承关系
RHISwapChain (interface)
└── D3D12SwapChain (implementation)
公共成员函数
构造函数与析构函数
D3D12SwapChain()
默认构造函数。
~D3D12SwapChain() override
析构函数,确保调用 Shutdown()。
初始化
bool Initialize(IDXGIFactory4* factory, ID3D12CommandQueue* commandQueue, HWND windowHandle, uint32_t width, uint32_t height, uint32_t bufferCount = 2)
创建新的交换链。
factory: DXGI FactorycommandQueue: 命令队列windowHandle: 窗口句柄width/height: 交换链尺寸bufferCount: 后台缓冲区数量(默认 2)- 返回: 初始化是否成功
bool Initialize(IDXGISwapChain* swapChain, uint32_t width, uint32_t height)
从现有 IDXGISwapChain 初始化。
swapChain: 已存在的交换链width/height: 尺寸- 返回: 初始化是否成功
void Shutdown() override
释放交换链资源。
交换链操作
uint32_t GetCurrentBackBufferIndex() const override
获取当前后台缓冲区索引。
RHITexture* GetCurrentBackBuffer() override
获取当前后台缓冲区纹理。
D3D12Texture* GetBackBuffer(uint32_t index) const
获取指定索引的后台缓冲区。
void Present(uint32_t syncInterval = 1, uint32_t flags = 0) override
呈现(显示)内容。
syncInterval: 垂直同步间隔 (0=立即, 1-4=等待)flags: 附加标志
void Resize(uint32_t width, uint32_t height) override
调整交换链尺寸。
显示模式
void SetFullscreen(bool fullscreen) override
切换全屏模式。
bool IsFullscreen() const override
检查是否处于全屏模式。
事件处理
bool ShouldClose() const override
检查是否应该关闭(全屏时按 Alt+Enter)。
void SetShouldClose(bool shouldClose)
设置关闭标志。
void PollEvents() override
轮询窗口事件。
原生接口
void* GetNativeHandle() override
获取原生句柄。
IDXGISwapChain3* GetSwapChain() const
获取底层 IDXGISwapChain3 指针。
内部成员
| 成员 | 类型 | 描述 |
|---|---|---|
m_swapChain |
ComPtr<IDXGISwapChain3> |
DXGI 交换链 |
m_commandQueue |
ComPtr<ID3D12CommandQueue> |
命令队列引用 |
m_windowHandle |
HWND |
窗口句柄 |
m_width |
uint32_t |
宽度 |
m_height |
uint32_t |
高度 |
m_bufferCount |
uint32_t |
缓冲区数量 |
m_backBuffers |
vector<D3D12Texture> |
后台缓冲区纹理 |
使用示例
D3D12SwapChain swapChain;
swapChain.Initialize(
device->GetFactory(),
cmdQueue->GetCommandQueue(),
hwnd, 1920, 1080, 2);
// Render loop
while (!swapChain.ShouldClose()) {
swapChain.PollEvents();
auto backBuffer = swapChain.GetCurrentBackBuffer();
// Transition to render target state
// Render...
// Transition to present state
swapChain.Present(1, 0);
}
// Resize
swapChain.Resize(3840, 2160);
备注
syncInterval = 0: 立即呈现,可能产生撕裂syncInterval = 1: 等待垂直同步(推荐)- 全屏模式切换需要处理窗口消息
- 窗口尺寸改变后必须调用
Resize