游戏项目里两处代码都写了资源加载,并不自动表示内存中已经出现两份独立资源。Godot 4.5的Resource类文档说明,引擎维护一个以路径引用已加载资源的全局缓存。读加载代码时,调用出现两次与资源对象存在两份,是需要分别确认的事情。
Resource首先是数据容器的基类。文档说它继承RefCounted,资源因而采用引用计数,并在不再使用时释放;资源可以嵌套在其他资源中,也能保存到磁盘。这个对象背景很重要:这里讨论的是程序持有的数据对象,不是画面上某个游戏物件已经出现的位置或数量。
缓存段给出了明确的先后关系。资源首次加载时进入缓存;只要仍处于缓存中,后续用它的路径加载,就返回缓存引用。原文同时说明,所有引用释放后,资源会从缓存移除。因此,这段规则有对象仍被引用的生命周期条件,不能被缩写成“加载过一次便永远留在缓存”。
可以把一份假设的阅读笔记分成两条:甲处记录按某路径加载,乙处也记录按同一路径加载。如果该资源此时仍在缓存中,文档解释的是两次取得缓存引用的关系。这里没有运行项目,也不据两条调用判断实际内存占用;若还想知道某处修改会影响哪些对象,需要具体资源使用方式的证据。
PackedScene也被列为一种资源,具有储存和实例化其中节点的能力。这能提醒读者,“加载场景资源”与“得到新的节点实例”并非同一个动作。缓存规则说明前者怎样复用已加载对象,不能单独替后者回答节点是否已创建、是否进入场景树,或所有实例的运行状态是否相同。
C#还有额外限定。文档专门提示,不再使用的资源不会立即释放,而由周期性垃圾收集处理,因而可能继续在内存中停留一段时间。于是,“已经不用”与“已经瞬间消失”也不能画等号。本篇限定官方4.5分支类文档的说明,首次发布日期未确认;没有测量回收延迟、修改加载策略或承诺性能改善。路径缓存、仍持有的引用和实际回收时机,需要各自保持清楚的含义。
信息来源
本文基于上述公开资料整理,未使用来源页面的图片、视频或嵌入媒体。