跳转至

异步加载与 LRU 缓存

当项目需要按需加载特效、图标、UI 面板或关卡资源,并希望统一处理缓存、并发请求、取消和调试快照时,可以使用 GFAssetUtility

var assets := Gf.get_utility(GFAssetUtility) as GFAssetUtility

# 异步加载一个带路径的资源。缓存命中时直接返回,
# 如果已有相同请求,则共用同一次加载;如果没有,则发起新的 threaded request。
assets.load_async("res://actors/runtime_actor.tscn", func(res: Resource) -> void:
    var actor_scene := res as PackedScene
    if actor_scene != null:
        add_child(actor_scene.instantiate())
)

它内置 LRU 上限。当缓存过大时,会自动清理长期未被提取引用的资源。max_cache_size = 0 会禁用并清空缓存;pin_cache(path) 会用引用计数锁定关键资源,重复 pin 需要对应次数 unpin_cache(path) 后才会重新参与 LRU 淘汰。

assets.max_cache_size = 128
assets.load_async("res://ui/inventory_panel.tscn", _on_panel_loaded, "PackedScene")

assets.pin_cache("res://ui/common_icons.tres")

同一路径的并发加载会合并到同一个 threaded request。如果已存在请求或缓存的资源类型与新的 type_hint 明显不兼容,回调会收到 null。命中缓存时回调会同步执行。