Rive 渲染器 rive-renderer:一套 C++ 运行时,让 .riv 动画跑在所有平台
【免费下载链接】rive-rendererLow-level C++ Rive runtime and renderer项目地址: https://gitcode.com/GitHub_Trending/ri/rive-renderer
rive-renderer 是 Rive 生态里最低层级的 C++ 运行时:它负责加载.riv文件、驱动状态机与线性动画的推进,并把画面提交给 GPU 渲染。内置的RiveRenderer提供 Metal、Vulkan、D3D12、D3D11、OpenGL/WebGL 共 5 种图形 API 后端。Apple、Android、Flutter、Unity、Unreal 以及 Web 端的各个 Rive 运行时都是对它的封装——如果你要把 Rive 动画嵌入自己的 C++ 工程或自建图形管线,这一层绕不开。
先对号入座:这三类用法你能吃到多少
1. 把 Rive 动画嵌进自己的 C++ 应用怎么用它:克隆仓库后构建一次,链接librive(核心运行时)和librive_pls_renderer(GPU 渲染器)两个产物,用File类读入.riv,从 artboard 取出状态机,每帧调用Artboard::advance推进一步,剩下的变换求解和绘制都交给库。UI 动效、角色动画、游戏内特效都可以走这条路径。
2. 把 Rive 内容发布到浏览器怎么用它:构建脚本支持交叉编译到 WebAssembly,build_rive.sh ninja wasm release即可产出 wasm 包,本地起一个静态服务器就能在 WebGL 环境下运行,适合做响应式动画组件和交互反馈。
3. 把渲染挂到自有的图形管线怎么用它:核心运行时与 GPU 渲染器是解耦的,渲染走抽象的Renderer接口。如果你的引擎已有自己的向量绘制层,可以实现该接口,只借用运行时的文件加载与状态机推进逻辑。
图:Rive 渲染器渲染的交互式角色动画,状态机推进与矢量绘制都发生在这个运行时内部
它替你解决什么,边界又在哪里
.riv文件到画面的完整链路→ 你不需要自己解析 Rive 二进制格式、处理 artboard 层级和状态机输入,拿到File实例后直接查询状态机、喂输入即可。- 一份源码覆盖 5 种图形 API→ 同一套渲染逻辑在 macOS/iOS 走 Metal、Android/Linux 走 Vulkan 或 OpenGL、Windows 走 D3D11/D3D12、Web 走 OpenGL/WebGL,平台差异被封在
renderer/src/的各后端里。 - 增量式动画推进→ 状态机对 artboard 层级的修改通过
Artboard::advance批量求解,而不是每帧全量重算,高频交互下开销可控。 - 平台运行时共享同一底座→ 你在这一层修的行为、调的渲染参数,会同步反映到所有上层运行时,理解成本是一次性的。
适用边界要说清楚:它不是开箱即用的播放器,而是一个底层库——要求 C++17 工具链,且默认以 clang 系编译器为基准(Windows 上是 clang-cl,也可选--toolset=msc走 MSVC 的cl.exe)。图形能力取决于平台 SDK:D3D 需要 Windows SDK,Vulkan 需要 Vulkan SDK。另外它自带纹理解码(decoders/,支持 PNG、WebP、JPEG、KTX2 等)与脚本执行能力(scripting/,基于 wamr 的 Luau 运行时),这些属于"随库附赠"而非核心卖点。
从克隆到跑通:一条线性流程
准备环境
- C++17 工具链:macOS 装 Xcode Command Line Tools(
xcode-select --install),Linux 用发行版包管理器装 clang(如apt install clang),Windows 装 Visual Studio 2022 并勾选C++ Clang Compiler for Windows与MSBuild support for LLVM组件。 - git:构建脚本首次运行会自动拉取锁定版本的 premake5。Windows 上选 Git for Windows 并启用
sh.exe。 - 目标平台的图形 SDK(见上一节)。
一次构建
构建由 premake5 驱动,入口是build/build_rive.sh(macOS / Linux / Windows MinGW)和build/build_rive.ps1(Windows PowerShell 封装)。脚本必须在包含premake5.lua的目录下运行——通常是tests/,它一次构建出核心库、GPU 渲染器和player示例:
git clone https://gitcode.com/GitHub_Trending/ri/rive-renderer cd rive-renderer/tests ../build/build_rive.sh release常用变体:
| 命令 | 效果 |
|---|---|
build_rive.sh(不带参数) | 宿主平台 debug 构建 |
build_rive.sh release clean | 清理后重新 release 构建 |
build_rive.sh ninja release | 用 Ninja 替代 make/MSBuild |
build_rive.sh ios release/android release | 交叉编译 iOS / Android(默认 arm64) |
build_rive.sh ninja wasm release | 交叉编译 WebAssembly |
首次跑通:用 player 验证
产物落在构建目录相对的out/<config>/下(即tests/out/release/),player就是那个"加载并渲染.riv"的示例程序,直接喂一个.riv文件即可看到动画:
cd tests out/release/player /path/to/your-animation.riv跑通这一步,说明工具链、图形后端、运行库三者都就位了。下一步可以去renderer/目录构建path_fiddle示例,对渲染层单独做压力测试(h/j键加复制实例,p暂停运行时只压渲染器)。
拆开看内部:一张代码地图
| 路径 | 职责 |
|---|---|
[include/rive/](https://link.gitcode.com/i/963c943bb3528ad74e6b2ece9c934cba) | 对外公开头文件:artboard.hpp、file.hpp、renderer.hpp、animation/、shapes/等,是你接入时直接面对的稳定 API 面 |
[src/](https://link.gitcode.com/i/3aad227cc30c28506508a9a963674bc2) | 核心运行时实现:animation/下的状态机(state_machine*.cpp)、过渡条件、监听器;data_bind/的属性绑定;generated/是代码生成产物 |
[renderer/src/](https://link.gitcode.com/i/7b352995ea57370d4ce6c5bfafcec2ac) | GPU 渲染器:metal/、vulkan/、gl/、d3d11/、d3d12/、webgpu/各后端 +ore/渲染核心 +shaders/着色器源码 |
[decoders/](https://link.gitcode.com/i/bfac532b63de06e0cafc2a607f617f73) | 纹理解码:decode_png.cpp、decode_webp.cpp、decode_ktx2.cpp、ASTC/BC/ETC 压缩格式等 |
[scripting/](https://link.gitcode.com/i/8a21650f901bf89356b1e3de5854f2d9) | 运行时脚本:基于 wamr 的 WebAssembly 执行与 Luau 桥接 |
[tests/](https://link.gitcode.com/i/4d5efb8b2fd6e798b23c8139508ac19e) | 质量设施:unit_tests/(Catch2 单测)、goldens/与gm/(黄金图回归)、bench/(基准)、player/(示例程序) |
渲染数据流可以概括为:File读入.riv→ artboard 层级与状态机构建 → 输入喂给状态机 →Artboard::advance增量求解变换与路径 → 绘制命令经Renderer接口下发 → 具体后端的RenderContextImpl提交给 GPU。
测试、规范与参与路径
- 黄金图测试是主测试:
goldens和gms两个测试二进制会把已知场景渲染出来,与签入仓库的参考图做像素比对。构建后二进制位于out/<config>/goldens与out/<config>/gms,tests/下的check_golds.sh、rebaseline_golds.sh负责检查与重新基线。 - Catch2 单测为辅:
cd tests/unit_tests && ./test.sh一键运行。新增测试只需在tests/unit_tests/runtime/或tests/unit_tests/renderer/下放一个xxx_test.cpp,框架会自动收录。 - macOS 内存检查:
./test.sh memory会用系统自带的leaks --atExit包裹测试二进制,Linux/Windows 上该参数被忽略。 - 代码规范:全库统一使用 clang-format,提交前格式化是硬性习惯。
- 参与路径很直接:从
tests/目录构建 → 跑单测与黄金图确认无回归 → 按目录约定放置新测试 → 保持 clang-format 风格提交。
收尾
rive-renderer 用一份 C++17 源码把"加载.riv→ 推进状态机 → 跨 5 种图形 API 渲染"整条链路做成了可嵌入的底层库,也是所有上层 Rive 运行时共享的地基。下一步建议就从tests/目录跑一次build_rive.sh release并用player打开一个.riv文件开始,跑通之后再把目光投向[include/rive/](https://link.gitcode.com/i/963c943bb3528ad74e6b2ece9c934cba)的头文件,API 面会比你想象的小得多。
【免费下载链接】rive-rendererLow-level C++ Rive runtime and renderer项目地址: https://gitcode.com/GitHub_Trending/ri/rive-renderer
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考