aframe
Sistema di gestione delle risorse
Ricerca…
introduzione
A-Frame ha un sistema di gestione delle risorse che ci consente di collocare le nostre risorse in un'unica posizione e di precaricare e memorizzare le risorse per ottenere prestazioni migliori.
I giochi e le ricche esperienze 3D tradizionalmente precaricano le loro risorse, come i modelli o le trame, prima di renderizzare le loro scene. Questo assicura che le risorse non manchino visivamente, e questo è vantaggioso per le prestazioni per garantire che le scene non provino a recuperare le risorse durante il rendering.
Osservazioni
eventi
Poiché <a-assets>
e <a-asset-item>
sono nodi in A-Frame, emetteranno l'evento loaded
quando dicono di aver completato il caricamento.
Nome dell'evento | Descrizione |
---|---|
caricato | Tutte le attività sono state caricate o le risorse scadute. |
tempo scaduto | Attività scadute. |
Carica progresso su singoli beni
<a-asset-item>
<a-asset-item>
richiama il FileLoader three.js . Possiamo usare <a-asset-item>
per qualsiasi tipo di file. Al termine, imposta il membro dei data
con la risposta del testo.
Nome dell'evento | Descrizione |
---|---|
errore | Recupero errore I dettagli dell'evento contengono xhr con l'istanza XMLHttpRequest . |
progresso | Emesso in corso. I dettagli degli eventi contengono xhr con istanza XMLHttpRequest , loadedBytes e totalBytes . |
caricato | La risorsa indicata da src stata caricata. |
<img>
Le immagini sono un elemento DOM standard in modo che possiamo ascoltare gli eventi DOM standard.
Nome dell'evento | Descrizione |
---|---|
caricare | L'immagine è stata caricata |
HTMLMediaElement
Le risorse audio e video sono HTMLMediaElement
. Il browser attiva eventi particolari su questi elementi; annotato qui per comodità:
Nome dell'evento | Descrizione |
---|---|
errore | Si è verificato un errore durante il caricamento della risorsa. |
loadeddata | Progresso. |
progresso | Progresso. |
A-Frame utilizza questi eventi di avanzamento, confrontando il tempo di memorizzazione del browser con la durata della risorsa, per rilevare quando la risorsa viene caricata.
Esempio di utilizzo delle risorse
Inseriamo le risorse in <a-assets>
e posizioniamo <a-assets>
all'interno di <a-scene>
. Le attività includono:
-
<a-asset-item>
- Asset vari come modelli e materiali 3D -
<audio>
- File audio -
<img>
- Texture immagine -
<video>
- Texture video
La scena non verrà renderizzata o inizializzata fino a quando il browser non recupera (o commette errori) tutte le risorse o il sistema di asset raggiunge il timeout.
Possiamo definire le nostre attività in <a-assets>
e indicare tali risorse dalle nostre entità utilizzando selettori:
<a-scene>
<!-- Asset management system. -->
<a-assets>
<a-asset-item id="horse-obj" src="horse.obj"></a-asset-item>
<a-asset-item id="horse-mtl" src="horse.mtl"></a-asset-item>
<a-mixin id="giant" scale="5 5 5"></a-mixin>
<audio id="neigh" src="neigh.mp3"></audio>
<img id="advertisement" src="ad.png">
<video id="kentucky-derby" src="derby.mp4"></video>
</a-assets>
<!-- Scene. -->
<a-plane src="advertisement"></a-plane>
<a-sound src="#neigh"></a-sound>
<a-entity geometry="primitive: plane" material="src: #kentucky-derby"></a-entity>
<a-entity mixin="giant" obj-model="obj: #horse-obj; mtl: #horse-mtl"></a-entity>
</a-scene>
La scena e le sue entità attenderanno ogni risorsa (fino al timeout) prima dell'inizializzazione e del rendering.
Cross-Origin Resource Sharing (CORS)
Poiché A-Frame recupera gli asset utilizzando XHR , la sicurezza del browser richiede che il browser serva le risorse con intestazioni di condivisione delle risorse di origine incrociata (CORS) se l'asset si trova su un dominio diverso. Altrimenti, dovremmo ospitare risorse sulla stessa origine della scena.
Per alcune opzioni, GitHub Pages serve tutto con le intestazioni CORS. Consigliamo GitHub Pages come una semplice piattaforma di distribuzione. Oppure puoi anche caricare le risorse utilizzando A-Frame + Uploadcare Uploader , un servizio che serve i file con le intestazioni CORS impostate.
Dato che le intestazioni CORS sono impostate, <a-assets>
imposterà automaticamente crossorigin
attributi crossorigin
sugli elementi multimediali (ad esempio, <audio>
, <img>
, <video>
) se rileva che la risorsa si trova su un dominio diverso.
Precaricamento audio e video
Le risorse audio e video bloccano la scena solo se impostiamo la autoplay
o se preload="auto"
:
<a-scene>
<a-assets>
<!-- These will not block. -->
<audio src="blockus.mp3"></audio>
<video src="loadofblocks.mp4"></video>
<!-- These will block. -->
<audio src="blocky.mp3" autoplay></audio>
<video src="blockiscooking.mp4" preload="auto"></video>
</a-assets>
</a-scene>
Impostazione di un timeout
Possiamo impostare un timeout che, una volta raggiunto, la scena inizierà il rendering e le entità inizieranno l'inizializzazione indipendentemente dal fatto che tutte le risorse siano state caricate. Il timeout predefinito è 3 secondi. Per impostare un timeout diverso, passiamo semplicemente il numero di millisecondi all'attributo timeout
:
Se alcune attività richiedono molto tempo per essere caricate, potremmo voler impostare un timeout appropriato in modo che l'utente non stia aspettando tutto il giorno nel caso in cui la rete sia lenta.
<a-scene>
<a-assets timeout="10000">
<!-- You got until the count of 10 to load else the show will go on without you. -->
<img src="bigimage.png">
</a-asset>
</a-scene>
Specifica del tipo di risposta
Il contenuto recuperato da <a-asset-item>
verrà restituito come testo normale. Se si desidera utilizzare un tipo di risposta diverso, ad esempio arraybuffer
, utilizzare l'attributo del response-type
<a-asset-item>
:
<a-asset-item response-type="arraybuffer" src="model.gltf"></a-asset-item>
Come funziona internamente
Ogni elemento in A-Frame eredita da <a-node>
, il prototipo AFRAME.ANode
. ANode
controlla il carico e l'ordine di inizializzazione. Per un elemento da inizializzare (che sia <a-assets>
, <a-asset-item>
, <a-scene>
o <a-entity>
), i suoi figli devono essere già inizializzati. I nodi inizializzano dal basso verso l'alto.
<a-assets>
è un ANode
e attende che i suoi figli ANode
prima che carichi. E dal momento che <a-assets>
è figlio di <a-scene>
, la scena deve effettivamente attendere il caricamento di tutte le risorse. Abbiamo anche aggiunto una logica di carico extra a <a-entity>
tale che attendono esplicitamente <a-assets>
da caricare se abbiamo definito <a-assets>
.
<a-asset-item>
utilizza THREE.FileLoader
per recuperare i file. three.js memorizza i dati restituiti in THREE.Cache
. Ogni loader three.js eredita da THREE.FileLoader
, indipendentemente dal THREE.FileLoader
che si tratti di ColladaLoader
, OBJLoader
, ImageLoader
, ecc. E tutti hanno accesso e sono a conoscenza del THREE.Cache
centrale. Se A-Frame ha già recuperato un file, A-Frame non proverà a recuperarlo di nuovo.
Quindi, poiché blocciamo l'inizializzazione delle entità sulle risorse, per il momento in cui le entità caricano, tutte le risorse saranno già state recuperate. Finché definiamo <a-asset-item>
s, e l'entità sta recuperando i file utilizzando qualche forma THREE.FileLoader
, la cache funzionerà automaticamente.
Accesso a FileLoader
e Cache
Per accedere a tre.js FileLoader
se vogliamo ascoltare più da vicino:
console.log(document.querySelector('a-assets').fileLoader);
Per accedere alla cache che memorizza le risposte XHR:
console.log(THREE.Cache);