GPU 子系统(CategoryGPU)
SDL GPU API 提供了跨平台的现代图形硬件交互方式,支持 3D 图形渲染和计算功能,设计风格对标 Metal、Vulkan 和 Direct3D 12。
基础工作流程
- 设备初始化:应用通过
SDL_CreateGPUDevice()创建 GPU 设备,并使用SDL_ClaimWindowForGPUDevice()将设备关联到窗口(也可完全离屏渲染,如仅做图像处理); - 静态资源准备(创建一次,重复使用):
- 着色器(GPU 执行的程序):
SDL_CreateGPUShader(); - 顶点缓冲区(几何数据)及其他渲染数据:
SDL_CreateGPUBuffer()+SDL_UploadToGPUBuffer(); - 纹理(图像):
SDL_CreateGPUTexture()+SDL_UploadToGPUTexture(); - 采样器(纹理读取方式):
SDL_CreateGPUSampler(); - 渲染管线(预计算的渲染状态):
SDL_CreateGPUGraphicsPipeline();
- 着色器(GPU 执行的程序):
- 命令缓冲区创建:通过
SDL_AcquireGPUCommandBuffer()创建一个/多个命令缓冲区,用于批量收集渲染指令(复杂场景可多线程并行创建,按序提交); - 渲染目标准备:
- 渲染到纹理(其他 API 称“渲染目标”);
- 渲染到交换链纹理(窗口内容的特殊纹理):
SDL_WaitAndAcquireGPUSwapchainTexture();
- 渲染通道编码:
- 开始渲染通道:
SDL_BeginGPURenderPass(); - 设置渲染状态(管线、视口、顶点缓冲区等);
- 执行绘制命令(
SDL_DrawGPUPrimitives()等); - 结束渲染通道:
SDL_EndGPURenderPass()(结束后重置所有渲染状态);
- 开始渲染通道:
- 命令提交:
SDL_SubmitGPUCommandBuffer()将命令缓冲区提交给 GPU 执行; - 数据回读(可选):通过
SDL_DownloadFromGPUTexture()/SDL_DownloadFromGPUBuffer()读取 GPU 数据,配合SDL_SubmitGPUCommandBufferAndAcquireFence()获取围栏(Fence),等待 GPU 操作完成后安全读取数据。
计算功能支持
- 开始计算通道:
SDL_BeginGPUComputePass()(指定可写入的纹理/缓冲区); - 设置计算状态(计算管线、存储缓冲区/纹理等);
- 分发计算任务:
SDL_DispatchGPUCompute(); - 结束计算通道:
SDL_EndGPUComputePass()。
着色器说明
不同底层后端(Vulkan/Metal/D3D12)需要不同的着色器格式:
- 创建 GPU 设备时,应用声明支持的着色器格式,SDL 自动选择适配的后端;
- 建议预编译着色器,也可使用
SDL_shadercross实现运行时跨编译; - 着色器资源布局需严格匹配 API 要求,否则会导致着色器失效。
适用场景
- 简单 2D 图形:优先使用 Render API(更易用,仍硬件加速);
- 高性能/复杂渲染:使用 GPU API(2D 应用也能获得显著性能提升);
- GPU 计算:如图像处理、物理模拟等并行计算场景。
性能优化建议
- 减少渲染通道数量(开始新通道开销较高);
- 最小化状态切换(如管线绑定);
- 尽早完成帧内数据上传;
- 缓存资源(创建/释放资源开销大);
- 大量数据使用存储缓冲区(而非统一缓冲区);
- 正确使用“循环(Cycling)”机制;
- 使用裁剪技术减少像素写入。
坐标系
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()
核心知识点补充
-
GPU 资源生命周期:
- 设备(Device):核心对象,所有资源关联到设备;
- 管线(Pipeline):预编译的渲染/计算状态,创建后可重复使用;
- 命令缓冲区(CommandBuffer):一次性使用,提交后需重新获取;
- 围栏(Fence):CPU/GPU 同步关键,用于等待 GPU 操作完成。
-
渲染通道关键参数:
load_op:渲染前对目标的操作(CLEAR/LOAD/DONT_CARE);store_op:渲染后对目标的操作(STORE/DONT_CARE);cycle:启用后自动切换内部资源,避免帧间数据依赖。
-
跨平台注意事项:
- 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。
-
常见问题排查:
- 黑屏:检查交换链纹理获取、渲染通道创建、视口设置;
- 着色器失效:检查资源布局、统一数据推送、着色器格式;
- 性能差:减少渲染通道/状态切换,启用循环,优化数据上传。
总结
-
核心优势:
- 跨平台统一的现代 GPU 接口,对齐 Vulkan/Metal/D3D12 设计;
- 支持图形渲染和 GPU 计算,兼顾高性能和灵活性;
- 逻辑抽象(如循环机制)简化资源管理和同步;
- 自动适配不同坐标系和后端特性,降低跨平台开发成本。
-
使用建议:
- 简单 2D 场景优先使用 Render API,复杂场景/高性能需求使用 GPU API;
- 预创建并缓存管线、缓冲区、纹理等资源,避免运行时频繁创建;
- 启用
cycle参数简化资源同步,避免手动状态跟踪; - 利用调试工具(RenderDoc/Xcode)定位渲染问题,而非仅依赖日志。
-
关键接口:
- 设备管理:
SDL_CreateGPUDevice()/SDL_DestroyGPUDevice(); - 资源创建:
SDL_CreateGPUBuffer()/SDL_CreateGPUTexture()/SDL_CreateGPUShader(); - 命令编码:
SDL_BeginGPURenderPass()/SDL_DrawGPUPrimitives()/SDL_EndGPURenderPass(); - 命令提交:
SDL_SubmitGPUCommandBuffer(); - 同步:
SDL_SubmitGPUCommandBufferAndAcquireFence()/SDL_WaitForGPUFences()。
- 设备管理:
评论一下?