Skip to content
雲里
里雾

Skia 帧驱动动画

mindgym

Skia 帧驱动动画

概述

React Native 中高帧率多对象动画(如游戏循环)不适合用 useState 驱动——每帧触发 React reconciliation 会成为性能瓶颈。Skia Canvas 提供了绕过 React View 树的渲染路径:内部图元通过 JSI 交给 Skia C++ 引擎,再由 Metal/Vulkan 渲染,不经过 Fabric Shadow Tree。

工作方式

渲染路径对比

方案渲染路径适用场景
Animated.ViewReact → Fabric → Native View → GPUUI 元素动画(按钮、卡片)
Reanimated workletUI thread 的 JS runtime → Native View手势驱动、弹簧动画
Skia CanvasJSI → Skia C++ → Metal/Vulkan多对象、粒子、数据可视化

useFrameCallback

类似 Web 的 requestAnimationFrame,但运行在 UI runtime 而非 JS thread。回调中读写 mutable ref 中的球体位置,不触发 React re-render。

SharedValue vs mutable ref

MOT 选择 mutable ref——球体坐标不需要响应式订阅,帧循环直接读写即可。

dt 钳位

高刷新率设备(120Hz)帧间隔仅 8.33ms,必须用 frameInfo.timestamp 算真实 dt。切后台恢复时 dt 可能很大,需要 Math.min(dt, MAX_DT_MS) 防止瞬移。

参见

参考