52 lines
1.7 KiB
Markdown
52 lines
1.7 KiB
Markdown
|
|
# ImGuiBackendBridge
|
|||
|
|
|
|||
|
|
**命名空间**: `XCEngine::Editor::UI`
|
|||
|
|
|
|||
|
|
**类型**: `class`
|
|||
|
|
|
|||
|
|
**源文件**: `editor/src/UI/ImGuiBackendBridge.h`
|
|||
|
|
|
|||
|
|
**描述**: 封装 Dear ImGui Win32 + D3D12 backend 的初始化、逐帧驱动和窗口消息桥接。
|
|||
|
|
|
|||
|
|
## 概述
|
|||
|
|
|
|||
|
|
`ImGuiBackendBridge` 是编辑器 UI 栈里很关键但很底层的一环。
|
|||
|
|
它不创建 ImGui context,也不负责布局,而是把现有 context 接到具体平台和渲染后端上。
|
|||
|
|
|
|||
|
|
当前核心职责:
|
|||
|
|
|
|||
|
|
- 初始化 `imgui_impl_win32`
|
|||
|
|
- 初始化 `imgui_impl_dx12`
|
|||
|
|
- 每帧调用 backend 的 `NewFrame`
|
|||
|
|
- 把 `ImGui::GetDrawData()` 提交到 D3D12 command list
|
|||
|
|
- 处理 Win32 消息转发
|
|||
|
|
|
|||
|
|
## 当前实现
|
|||
|
|
|
|||
|
|
- `Initialize()` 需要 `HWND`、`ID3D12Device*` 和 SRV heap
|
|||
|
|
- 默认 frame count 为 `3`
|
|||
|
|
- 默认 back buffer format 为 `DXGI_FORMAT_R8G8B8A8_UNORM`
|
|||
|
|
- `HandleWindowMessage()` 是静态 helper,直接转发给 `ImGui_ImplWin32_WndProcHandler`
|
|||
|
|
|
|||
|
|
## 设计说明
|
|||
|
|
|
|||
|
|
把 backend 绑定层单独抽出来,有两个很现实的好处:
|
|||
|
|
|
|||
|
|
- `Application` 不需要直接依赖第三方 backend 细节
|
|||
|
|
- 如果未来替换成别的渲染后端或宿主窗口层,修改点更集中
|
|||
|
|
|
|||
|
|
在商业级编辑器里,这一层通常都存在,即使名字不同,本质上也是“UI 平台绑定桥”。
|
|||
|
|
|
|||
|
|
## 当前限制
|
|||
|
|
|
|||
|
|
- 当前明确绑定 Win32 + D3D12
|
|||
|
|
- 没有重复初始化保护之外的更复杂状态机
|
|||
|
|
- 不负责 ImGui context 生命周期,那部分由 [`ImGuiSession`](../ImGuiSession/ImGuiSession.md) 管理
|
|||
|
|
|
|||
|
|
## 相关文档
|
|||
|
|
|
|||
|
|
- [UI](../UI.md)
|
|||
|
|
- [ImGuiSession](../ImGuiSession/ImGuiSession.md)
|
|||
|
|
- [Application](../../Application/Application.md)
|
|||
|
|
- [D3D12WindowRenderer](../../Platform/D3D12WindowRenderer/D3D12WindowRenderer.md)
|