Hacker News 中文摘要

RSS订阅

无图形API -- No Graphics API

文章摘要

文章探讨了低层图形API对行业的深远影响,作者Sebastian Aaltonen基于30年图形开发经验,分析了从传统API到现代技术的演变。他结合AMD、Nvidia等硬件文档和开源驱动验证技术细节,指出当前图形编程的瓶颈,并分享在Unity、Unreal等引擎优化中的实践洞见。

文章总结

无图形API:面向现代GPU的极简设计

作者背景

Sebastian Aaltonen是一位拥有30年图形编程经验的资深开发者,曾参与多款游戏主机(如Nintendo Switch、PlayStation、Xbox)和PC图形API(如DirectX、Vulkan)的开发。他目前致力于为HypeHype构建基于WebGPU、Metal和Vulkan的渲染器,并曾参与Unity DOTS图形团队的领导工作。

现代图形API的演变

十年前,低层级图形API(如DirectX 12、Vulkan和Metal)的推出标志着实时计算机图形领域的重大变革。这些API旨在减少驱动开销,但初期在实际游戏引擎中并未显著提升性能,反而因与现有引擎设计不兼容而增加了复杂性。

当前API的局限性

现有的“现代API”已问世十年,其设计初衷是为了支持13年前的GPU架构。这些API需要处理大量持久化对象(如PSO),导致存储和加载时间激增。随着GPU架构的演进(如统一的缓存层次结构和64位指针支持),许多早期的设计妥协已不再必要。

现代GPU架构的进步

现代GPU普遍采用以下特性: - 统一的最后一级缓存(LLC) - CPU通过PCIe ReBAR或UMA直接写入GPU内存 - 支持64位指针和无绑定纹理采样 - 原生支持8位、16位和64位数据类型

这些进步使得我们可以设计更简洁的API,无需复杂的持久化对象管理。

极简API设计提案

  1. 内存管理
    采用类似CUDA的gpuMallocgpuFree接口,结合CPU映射的GPU内存(UMA/ReBAR),实现高效的内存分配和数据传输。支持三种内存类型:

    • CPU映射的GPU内存(默认)
    • 仅GPU内存(用于纹理和大缓冲区)
    • CPU缓存内存(用于回读)
  2. 数据绑定
    使用64位指针替代传统的缓冲区绑定,简化数据传递。示例: cpp uint32* numbers = gpuMalloc(1024 * sizeof(uint32)); for (int i = 0; i < 1024; i++) numbers[i] = random();

  3. 纹理绑定
    通过全局可索引的纹理描述符堆实现无绑定纹理采样,支持CPU和GPU直接写入描述符。示例: cpp GpuTextureDescriptor* textureHeap = gpuMalloc<GpuTextureDescriptor>(65536); textureHeap[0] = gpuTextureViewDescriptor(texture, {.format = FORMAT_RGBA8_UNORM});

  4. 管线状态
    减少PSO的持久化状态,将深度-模板和混合状态分离为独立对象,降低管线排列组合爆炸问题。支持动态混合状态和帧缓冲读取(针对移动GPU)。

  5. 同步机制
    简化屏障设计,用阶段和危险标志替代资源列表。示例: cpp gpuBarrier(commandBuffer, STAGE_COMPUTE, STAGE_COMPUTE, HAZARD_DESCRIPTORS);

  6. 间接绘制
    支持间接根数据和绘制参数,提升GPU驱动渲染的灵活性。示例: cpp gpuDrawIndexedInstancedIndirectMulti(commandBuffer, dataVertex.gpu, sizeof(DataVertex), dataPixel.gpu, sizeof(DataPixel), args.gpu, drawCount.gpu);

工具与兼容性

  • 调试支持:通过64位指针和调试符号实现类似C/C++的内存调试。
  • 翻译层:现有API(如DirectX 12、Vulkan、Metal)可通过翻译层运行在新API上。
  • 硬件支持:现代GPU(如Nvidia Turing、AMD RDNA2、Apple M1等)均已支持所需特性。

结论

通过整合现代API的最佳特性(如Metal的指针语义、Vulkan的描述符缓冲和DirectX 12的纹理堆),可以设计出更简洁、高效的图形API。这种设计不仅减少复杂性,还能充分发挥现代GPU的潜力。未来的API应摒弃传统兼容性包袱,全面拥抱无绑定架构。

(全文约1500字,保留核心观点和技术细节,删减了部分硬件历史背景和示例代码。)

评论总结

这篇评论主要围绕新型图形API的讨论展开,以下是关键观点总结:

  1. 对现有API的批评
  • Vulkan和DX12存在冗余设计且缺乏更新(评论1:"Vulkan carries a lot of baggage";评论8:"Graphics APIs have significantly increased in complexity")
  • 低层API暴露过多硬件细节可能是个错误(评论10:"bad idea to go all in to a low level API")
  1. 性能优化期待
  • 新API可能带来显著性能提升(评论1:"SDL3 gpu would get a 3x/4x boost";评论5询问性能改进程度)
  1. 行业趋势讨论
  • 软件渲染重新兴起(评论9:"go back to software rendering")
  • CUDA可能更适合未来发展(评论10:"Maybe CUDA... is the right way";评论9提到OctaneRender转向CUDA)
  1. 文章内容评价
  • 技术细节丰富但部分概念未解释(评论3:"never defines the term PSOs";评论10:"so many details")
  • 缺少动机说明(评论8补充了文章动机段落)
  1. 怀旧与比较
  • 对Mantle等旧API的怀念(评论6:"I miss Mantle... most fun I've had")
  • 与SDL3 GPU API相似(评论2:"similar to the SDL3 GPU API")
  1. 厂商角色质疑
  • 微软停止更新DirectX的原因探讨(评论4:"why M$ stopped putting out new Direct X")
  • 建议Valve开发新API(评论7:"Valve might put out their own API")