跳到主要内容

缓存 Rive 文件

概览

当需要在多个视图或视图模型中重用时,缓存 Rive 文件可以减少重复解析和加载开销,从而优化内存和性能。

示例用法

当前运行时

要缓存 Rive 文件,你可以创建对 File 对象的强引用。然后可以重用此 File 来创建 Rive 对象。

使用 create 函数创建的画板和状态机是唯一的。这意味着你可以使用相同的文件创建新的 Rive 对象,但使用不同的(且唯一的)画板和状态机。

// 一个示例构建器类,使用缓存的文件创建新的 Rive 对象,为每个 Rive 对象创建新的唯一画板和状态机。
class RiveBuilder {
private let file: File

init(file: File) {
self.file = file
}

@MainActor
func createRive(artboard: String? = nil, stateMachine: String? = nil) async throws -> Rive {
let artboardInstance = try await file.createArtboard(artboard ?? .default)
let stateMachineInstance = try await artboardInstance.createStateMachine(stateMachine ?? .default)
return try await Rive(file: file, artboard: artboardInstance, stateMachine: stateMachineInstance)
}
}

// 加载并缓存文件一次
let worker = try await Worker()
let file = try await File(source: ..., worker: worker)

// 使用缓存的文件创建构建器
let builder = RiveBuilder(file: file)

// 创建具有不同配置的多个 Rive 对象
// 每个 Rive 对象都是唯一的,但它们都共享相同的缓存 File
let rive1 = try await builder.createRive() // 创建唯一的画板和状态机
let rive2 = try await builder.createRive() // 创建唯一的画板和状态机,与第一个 Rive 对象独立运行
let rive4 = try await builder.createRive(artboard: "MainArtboard", stateMachine: "Walking") // 创建唯一的画板和状态机,与前三个 Rive 对象独立运行
let rive5 = try await builder.createRive(artboard: "MainArtboard", stateMachine: "Idle") // 创建唯一的画板和状态机,与前四个 Rive 对象独立运行

旧版运行时

// 缓存 RiveFile 以便重用
let file = try! RiveFile(resource: "file", loadCdn: false)

// 示例:一个在创建新视图模型时重用单个 RiveFile 的类型
class ViewModelGenerator {
/// 生成新视图模型时重用的 RiveFile。
private let file: RiveFile

init(file: RiveFile) {
self.file = file
}

// 使用缓存的 RiveFile 返回新的视图模型。
// 这意味着每次生成视图模型时无需重新解析 RiveFile。
func viewModel(stateMachine: String?, artboard: String?) -> RiveViewModel {
// 虽然一个 RiveFile 可以被缓存和重用,但每个视图模型
// 应拥有自己的模型以避免共享状态。
let model = RiveModel(riveFile: file)
return RiveViewModel(model, stateMachineName: stateMachine, artboardName: artboard)
}
}

使用 RiveViewModel(fileName:) 初始化器时,Apple 运行时不缓存文件使用;这需要手动处理。你可能会发现,当重用同一文件时,随着创建更多视图模型,内存使用量会增加(随着时间的推移)。这时你应该考虑缓存底层文件以便重用。

在适用的情况下重用单个 RiveFile 将减少应用的整体内存使用量。如果你的 .riv 可以在多个视图之间重用,其中每个视图需要相同的文件但使用不同的画板或状态机,请考虑在创建视图模型之前缓存 RiveFile。虽然一个 RiveFile 可以被缓存,但为确保每个视图处于自己的状态,你必须为每个 RiveViewModel 实例创建唯一的 RiveModel