- 充分考虑易用性并针对硬件优化的实现;
- 确保强缩放性且面向最先进平台功能特性的设计;
- 集成大量原生开发需要的 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 | |
apple-clang |
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 上:
StateBuffer 由一系列的 StateChunk 组成,每个 StateChunk 描述了一种图形管线状态,StateBuffer 通过 StateChunk 的组合来描述图形管线的完整状态。比起 PSO 的全量 Flush,StateBuffer 可以在绘制现场准备 StatePacket,在 DrawCall 产生时把状态切换推送到 GPU 的状态寄存器组中。
StateBuffer 可以大幅缓解管线和着色器组合爆炸引起的内存膨胀问题,而 PSO 反而会加剧此问题。
WIP...
GUI 的渲染树 (RenderTree) 层,有排版和渲染 Render Object 的功能。支持基本图元、纹理、颜色刷和文本段落等。
集成 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 的解码。
Live2D 模型复合了多种源数据类型,所有数据类型异步地加载和解析。整个模型的加载过程复合了硬盘读取、内存流送到显存、文件解压流送到显存以及直接上传文件到显存。Demo 保证了所有类型的 I/O 操作保持带宽最高效,在此期间发起请求的主线程没有任何停顿与开销。未处理的 Live2D 模型包含了数十个小尺寸 JSON 文件、数个中尺寸模型顶点文件、2张需要解码的 4K PNG 贴图,构成了下图的 I/O 流水线 profile 图表。
Shipping Build 的最终呈现帧数可以轻松地突破数千帧,这是 Cubism 官方示例基准的十数倍。
这个 demo 展示了如何使用 RenderGraph 进行 Deferred 渲染,其中光照计算的部分有 ComputeShdaer 和 PixelShader 两种实现。实际的光照着色效果尚未在 demo 中完成,重点在于验证延迟流程的可行性。这个 demo 同样展示了如何使用自定义 Profiler 对 RenderGraph 的执行细节进行 Profile。
这个 demo 展示了如何使用 RenderGraph 进行三角形渲染。
这个 demo 演示了如何在 CGPU 中使用纹理采样,demo 也演示了怎么在 CGPU 中启用 Static/Immutable Samplers。
我们最终抛弃但曾探索过的成果。抛弃不代表这些技术差或是不可用,而是我们综合考虑后选择性地放弃了它们。
这是一个多后端的三角形绘制 demo。
- 每个后端会拉起一个窗口, 并在一个独立的线程上绘制它;
- drawcall 录制的逻辑可以运行在 host 程序或者 wasm 虚拟机后端中, host 程序和 wasm ‘脚本’共享同一份C代码;
- 实现了一个简单的 filewatcher,自动对 drawcall 脚本进行变更检查,调用 SDK 编译 wasm,并基于产出物应用热修复。
- 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)
- zlib v1.2.8
- cgltf v1.13 (MIT)
- yyjson v0.9.0 (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
- quill v3.0.2 (MIT)
- vulkan headers & volk 1.3.250.0
- nvapi R510
- amd_ags 6.0.1
- 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 需要的数据集