运行时 (Runtimes)
缓存 Rive 文件 (Caching a Rive File)
在多个 Rive 实例之间缓存并复用 Rive 文件对象以提高性能。
概览
当你的应用中有多个 Rive 实例使用同一个 .riv 文件时,缓存文件对象可以显著提高性能并减少内存使用。
为什么要缓存?
- 减少网络请求:避免多次下载同一个文件
- 减少内存占用:多个实例共享同一个文件对象
- 提高加载速度:已缓存的文件可以立即使用
- 减少解析开销:文件只需解析一次
实现方式
Web (JS)
javascript
// 加载并缓存文件
let cachedFile = null;
async function getRiveFile() {
if (!cachedFile) {
const response = await fetch("my-animation.riv");
const buffer = await response.arrayBuffer();
cachedFile = await rive.load(new Uint8Array(buffer));
}
return cachedFile;
}
// 在多个实例中使用
const file = await getRiveFile();
const r1 = new rive.Rive({ rivFile: file, canvas: canvas1 });
const r2 = new rive.Rive({ rivFile: file, canvas: canvas2 });Flutter
dart
// 使用 FileLoader 缓存
final fileLoader = FileLoader.fromAsset(
"assets/animation.riv",
riveFactory: Factory.rive,
);
// FileLoader 会自动管理缓存,可在多个 widget 中复用
RiveWidgetBuilder(fileLoader: fileLoader, ...)iOS/macOS (Swift)
swift
// 缓存 RiveFile 实例
class RiveCache {
static let shared = RiveCache()
private var cache: [String: RiveFile] = [:]
func getFile(name: String) -> RiveFile? {
if let cached = cache[name] {
return cached
}
if let file = try? RiveFile(name: name) {
cache[name] = file
return file
}
return nil
}
}Android (Kotlin)
kotlin
// 使用单例模式缓存
object RiveFileCache {
private val cache = mutableMapOf<Int, File>()
fun getFile(context: Context, resourceId: Int): File {
return cache.getOrPut(resourceId) {
context.resources.openRawResource(resourceId).use {
File(it.readBytes())
}
}
}
} 最佳实践
- 提前加载:在需要之前预加载文件
- 适时释放:不再需要时释放缓存以节省内存
- 错误处理:处理加载失败的情况
- 线程安全:确保缓存操作是线程安全的