渲染循环
使用 C++ runtime 时,应用通常负责自己的主循环。Rive 负责在你提供的时间步长内推进动画和状态机,然后把当前画板绘制到 renderer。
一个典型帧包含以下阶段:
- 计算距离上一帧经过的时间
elapsedSeconds。 - 将指针、键盘或应用事件转发给状态机。
- 调用状态机或动画实例的
advance()。 - 更新布局或数据绑定值。
- 设置 renderer 的变换、裁剪与目标。
- 绘制 artboard。
- 提交 / flush 渲染命令。
基本循环
while (running)
{
float elapsedSeconds = timer.elapsed();
stateMachine->advanceAndApply(elapsedSeconds);
renderContext->beginFrame({width, height});
renderer->save();
renderer->align(rive::Fit::contain, rive::Alignment::center,
rive::AABB(0, 0, width, height),
artboard->bounds());
artboard->draw(renderer);
renderer->restore();
renderContext->flush();
}
备注
具体 API 名称会随使用的 backend 和 runtime 版本略有不同。实际接入时请以当前 rive-runtime 头文件为准。
推进与绘制分离
Rive 的内容推进和 GPU 绘制是分开的:
File、ArtboardInstance、StateMachineInstance负责内容和逻辑。Renderer、RenderContext负责把结果绘制到目标 surface。
这使得你可以在应用或引擎自己的 frame graph 中灵活插入 Rive 渲染步骤。
性能建议
- 尽量复用
File、ArtboardInstance和 renderer 资源。 - 避免每帧重新加载
.riv文件。 - 只在需要时更新数据绑定值。
- 如果有多个 Rive 内容,考虑集中管理 render context 和 command submission。
- 在游戏引擎中,将 Rive 渲染放入明确的 render pass,避免状态污染。