它是如何在内部工作的

A-Frame 中的每个元素都继承自 <a-node>,即 AFRAME.ANode 原型。ANode 控制加载和初始化顺序。对于要初始化的元素(无论是 <a-assets><a-asset-item><a-scene> 还是 <a-entity>),其子元素必须已经初始化。节点自下而上初始化。

<a-assets> 是一个 ANode,它等待它的孩子在加载之前加载。由于 <a-assets><a-scene> 的孩子,因此场景必须等待所有资产加载。我们还为 <a-entity> 添加了额外的加载逻辑,这样如果我们定义了 <a-assets>,它们就会明确等待 <a-assets> 加载。

<a-asset-item> 使用 THREE.FileLoader 来获取文件。three.js 将返回的数据存储在 THREE.Cache 中。每个 three.js 加载器都继承自 THREE.FileLoader,无论是 ColladaLoaderOBJLoaderImageLoader 等。他们都可以访问并了解中心的 THREE.Cache。如果 A-Frame 已经提取了一个文件,A-Frame 将不再尝试获取它。

因此,由于我们阻止资产上的实体初始化,因此在实体加载时,所有资产都已经被提取。只要我们定义 <a-asset-item>s,并且实体使用某种形式 THREE.FileLoader 获取文件,那么缓存将自动工作。

访问 FileLoader 和 Cache

如果我们想要更仔细地倾听,要访问 three.js FileLoader

console.log(document.querySelector('a-assets').fileLoader);

要访问存储 XHR 响应的缓存:

console.log(THREE.Cache);