缓存 Rive 文件(Caching a Rive File)
为什么要缓存?
多数场景下 .riv 加载足够快,不必过早优化。
但当同一文件在多处反复使用时,缓存会明显减少重复开销。
典型场景:
- 同屏多个 Rive 实例
- 跨页面复用同一个动画文件
- 网络文件反复下载与解码
收益
- 减少重复 IO / 解码 / 解析
- 降低内存抖动
- 提高首屏后交互稳定性
通用策略
- 在上层(页面级/模块级)加载一次
- 向下传 递同一个
RiveFile/File引用 - 在生命周期结束时集中释放
Flutter
Flutter 需要你显式管理对象生命周期。
late File riveFile;
@override
void initState() {
super.initState();
init();
}
Future<void> init() async {
riveFile = (await File.asset('assets/rewards_demo.riv', riveFactory: Factory.rive))!;
}
@override
void dispose() {
riveFile.dispose();
super.dispose();
}
多个 RiveWidget 可共享同一 riveFile。
React
可通过 useRiveFile 先加载,再分发到多个组件:
const { riveFile, status } = useRiveFile({ src: '/public/my.riv' });
子组件用同一 riveFile 创建各自实例。
React Native(新版)
useRiveFile 返回的 riveFile 可给多个 RiveView 复用:
const { riveFile } = useRiveFile(require('./rating.riv'));
<RiveView file={riveFile} />
<RiveView file={riveFile} />
Web
可先预加载 RiveFile,后续多个 Rive 实例复用该对象,避免重复拉取。
Apple / Android
都可持有文件对象强引用做缓存。
重点是:明确释放时机。
- Apple:缓存
File,按需创建独立 artboard/stateMachine 实例 - Android(Legacy):注意
File.release()的引用计数语义
注意事项
- 已释放对象不可再次使用
- 缓存策略要和状态管理同步(全局缓存 vs 局部缓存)
- 网络场景建议配合 HTTP 缓存 / CDN cache-control
- 若内存敏感,优先缓存热点文件,不要“全量常驻”