Skip to content

SakuraEngine/SakuraEngine

Repository files navigation

SakuraEngine

为下一代平台的功能性能需求而生 

特性

原生

  • 充分考虑易用性并针对硬件优化的实现;
  • 确保强缩放性且面向最先进平台功能特性的设计;
  • 集成大量原生开发需要的 SDK。

直白

  • 面向过程的实现与设计;
  • C API

现代

  • 基于 ECS 思想,特性丰富且高度正交的数据驱动编程管线带来最大化的访存效率;
  • 混合 Fibers 和 Thread 的任务调度系统,配合 ECS 的依赖管线,赋予运行时前所未有的多线程任务吞吐量;
  • 完全面向现代 GPU 平台、几无性能开销的超薄跨平台 Graphics API;
  • 清晰的 Render Graph 前端让您可以在不接触同步原语和复杂描述符的情况下完成高度异步的现代 GPU 管线编程,并充分利用 Memory Aliasing 等高级特性;
  • 完全异步、针对 NVMe 驱动以及 GPU 异步拷贝引擎优化的 I/O 服务,轻松享受 Direct Storage 的极限吞吐,打破 SSD 性能桎梏。
RenderGraph.mp4

模块列表

模块 核心库 描述
runtime - 核心模块
runtime/cgpu - 核心子模块,面向现代 GPU 平台的跨平台 Graphics API
runtime/sugoi - 核心子模块,真正面向数据驱动编程的 ECS 对象模型
runtime/math RealtimeMath 核心子模块, 数学库
runtime/io - 核心子模块,同步/异步 I/O 服务
runtime/task FiberTaskingLib, marl 核心子模块,基于协程的计算密集任务系统
runtime/binary - 核心子模块, 二进制序列化
runtime/platform - 核心子模块, 系统接口
runtime/resource - 核心子模块, 异步资源管理
runtime/type - 核心子模块, 提供 rtti 相关功能
runtime/lua lua, luau 核心子模块,使用 lua 作为胶水语言
SkrScene - 场景模块,场景资源管理
SkrRenderer - 渲染器模块,渲染资源管理,驱动渲染管线
SkrImgui imgui 用于调试的运行时UI
SkrRenderGraph - 基于 CGPU 的 Render Graph
SkrLive2d live2d Live2d 的渲染后端
SkrInputSystem gaininput 输入的上层封装
SkrAnim ozz-animation 动画资源管理,动画计算的基础功能
devtime/tweak - 提供轻量的常量热更方案
devtime/inspect - 提供运行时的变量状态可视化
SkrToolCore - 管理并驱动资源烘焙流程
SkrAnimTool ozz-animation 导入并烘焙动画相关资源
SkrGLTFTool cgltf 导入gltf模型并烘焙
SkrTextureCompiler ISPCTextureCompressor 导入并烘焙贴图
SkrShaderCompiler - 导入并烘焙材质相关资源
codegen libtooling, mako-template 提供代码生成

组件支持矩阵

Platform CI(Dev)
windows windows-build
apple-clang macos-build
Platform D3D12 D3D11 Vulkan Metal
Windows ✔️ ✔️ N/A
macOS N/A N/A ✔️
Platform PNG JPEG BMP ICO EXR TGA
Windows libpng(v1.5.2) libjpeg-turbo
macOS libpng(v1.5.27) libjpeg-turbo

示例 (从上到下逐渐贴近底层)

基于 ECS 的多人游戏以及服务器。

MultiPlayer.mp4

使用 StateBuffer 的次世代 CGPU 图形接口。摒弃 PSO 的概念,使用 StateBuffer 作为图形管线的状态描述。传统的图形管线 API 往往使用 PSO,其中打包了所有的管线状态以及着色器 ISA,并整体上传到 GPU 上:

PSO

StateBuffer 由一系列的 StateChunk 组成,每个 StateChunk 描述了一种图形管线状态,StateBuffer 通过 StateChunk 的组合来描述图形管线的完整状态。比起 PSO 的全量 Flush,StateBuffer 可以在绘制现场准备 StatePacket,在 DrawCall 产生时把状态切换推送到 GPU 的状态寄存器组中。

StateBuffer

StateBuffer 可以大幅缓解管线和着色器组合爆炸引起的内存膨胀问题,而 PSO 反而会加剧此问题。

WIP...

GUI 的渲染树 (RenderTree) 层,有排版和渲染 Render Object 的功能。支持基本图元、纹理、颜色刷和文本段落等。

RObjects

集成 Cubism Native SDK 且使用 Render Graph 进行 Live2D 模型高效绘制的程序示例。

  • Live2D 渲染器的实现摒弃了传统的变体流程,在 Live2D 模型绘制的过程中实现了 0 管线切换;
  • Live2D 渲染器的可动模型顶点信息会使用 CPU Visible VRAM,充分利用 PCIe 带宽进行最高效的顶点上传,并抹消 Copy Engine 在 GPU Timeline 上的时间消耗;
  • Live2D 的全部读取和贴图上传由 I/O 服务驱动,服务后台实现会使用最合适的平台 I/O API 最大化 NVMe 队列深度,提升实际带宽;
  • 在支持 Direct Storage 的 Windows 平台,还会充分利用自定义解压队列进行 png 的解码。

Live2DViewer

Live2D 模型复合了多种源数据类型,所有数据类型异步地加载和解析。整个模型的加载过程复合了硬盘读取、内存流送到显存、文件解压流送到显存以及直接上传文件到显存。Demo 保证了所有类型的 I/O 操作保持带宽最高效,在此期间发起请求的主线程没有任何停顿与开销。未处理的 Live2D 模型包含了数十个小尺寸 JSON 文件、数个中尺寸模型顶点文件、2张需要解码的 4K PNG 贴图,构成了下图的 I/O 流水线 profile 图表。

Live2DViewerIO

Shipping Build 的最终呈现帧数可以轻松地突破数千帧,这是 Cubism 官方示例基准的十数倍。

这个 demo 展示了如何使用 RenderGraph 进行 Deferred 渲染,其中光照计算的部分有 ComputeShdaer 和 PixelShader 两种实现。实际的光照着色效果尚未在 demo 中完成,重点在于验证延迟流程的可行性。这个 demo 同样展示了如何使用自定义 Profiler 对 RenderGraph 的执行细节进行 Profile。

RenderGraphDeferred

这个 demo 展示了如何使用 RenderGraph 进行三角形渲染。

这个 demo 演示了如何在 CGPU 中使用纹理采样,demo 也演示了怎么在 CGPU 中启用 Static/Immutable Samplers。

cgpu-texture

花絮

我们最终抛弃但曾探索过的成果。抛弃不代表这些技术差或是不可用,而是我们综合考虑后选择性地放弃了它们。

这是一个多后端的三角形绘制 demo。

  • 每个后端会拉起一个窗口, 并在一个独立的线程上绘制它;
  • drawcall 录制的逻辑可以运行在 host 程序或者 wasm 虚拟机后端中, host 程序和 wasm ‘脚本’共享同一份C代码
  • 实现了一个简单的 filewatcher,自动对 drawcall 脚本进行变更检查,调用 SDK 编译 wasm,并基于产出物应用热修复。

hot-triangle

核心组件

嵌入源码的开源库和版本

  • constexpr-xxh3 aebcee7 (BSD 2-Clause License)
  • lru-cache 13f30ad MIT
  • sole 1.0.1 (zlib License)
  • marl e007bd3 (Apache-2.0)
  • folly (Apache-2.0)
  • xxhash 0.8.1 (BSD)
  • fast_float v3.4.0
  • mimalloc v2.1.4 (MIT)
  • godot 5dccc940e7 (MIT)
  • OpenString 81926cc (MIT)
  • concurrentqueue d49fa2b (Simplified BSD)
  • VulkanMemoryAllocator 3.0.1, release
  • D3D12MemoryAllocator 2.0.1 release
  • SPIRV-Reflect b68b5a8 (Apache-2.0)
  • RealtimeMath 80d08a8 (MIT)
  • FiberTaskingLib 9d7b27d (Apache-2.0)
  • parallel-hashmap 1.3.11 (Apache-2.0)
  • TSCNS v2.0 (MIT)

在自定义包管理引入的开源库和版本

  • LEMON v1.3.1 (Boost Software License)
  • LMDB v0.9.29 (BSD)
  • simdjson v3.0.0 (Apache-2.0)
  • zlib v1.2.8
  • cgltf v1.13 (MIT)
  • cpu_features v0.9.0 (Apache-2.0)
  • freetype 2.13.0 (GNU)
  • icu 72.1 (LICENSE)
  • harfbuzz 7.1.0 (LICENSE)
  • doctest v2.4.11

参考和借鉴的开源库

接入的扩展 API 以及版本

内置 SDK /软件版本

  • ispc 1.18.0
  • python 3.10.8

构建

前置

  • xmake
  • 初始化 LFS

编译

使用以下命令编译

> xmake l setup.lua
> xmake f -m debug -c
> xmake 

Tips:

  • 默认构建只包含模块。要构建工具或例子,需要在 xmake f 时加上 --build_cgpu_samples=true 等参数 (详见 xmake/options.lua);
  • 目前版本构建中途失败可能产生 codegen 中断或是不全的问题,可以删除 /build.xmake 文件夹后重试。如进一步出现问题,请务必上报 issues 😀
  • 上报 issue 时尽量提供 xmake f -m debug -c -v 在中断处的详细输出;
  • 当出现 xrepo 安装失败问题(例如 LFS 没有初始化造成错误的库文件安装)时,可用 xrepo remove --all -y 清理错误安装的仓库后再重新构建。

编辑环境

推荐使用 vscode + clangd 作为编辑环境,使用命令 xmake project -k compile_commands 来生成 clangd 需要的数据集