Hacker News 中文摘要

RSS订阅

我是如何学习Vulkan并用它编写一个小型游戏引擎的(2024) -- How I learned Vulkan and wrote a small game engine with it (2024)

文章摘要

作者在3个月内学习了Vulkan图形API,并用它开发了一个小型游戏引擎,包含两个游戏demo。文章分享了学习图形编程的经验,包括为何选择Vulkan、学习过程、引擎架构分析以及实用建议,代码已在GitHub开源。

文章总结

学习Vulkan并开发小型游戏引擎的经历

作者:Elias Daler
发布时间:2025年7月20日
原文链接点击查看

核心内容概述

作者在三个月内从零开始学习Vulkan,并基于此开发了一个小型游戏引擎,附带两个游戏演示。以下是关键内容提炼:


1. 学习路径与资源推荐

  • OpenGL基础:建议初学者先通过OpenGL入门图形编程,推荐资源包括:
    • LearnOpenGL
    • 《Anton’s OpenGL 4 Tutorials》
    • TU Wien的图形学讲座(前6集)
  • Vulkan进阶:掌握OpenGL后转向Vulkan,推荐:
    • vkguide(最佳入门教程)
    • TU Wien的Vulkan系列讲座(同步机制部分尤其实用)
    • 高级书籍:《3D Graphics Rendering Cookbook》《Mastering Graphics Programming with Vulkan》

2. 避免过度设计(Bike-shedding)

  • 核心原则
    • 优先实现功能,而非追求完美架构。
    • 避免过早优化,仅解决实际出现的性能瓶颈。
    • 从小型游戏(如Breakout克隆)开始,而非复杂项目。
  • 实践建议:通过注释标记待优化部分,仅在必要时重构。

3. 为何选择Vulkan?

  • 跨平台与开源:Vulkan在Windows/Linux上表现优异,且符合开源理念。
  • 对比其他API
    • OpenGL:易用但功能停滞,macOS已弃用。
    • WebGPU:潜力大但生态不成熟,缺乏绑定式纹理等关键功能。
    • DirectX/Metal:平台限制性强。

4. 引擎架构与关键技术

  • 核心模块
    • GfxDevice:封装Vulkan上下文、交换链、资源管理(约700行代码)。
    • 管线模式:每个渲染步骤独立为类(如PostFXPipeline),通过init/draw/cleanup管理生命周期。
    • 绑定式描述符(Bindless):全局纹理数组替代传统描述符集,简化材质管理。
  • 性能优化
    • 计算蒙皮:在Compute Shader中处理骨骼动画,统一静态与动态网格渲染流程。
    • 动态数据上传:双缓冲或分帧上传策略减少同步开销。
    • MSAA:前向渲染中轻松实现多重采样抗锯齿。

5. 实用技巧与工具链

  • 工具库
    • vk-bootstrap:简化Vulkan初始化。
    • VMA:自动化内存分配。
    • Volk:简化扩展函数加载。
  • 调试与性能
    • RenderDoc调试Shader,Tracy进行性能分析。
    • 同步机制手动管理,依赖Vulkan验证层捕捉错误。

6. 成果与未来计划

  • 当前功能
    • glTF模型加载、PBR光照、阴影映射、UI系统(基于ImGui改造)。
    • 支持10,000个精灵单次绘制(315微秒/帧)。
  • 未来方向
    • 渲染图(Render Graph)、环境光遮蔽、动画混合。
    • 完成游戏开发(首要目标)。

7. 总结

  • 收获:Vulkan的显式控制与无状态设计提升了代码清晰度,跨平台一致性优于OpenGL。
  • 鼓励:作者通过自学实现引擎开发,证明Vulkan并非高不可攀。关键在于分阶段实践与合理利用现代工具。

项目代码GitHub仓库

(注:原文中的图片链接、部分技术细节及次要内容已精简,保留核心逻辑与实用建议。)

评论总结

以下是评论内容的总结:

  1. 对Vulkan的负面评价

    • 认为Vulkan学习曲线陡峭、使用体验差,缺乏直观性(评论3、4)。
    • 关键引用:
      • "I found it completely miserable to use"(Vulkan用起来太痛苦了)
      • "It's so unintuitive and tedious... drains the joy out of programming"(它反直觉且繁琐,剥夺了编程的乐趣)
  2. 对图形编程复杂性的讨论

    • 3D/游戏编程涉及大量数学和底层概念,入门门槛高(评论5)。
    • 关键引用:
      • "As soon as you dive in... partial differential equations. Brain meld"(一深入就会遇到偏微分方程,直接烧脑)
  3. 新手学习建议

    • 推荐从OpenGL等更友好的API开始(评论8)。
    • 关键引用:
      • "NeHe OpenGL tutorials... one of the best tutorial series"(NeHe教程是最佳系列之一)
  4. 关于游戏引擎开发的争议

    • 有人认为《我的世界》类项目适合作为首个引擎项目(评论6),而原文认为过于复杂。
    • 关键引用:
      • "a minecraft clone is 'hello, world'"(《我的世界》克隆就像编程入门)
  5. 对业余引擎开发的积极态度

    • 长期开发业余引擎能带来成就感(评论7)。
    • 关键引用:
      • "a very rewarding experience"(非常有回报的体验)
  6. 术语争议

    • 指出原文误用"bike shedding"一词,实际应为"过度工程化"(评论9)。

注:评论1、2为元信息或引用,无实质性观点。