Fork me on GitHub

UBO 与帧重叠

这段代码定义了一个名为 uniformBuffers 的数组,它包含 MAX_CONCURRENT_FRAMESUniformBuffer 对象。这种设计通常用于图形渲染中的多缓冲技术(如双缓冲或三缓冲),目的是实现帧重叠(frame overlapping)并避免资源冲突。

关键点解释:

  1. 帧重叠(Frame Overlapping)

    • 现代图形 API(如 Vulkan/DirectX 12)允许 CPU 准备下一帧的数据,同时 GPU 仍在渲染当前帧。
    • 这需要为每一帧使用独立的资源,防止 CPU 覆盖 GPU 正在使用的数据。
  2. **MAX_CONCURRENT_FRAMES**:

    • 表示系统支持的最大并行处理帧数(通常是 2 或 3)。
    • 例如:Vulkan 中常设为 VK_MAX_FRAMES_IN_FLIGHT
  3. **UniformBuffer**:

    • 存储每帧需要的统一/常量数据(如 MVP 矩阵、光照参数等)。
    • 每个活跃帧都有自己独立的 UBO,防止写入冲突。
  4. 工作流程示例

    1
    2
    3
    4
    5
    // 帧N使用它的UBO
    drawFrameN(uniformBuffers[currentFrame]);

    // 同时,CPU可以更新帧N+1的UBO
    updateUniformBuffer(uniformBuffers[(currentFrame + 1) % MAX_CONCURRENT_FRAMES]);

为什么需要这样设计?

  • 安全性:避免 GPU 读取 UBO 时被 CPU 写入破坏数据。
  • 性能:允许 CPU 和 GPU 并行工作,提高吞吐量。
  • 同步:配合栅栏(Fence)/信号量(Semaphore)实现正确的帧调度。

这是现代图形编程中实现高效资源管理的典型模式。

,