为了避免重复加载资源,当资源被加载完成之后,会被缓存在 ResourceManager 内。缓存本身会占用内存和显存,当开发者不再需要缓存的内容时,需要手动去释放缓存的内容。
注意:资源之间是相互依赖的。
例如下图展示的实体包含 MeshRenderer 组件,依赖于 Material, Material 可能被多个 MeshRenderer 引用,如果释放 Material ,那么引用此的其他 MeshRenderer 则会找不到该 Material 而报错。
注意:JavaScript 无法追踪对象的引用。 一般在 JavaScript 等弱类型语言中,是没有提供给开发者内存管理的功能的,所有对象的内存都是通过垃圾回收机制来管理,你没有办法去判断对象什么时候会被释放,所以没有析构函数(destructor)去调用引用资源的释放。
ResourceManager
提供了一套基于引用计数的资源释放,需要开发者手动调用 gc:
engine.resourceManager.gc();
如果您需要验证资产是否释放成功,可按照以下步骤,在空白页打开以下示例:
该示例在初始化时会通过创建 Texture2D
和 Sprite
渲染 2D 精灵,当点击右上角 GC 按钮后,root
节点被销毁,纹理和精灵资产的引用计数都被清空,此时这些资产会被真正销毁,分别在 gc
前后拍摄内存快照可以更直观地感受这个过程