跳到主要内容

渲染循环

使用 C++ runtime 时,应用通常负责自己的主循环。Rive 负责在你提供的时间步长内推进动画和状态机,然后把当前画板绘制到 renderer。

一个典型帧包含以下阶段:

  1. 计算距离上一帧经过的时间 elapsedSeconds
  2. 将指针、键盘或应用事件转发给状态机。
  3. 调用状态机或动画实例的 advance()
  4. 更新布局或数据绑定值。
  5. 设置 renderer 的变换、裁剪与目标。
  6. 绘制 artboard。
  7. 提交 / 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 绘制是分开的:

  • FileArtboardInstanceStateMachineInstance 负责内容和逻辑。
  • RendererRenderContext 负责把结果绘制到目标 surface。

这使得你可以在应用或引擎自己的 frame graph 中灵活插入 Rive 渲染步骤。

性能建议

  • 尽量复用 FileArtboardInstance 和 renderer 资源。
  • 避免每帧重新加载 .riv 文件。
  • 只在需要时更新数据绑定值。
  • 如果有多个 Rive 内容,考虑集中管理 render context 和 command submission。
  • 在游戏引擎中,将 Rive 渲染放入明确的 render pass,避免状态污染。