它是如何在內部工作的

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);