SDL3_API分类参考_GPU(CategoryGPU)

2026-3-6 / 0 评论 / 3 阅读

GPU 子系统(CategoryGPU)

SDL GPU API 提供了跨平台的现代图形硬件交互方式,支持 3D 图形渲染和计算功能,设计风格对标 Metal、Vulkan 和 Direct3D 12。

基础工作流程

  1. 设备初始化:应用通过 SDL_CreateGPUDevice() 创建 GPU 设备,并使用 SDL_ClaimWindowForGPUDevice() 将设备关联到窗口(也可完全离屏渲染,如仅做图像处理);
  2. 静态资源准备(创建一次,重复使用):
    • 着色器(GPU 执行的程序):SDL_CreateGPUShader()
    • 顶点缓冲区(几何数据)及其他渲染数据:SDL_CreateGPUBuffer() + SDL_UploadToGPUBuffer()
    • 纹理(图像):SDL_CreateGPUTexture() + SDL_UploadToGPUTexture()
    • 采样器(纹理读取方式):SDL_CreateGPUSampler()
    • 渲染管线(预计算的渲染状态):SDL_CreateGPUGraphicsPipeline()
  3. 命令缓冲区创建:通过 SDL_AcquireGPUCommandBuffer() 创建一个/多个命令缓冲区,用于批量收集渲染指令(复杂场景可多线程并行创建,按序提交);
  4. 渲染目标准备
    • 渲染到纹理(其他 API 称“渲染目标”);
    • 渲染到交换链纹理(窗口内容的特殊纹理):SDL_WaitAndAcquireGPUSwapchainTexture()
  5. 渲染通道编码
    • 开始渲染通道:SDL_BeginGPURenderPass()
    • 设置渲染状态(管线、视口、顶点缓冲区等);
    • 执行绘制命令(SDL_DrawGPUPrimitives() 等);
    • 结束渲染通道:SDL_EndGPURenderPass()(结束后重置所有渲染状态);
  6. 命令提交SDL_SubmitGPUCommandBuffer() 将命令缓冲区提交给 GPU 执行;
  7. 数据回读(可选):通过 SDL_DownloadFromGPUTexture()/SDL_DownloadFromGPUBuffer() 读取 GPU 数据,配合 SDL_SubmitGPUCommandBufferAndAcquireFence() 获取围栏(Fence),等待 GPU 操作完成后安全读取数据。

计算功能支持

  1. 开始计算通道:SDL_BeginGPUComputePass()(指定可写入的纹理/缓冲区);
  2. 设置计算状态(计算管线、存储缓冲区/纹理等);
  3. 分发计算任务:SDL_DispatchGPUCompute()
  4. 结束计算通道:SDL_EndGPUComputePass()

着色器说明

不同底层后端(Vulkan/Metal/D3D12)需要不同的着色器格式:

  • 创建 GPU 设备时,应用声明支持的着色器格式,SDL 自动选择适配的后端;
  • 建议预编译着色器,也可使用 SDL_shadercross 实现运行时跨编译;
  • 着色器资源布局需严格匹配 API 要求,否则会导致着色器失效。

适用场景

  • 简单 2D 图形:优先使用 Render API(更易用,仍硬件加速);
  • 高性能/复杂渲染:使用 GPU API(2D 应用也能获得显著性能提升);
  • GPU 计算:如图像处理、物理模拟等并行计算场景。

性能优化建议

  1. 减少渲染通道数量(开始新通道开销较高);
  2. 最小化状态切换(如管线绑定);
  3. 尽早完成帧内数据上传;
  4. 缓存资源(创建/释放资源开销大);
  5. 大量数据使用存储缓冲区(而非统一缓冲区);
  6. 正确使用“循环(Cycling)”机制;
  7. 使用裁剪技术减少像素写入。

坐标系

GPU API 采用左手坐标系(对齐 D3D12/Metal 规范):

  • 归一化设备坐标(NDC):左下角 (-1.0, -1.0),右上角 (1.0, 1.0),Z 值范围 [0.0, 1.0](0 为近裁剪面);
  • 视口坐标:左上角 (0, 0),右下角 (viewportWidth, viewportHeight),+Y 向下;
  • 纹理坐标:左上角 (0, 0),右下角 (1.0, 1.0),+Y 向下;
  • SDL 自动适配 Vulkan 等不同坐标系的后端,无需在着色器中翻转坐标。

循环(Cycling)机制

  • 命令缓冲区提交后操作并非立即执行,资源在使用期间处于“绑定”状态;
  • 所有写入资源的函数/结构体均有 cycle 布尔参数,开启后自动切换到未绑定的内部资源(无可用资源时创建新资源);
  • 避免手动跟踪资源状态和同步,防止数据依赖和覆盖;
  • 循环后资源数据视为未定义,需重新写入后再读取。

调试工具

  • Windows/Linux:RenderDoc(可视化 GPU 帧、绘制调用、资源);
  • macOS:Xcode 内置 Metal 调试器(GPU Frame Capture);
  • 后端调试层
    • D3D12:安装“Graphics Tools”可选功能;
    • Vulkan:安装 Vulkan SDK/验证层;
    • Metal:Xcode 运行自动输出详细错误。

函数

  • SDL_AcquireGPUCommandBuffer:获取GPU命令缓冲区(用于编码渲染/计算指令)
  • SDL_AcquireGPUSwapchainTexture:获取交换链纹理(非阻塞,可能返回NULL)
  • SDL_BeginGPUComputePass:开始计算通道(设置可写入的存储纹理/缓冲区)
  • SDL_BeginGPUCopyPass:开始拷贝通道(用于GPU内资源拷贝)
  • SDL_BeginGPURenderPass:开始渲染通道(指定颜色/深度目标)
  • SDL_BindGPUComputePipeline:绑定计算管线到当前计算通道
  • SDL_BindGPUComputeSamplers:绑定计算阶段使用的采样器
  • SDL_BindGPUComputeStorageBuffers:绑定计算阶段的存储缓冲区
  • SDL_BindGPUComputeStorageTextures:绑定计算阶段的存储纹理
  • SDL_BindGPUFragmentSamplers:绑定片段着色器阶段的采样器
  • SDL_BindGPUFragmentStorageBuffers:绑定片段着色器的存储缓冲区
  • SDL_BindGPUFragmentStorageTextures:绑定片段着色器的存储纹理
  • SDL_BindGPUGraphicsPipeline:绑定图形渲染管线到当前渲染通道
  • SDL_BindGPUIndexBuffer:绑定索引缓冲区
  • SDL_BindGPUVertexBuffers:绑定顶点缓冲区数组
  • SDL_BindGPUVertexSamplers:绑定顶点着色器阶段的采样器
  • SDL_BindGPUVertexStorageBuffers:绑定顶点着色器的存储缓冲区
  • SDL_BindGPUVertexStorageTextures:绑定顶点着色器的存储纹理
  • SDL_BlitGPUTexture:GPU纹理拷贝(二维矩形区域复制)
  • SDL_CalculateGPUTextureFormatSize:计算指定格式/尺寸的纹理内存大小
  • SDL_CancelGPUCommandBuffer:取消未提交的命令缓冲区(释放资源)
  • SDL_ClaimWindowForGPUDevice:将窗口关联到GPU设备(创建交换链)
  • SDL_CopyGPUBufferToBuffer:GPU缓冲区间拷贝
  • SDL_CopyGPUTextureToTexture:GPU纹理间拷贝
  • SDL_CreateGPUBuffer:创建GPU缓冲区(顶点/索引/存储数据)
  • SDL_CreateGPUComputePipeline:创建计算管线(关联计算着色器)
  • SDL_CreateGPUDevice:创建GPU设备(指定驱动/配置)
  • SDL_CreateGPUDeviceWithProperties:带属性创建GPU设备(精细控制)
  • SDL_CreateGPUGraphicsPipeline:创建图形渲染管线(关联顶点/片段着色器)
  • SDL_CreateGPUSampler:创建采样器(定义纹理采样方式)
  • SDL_CreateGPUShader:创建着色器(顶点/片段/计算着色器)
  • SDL_CreateGPUTexture:创建GPU纹理(2D/3D/立方体贴图等)
  • SDL_CreateGPUTransferBuffer:创建传输缓冲区(CPU-GPU数据交换)
  • SDL_DestroyGPUDevice:销毁GPU设备(释放所有关联资源)
  • SDL_DispatchGPUCompute:分发计算任务(指定线程组数量)
  • SDL_DispatchGPUComputeIndirect:间接分发计算任务(从缓冲区读取参数)
  • SDL_DownloadFromGPUBuffer:从GPU缓冲区下载数据到CPU
  • SDL_DownloadFromGPUTexture:从GPU纹理下载数据到CPU
  • SDL_DrawGPUIndexedPrimitives:绘制索引化图元(三角形/线等)
  • SDL_DrawGPUIndexedPrimitivesIndirect:间接绘制索引化图元
  • SDL_DrawGPUPrimitives:绘制非索引化图元
  • SDL_DrawGPUPrimitivesIndirect:间接绘制非索引化图元
  • SDL_EndGPUComputePass:结束计算通道
  • SDL_EndGPUCopyPass:结束拷贝通道
  • SDL_EndGPURenderPass:结束渲染通道(重置渲染状态)
  • SDL_GDKResumeGPU:GDK平台恢复GPU(Xbox)
  • SDL_GDKSuspendGPU:GDK平台暂停GPU(Xbox)
  • SDL_GenerateMipmapsForGPUTexture:为GPU纹理生成Mipmap
  • SDL_GetGPUDeviceDriver:获取GPU设备使用的驱动名称
  • SDL_GetGPUDeviceProperties:获取GPU设备属性(功能支持/限制)
  • SDL_GetGPUDriver:获取指定索引的GPU驱动名称
  • SDL_GetGPUShaderFormats:获取GPU设备支持的着色器格式
  • SDL_GetGPUSwapchainTextureFormat:获取交换链纹理的格式
  • SDL_GetGPUTextureFormatFromPixelFormat:像素格式转GPU纹理格式
  • SDL_GetNumGPUDrivers:获取系统可用的GPU驱动数量
  • SDL_GetPixelFormatFromGPUTextureFormat:GPU纹理格式转像素格式
  • SDL_GPUSupportsProperties:检查GPU设备是否支持指定属性
  • SDL_GPUSupportsShaderFormats:检查GPU设备是否支持指定着色器格式
  • SDL_GPUTextureFormatTexelBlockSize:计算纹理格式的纹素块大小
  • SDL_GPUTextureSupportsFormat:检查GPU是否支持指定纹理格式
  • SDL_GPUTextureSupportsSampleCount:检查纹理是否支持指定采样数
  • SDL_InsertGPUDebugLabel:插入GPU调试标签(辅助调试工具定位)
  • SDL_MapGPUTransferBuffer:映射传输缓冲区到CPU地址空间
  • SDL_PopGPUDebugGroup:弹出GPU调试分组
  • SDL_PushGPUComputeUniformData:推送计算着色器的统一数据
  • SDL_PushGPUDebugGroup:推送GPU调试分组(组织调试标签)
  • SDL_PushGPUFragmentUniformData:推送片段着色器的统一数据
  • SDL_PushGPUVertexUniformData:推送顶点着色器的统一数据
  • SDL_QueryGPUFence:查询GPU围栏状态(完成/未完成)
  • SDL_ReleaseGPUBuffer:释放GPU缓冲区
  • SDL_ReleaseGPUComputePipeline:释放计算管线
  • SDL_ReleaseGPUFence:释放GPU围栏
  • SDL_ReleaseGPUGraphicsPipeline:释放图形渲染管线
  • SDL_ReleaseGPUSampler:释放采样器
  • SDL_ReleaseGPUShader:释放着色器
  • SDL_ReleaseGPUTexture:释放GPU纹理
  • SDL_ReleaseGPUTransferBuffer:释放传输缓冲区
  • SDL_ReleaseWindowFromGPUDevice:解除窗口与GPU设备的关联
  • SDL_SetGPUAllowedFramesInFlight:设置允许的在飞帧数(并发帧数量)
  • SDL_SetGPUBlendConstants:设置混合常量(用于颜色混合计算)
  • SDL_SetGPUBufferName:设置GPU缓冲区名称(调试用)
  • SDL_SetGPUScissor:设置裁剪矩形(限制像素绘制区域)
  • SDL_SetGPUStencilReference:设置模板测试参考值
  • SDL_SetGPUSwapchainParameters:设置交换链参数(刷新率/呈现模式)
  • SDL_SetGPUTextureName:设置GPU纹理名称(调试用)
  • SDL_SetGPUViewport:设置视口(渲染输出区域)
  • SDL_SubmitGPUCommandBuffer:提交命令缓冲区到GPU执行
  • SDL_SubmitGPUCommandBufferAndAcquireFence:提交命令缓冲区并获取围栏
  • SDL_UnmapGPUTransferBuffer:解除传输缓冲区的CPU映射
  • SDL_UploadToGPUBuffer:从CPU上传数据到GPU缓冲区
  • SDL_UploadToGPUTexture:从CPU上传数据到GPU纹理
  • SDL_WaitAndAcquireGPUSwapchainTexture:等待并获取交换链纹理(阻塞)
  • SDL_WaitForGPUFences:等待多个GPU围栏完成
  • SDL_WaitForGPUIdle:等待GPU完成所有待处理命令
  • SDL_WaitForGPUSwapchain:等待交换链就绪
  • SDL_WindowSupportsGPUPresentMode:检查窗口是否支持指定呈现模式
  • SDL_WindowSupportsGPUSwapchainComposition:检查窗口是否支持交换链合成

数据类型

  • SDL_GPUBuffer:GPU缓冲区句柄类型(顶点/索引/存储数据)
  • SDL_GPUBufferUsageFlags:GPU缓冲区使用标志(顶点/索引/存储等)
  • SDL_GPUColorComponentFlags:颜色组件标志(R/G/B/A通道)
  • SDL_GPUCommandBuffer:GPU命令缓冲区句柄(存储渲染/计算指令)
  • SDL_GPUComputePass:计算通道句柄
  • SDL_GPUComputePipeline:计算管线句柄
  • SDL_GPUCopyPass:拷贝通道句柄
  • SDL_GPUDevice:GPU设备句柄(核心设备对象)
  • SDL_GPUFence:GPU围栏句柄(同步CPU/GPU操作)
  • SDL_GPUGraphicsPipeline:图形渲染管线句柄
  • SDL_GPURenderPass:渲染通道句柄
  • SDL_GPUSampler:采样器句柄(纹理采样配置)
  • SDL_GPUShader:着色器句柄(顶点/片段/计算着色器)
  • SDL_GPUShaderFormat:着色器格式枚举(SPIR-V/Metal/DXIL等)
  • SDL_GPUTexture:GPU纹理句柄(2D/3D/立方体贴图)
  • SDL_GPUTextureUsageFlags:GPU纹理使用标志(采样/渲染目标/存储等)
  • SDL_GPUTransferBuffer:传输缓冲区句柄(CPU-GPU数据交换)

结构体

  • SDL_GPUBlitInfo:纹理拷贝信息(源/目标区域、过滤方式)
  • SDL_GPUBlitRegion:纹理拷贝区域(坐标/尺寸)
  • SDL_GPUBufferBinding:缓冲区绑定信息(缓冲区/偏移/范围)
  • SDL_GPUBufferCreateInfo:GPU缓冲区创建参数(大小/使用标志)
  • SDL_GPUBufferLocation:缓冲区位置(缓冲区/偏移量)
  • SDL_GPUBufferRegion:缓冲区区域(偏移/大小)
  • SDL_GPUColorTargetBlendState:颜色目标混合状态(混合因子/操作)
  • SDL_GPUColorTargetDescription:颜色目标描述(格式/样本数)
  • SDL_GPUColorTargetInfo:颜色目标信息(纹理/加载/存储操作)
  • SDL_GPUComputePipelineCreateInfo:计算管线创建参数(着色器/布局)
  • SDL_GPUDepthStencilState:深度模板状态(测试/操作)
  • SDL_GPUDepthStencilTargetInfo:深度模板目标信息(纹理/操作)
  • SDL_GPUGraphicsPipelineCreateInfo:图形管线创建参数(着色器/顶点状态等)
  • SDL_GPUGraphicsPipelineTargetInfo:图形管线目标信息(颜色/深度格式)
  • SDL_GPUIndexedIndirectDrawCommand:索引化间接绘制命令(参数)
  • SDL_GPUIndirectDispatchCommand:间接计算分发命令(线程组数量)
  • SDL_GPUIndirectDrawCommand:间接绘制命令(顶点数/实例数等)
  • SDL_GPUMultisampleState:多重采样状态(采样数/质量)
  • SDL_GPURasterizerState:光栅化状态(裁剪/填充/视口等)
  • SDL_GPUSamplerCreateInfo:采样器创建参数(过滤/寻址模式)
  • SDL_GPUShaderCreateInfo:着色器创建参数(类型/格式/资源布局)
  • SDL_GPUStencilOpState:模板操作状态(失败/通过/深度失败操作)
  • SDL_GPUStorageBufferReadWriteBinding:存储缓冲区读写绑定
  • SDL_GPUStorageTextureReadWriteBinding:存储纹理读写绑定
  • SDL_GPUTextureCreateInfo:纹理创建参数(格式/尺寸/使用标志)
  • SDL_GPUTextureLocation:纹理位置(纹理/层级/切片)
  • SDL_GPUTextureRegion:纹理区域(坐标/尺寸/层级)
  • SDL_GPUTextureSamplerBinding:纹理采样器绑定(纹理/采样器)
  • SDL_GPUTextureTransferInfo:纹理传输信息(格式/布局/行间距)
  • SDL_GPUTransferBufferCreateInfo:传输缓冲区创建参数(大小/使用方式)
  • SDL_GPUTransferBufferLocation:传输缓冲区位置(缓冲区/偏移)
  • SDL_GPUVertexAttribute:顶点属性(格式/偏移/绑定点)
  • SDL_GPUVertexBufferDescription:顶点缓冲区描述(格式/步长)
  • SDL_GPUVertexInputState:顶点输入状态(属性/缓冲区描述)
  • SDL_GPUViewport:视口参数(坐标/尺寸/深度范围)
  • SDL_GPUVulkanOptions:Vulkan后端选项(实例/设备扩展)

枚举

  • SDL_GPUBlendFactor:混合因子(源/目标混合值计算方式)
  • SDL_GPUBlendOp:混合操作(加法/减法/最小值等)
  • SDL_GPUCompareOp:比较操作(小于/等于/大于等,用于深度/模板测试)
  • SDL_GPUCubeMapFace:立方体贴图面(正/负X/Y/Z轴)
  • SDL_GPUCullMode:裁剪模式(无/前/后向三角形裁剪)
  • SDL_GPUFillMode:填充模式(线框/实心)
  • SDL_GPUFilter:过滤模式(最近邻/线性/各向异性)
  • SDL_GPUFrontFace:正面朝向(顺时针/逆时针)
  • SDL_GPUIndexElementSize:索引元素大小(16/32位)
  • SDL_GPULoadOp:加载操作(清除/加载/不操作,渲染目标初始状态)
  • SDL_GPUPresentMode:呈现模式(立即/邮箱/双缓冲等)
  • SDL_GPUPrimitiveType:图元类型(点/线/三角形/带/扇等)
  • SDL_GPUSampleCount:采样数(1/2/4/8/16等,多重采样)
  • SDL_GPUSamplerAddressMode:采样器寻址模式(重复/镜像/钳位等)
  • SDL_GPUSamplerMipmapMode:采样器Mipmap模式(最近邻/线性)
  • SDL_GPUShaderStage:着色器阶段(顶点/片段/计算)
  • SDL_GPUStencilOp:模板操作(保持/替换/递增/递减等)
  • SDL_GPUStoreOp:存储操作(存储/不操作,渲染目标最终状态)
  • SDL_GPUSwapchainComposition:交换链合成模式(硬件/软件)
  • SDL_GPUTextureFormat:GPU纹理格式(RGBA8/RGBA16F/深度模板等)
  • SDL_GPUTextureType:纹理类型(2D/3D/立方体贴图/数组等)
  • SDL_GPUTransferBufferUsage:传输缓冲区使用方式(上传/下载/双向)
  • SDL_GPUVertexElementFormat:顶点元素格式(float2/float3/int4等)
  • SDL_GPUVertexInputRate:顶点输入速率(顶点/实例)

  • (无)

FreeBASIC 示例代码

' 引入 SDL 相关声明(需确保 FreeBASIC 已链接 SDL3 库,且启用 GPU 支持)
#Include "SDL.bi"

' 全局变量
Dim Shared As SDL_Window Ptr g_window = NULL
Dim Shared As SDL_GPUDevice Ptr g_gpuDevice = NULL
Dim Shared As SDL_GPUTexture Ptr g_swapchainTexture = NULL
Dim Shared As SDL_GPUCommandBuffer Ptr g_cmdBuffer = NULL

' 初始化 GPU 环境
Function InitGPU() As Boolean
    ' 1. 创建窗口
    g_window = SDL_CreateWindow("SDL GPU Example", 800, 600, 0)
    If (g_window = NULL) Then
        SDL_LogError(SDL_LOG_CATEGORY_VIDEO, "创建窗口失败:%s", SDL_GetError())
        Return False
    End If

    ' 2. 创建 GPU 设备(使用默认驱动)
    g_gpuDevice = SDL_CreateGPUDevice(NULL)
    If (g_gpuDevice = NULL) Then
        SDL_LogError(SDL_LOG_CATEGORY_RENDER, "创建 GPU 设备失败:%s", SDL_GetError())
        SDL_DestroyWindow(g_window)
        Return False
    End If

    ' 3. 将窗口关联到 GPU 设备
    If (SDL_ClaimWindowForGPUDevice(g_gpuDevice, g_window) < 0) Then
        SDL_LogError(SDL_LOG_CATEGORY_RENDER, "关联窗口失败:%s", SDL_GetError())
        SDL_DestroyGPUDevice(g_gpuDevice)
        SDL_DestroyWindow(g_window)
        Return False
    End If

    ' 4. 获取命令缓冲区
    g_cmdBuffer = SDL_AcquireGPUCommandBuffer(g_gpuDevice)
    If (g_cmdBuffer = NULL) Then
        SDL_LogError(SDL_LOG_CATEGORY_RENDER, "获取命令缓冲区失败:%s", SDL_GetError())
        SDL_ReleaseWindowFromGPUDevice(g_gpuDevice, g_window)
        SDL_DestroyGPUDevice(g_gpuDevice)
        SDL_DestroyWindow(g_window)
        Return False
    End If

    SDL_LogInfo(SDL_LOG_CATEGORY_RENDER, "GPU 环境初始化成功")
    Return True
End Function

' 渲染一帧
Sub RenderFrame()
    ' 1. 等待并获取交换链纹理
    g_swapchainTexture = SDL_WaitAndAcquireGPUSwapchainTexture(g_gpuDevice, g_window, True)
    If (g_swapchainTexture = NULL) Then
        SDL_LogError(SDL_LOG_CATEGORY_RENDER, "获取交换链纹理失败:%s", SDL_GetError())
        Return
    End If

    ' 2. 定义渲染目标(交换链纹理)
    Dim As SDL_GPUColorTargetInfo colorTarget
    SDL_memset(@colorTarget, 0, SizeOf(SDL_GPUColorTargetInfo))
    colorTarget.texture = g_swapchainTexture
    colorTarget.load_op = SDL_GPU_LOAD_OP_CLEAR
    colorTarget.store_op = SDL_GPU_STORE_OP_STORE
    colorTarget.clear_color[0] = 0.2 ' R
    colorTarget.clear_color[1] = 0.3 ' G
    colorTarget.clear_color[2] = 0.4 ' B
    colorTarget.clear_color[3] = 1.0 ' A
    colorTarget.cycle = True ' 启用循环

    ' 3. 开始渲染通道
    Dim As SDL_GPURenderPass Ptr renderPass = SDL_BeginGPURenderPass( _
        g_cmdBuffer, _
        @colorTarget, 1, _
        NULL, _
        0, 0, 0, 0 _
    )

    If (renderPass = NULL) Then
        SDL_LogError(SDL_LOG_CATEGORY_RENDER, "开始渲染通道失败:%s", SDL_GetError())
        Return
    End If

    ' 4. 设置视口
    Dim As SDL_GPUViewport viewport
    viewport.x = 0
    viewport.y = 0
    viewport.width = 800
    viewport.height = 600
    viewport.min_depth = 0.0
    viewport.max_depth = 1.0
    SDL_SetGPUViewport(g_cmdBuffer, @viewport)

    ' 5. 此处可添加绘制命令(三角形/纹理等)

    ' 6. 结束渲染通道
    SDL_EndGPURenderPass(renderPass)

    ' 7. 提交命令缓冲区
    If (SDL_SubmitGPUCommandBuffer(g_cmdBuffer) < 0) Then
        SDL_LogError(SDL_LOG_CATEGORY_RENDER, "提交命令缓冲区失败:%s", SDL_GetError())
        Return
    End If

    SDL_LogInfo(SDL_LOG_CATEGORY_RENDER, "帧渲染完成")
End Sub

' 清理 GPU 资源
Sub CleanupGPU()
    If (g_cmdBuffer <> NULL) Then
        SDL_CancelGPUCommandBuffer(g_cmdBuffer)
        g_cmdBuffer = NULL
    End If

    If (g_gpuDevice <> NULL) Then
        SDL_ReleaseWindowFromGPUDevice(g_gpuDevice, g_window)
        SDL_DestroyGPUDevice(g_gpuDevice)
        g_gpuDevice = NULL
    End If

    If (g_window <> NULL) Then
        SDL_DestroyWindow(g_window)
        g_window = NULL
    End If

    SDL_LogInfo(SDL_LOG_CATEGORY_RENDER, "GPU 资源清理完成")
End Sub

' 主程序
Sub Main()
    ' 初始化 SDL
    If (SDL_Init(SDL_INIT_VIDEO) < 0) Then
        SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "SDL 初始化失败:%s", SDL_GetError())
        Exit Sub
    End If

    ' 初始化 GPU
    If (Not InitGPU()) Then
        SDL_Quit()
        Exit Sub
    End If

    ' 主循环
    Dim As Boolean running = True
    Dim As SDL_Event evt

    SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION, "开始主循环(按ESC退出)")

    While (running)
        ' 处理事件
        While (SDL_PollEvent(@evt))
            Select Case evt.type
                Case SDL_EVENT_QUIT
                    running = False
                Case SDL_EVENT_KEY_DOWN
                    If (evt.key.keysym.sym = SDLK_ESCAPE) Then
                        running = False
                    End If
            End Select
        Wend

        ' 渲染帧
        RenderFrame()

        ' 短暂延迟
        SDL_Delay(16)
    Wend

    ' 清理资源
    CleanupGPU()

    ' 退出 SDL
    SDL_Quit()

    SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION, "程序正常退出")
End Sub

' 运行主程序
Main()

核心知识点补充

  1. GPU 资源生命周期

    • 设备(Device):核心对象,所有资源关联到设备;
    • 管线(Pipeline):预编译的渲染/计算状态,创建后可重复使用;
    • 命令缓冲区(CommandBuffer):一次性使用,提交后需重新获取;
    • 围栏(Fence):CPU/GPU 同步关键,用于等待 GPU 操作完成。
  2. 渲染通道关键参数

    • load_op:渲染前对目标的操作(CLEAR/LOAD/DONT_CARE);
    • store_op:渲染后对目标的操作(STORE/DONT_CARE);
    • cycle:启用后自动切换内部资源,避免帧间数据依赖。
  3. 跨平台注意事项

    • Vulkan:需 Vulkan 1.0+ 及指定扩展,Android 可通过属性降低要求;
    • D3D12:仅支持 Win10+,Xbox GDK,Feature Level 11_0+;
    • Metal:macOS 10.14+/iOS 13.0+,Apple Silicon/Intel GPU Family 2。
  4. 常见问题排查

    • 黑屏:检查交换链纹理获取、渲染通道创建、视口设置;
    • 着色器失效:检查资源布局、统一数据推送、着色器格式;
    • 性能差:减少渲染通道/状态切换,启用循环,优化数据上传。

总结

  1. 核心优势

    • 跨平台统一的现代 GPU 接口,对齐 Vulkan/Metal/D3D12 设计;
    • 支持图形渲染和 GPU 计算,兼顾高性能和灵活性;
    • 逻辑抽象(如循环机制)简化资源管理和同步;
    • 自动适配不同坐标系和后端特性,降低跨平台开发成本。
  2. 使用建议

    • 简单 2D 场景优先使用 Render API,复杂场景/高性能需求使用 GPU API;
    • 预创建并缓存管线、缓冲区、纹理等资源,避免运行时频繁创建;
    • 启用 cycle 参数简化资源同步,避免手动状态跟踪;
    • 利用调试工具(RenderDoc/Xcode)定位渲染问题,而非仅依赖日志。
  3. 关键接口

    • 设备管理:SDL_CreateGPUDevice()/SDL_DestroyGPUDevice()
    • 资源创建:SDL_CreateGPUBuffer()/SDL_CreateGPUTexture()/SDL_CreateGPUShader()
    • 命令编码:SDL_BeginGPURenderPass()/SDL_DrawGPUPrimitives()/SDL_EndGPURenderPass()
    • 命令提交:SDL_SubmitGPUCommandBuffer()
    • 同步:SDL_SubmitGPUCommandBufferAndAcquireFence()/SDL_WaitForGPUFences()

评论一下?

OωO
取消