aframe
System zarządzania aktywami
Szukaj…
Wprowadzenie
A-Frame ma system zarządzania zasobami, który pozwala nam umieszczać nasze zasoby w jednym miejscu oraz wstępnie ładować i buforować zasoby w celu uzyskania lepszej wydajności.
Gry i bogate wrażenia 3D tradycyjnie wstępnie ładują swoje zasoby, takie jak modele lub tekstury, przed renderowaniem scen. Dzięki temu zasoby wizualnie nie są tracone, a jest to korzystne dla wydajności, aby sceny nie próbowały pobrać zasobów podczas renderowania.
Uwagi
Wydarzenia
Ponieważ <a-assets>
i <a-asset-item>
są węzłami w ramce A, wyemitują loaded
zdarzenie, gdy powie, że zakończyły ładowanie.
Nazwa wydarzenia | Opis |
---|---|
załadowany | Wszystkie zasoby zostały załadowane lub upłynęły limity czasu. |
koniec czasu | Przekroczono limit czasu aktywów. |
Ładuj postępy na poszczególnych aktywach
<a-asset-item>
<a-asset-item>
wywołuje FileLoader Three.js . Możemy użyć <a-asset-item>
dla dowolnego typu pliku. Po zakończeniu ustawia członka data
z odpowiedzią tekstową.
Nazwa wydarzenia | Opis |
---|---|
błąd | Błąd pobierania. Szczegół zdarzenia zawiera xhr z instancją XMLHttpRequest . |
postęp | Emitowane w miarę postępu. Szczegół zdarzenia zawiera xhr z instancją XMLHttpRequest , loadedBytes i totalBytes . |
załadowany | Zasób wskazany przez src został załadowany. |
<img>
Obrazy są standardowym elementem DOM, dzięki czemu możemy odsłuchiwać standardowe zdarzenia DOM.
Nazwa wydarzenia | Opis |
---|---|
Załaduj | Obraz został załadowany. |
HTMLMediaElement
Zasoby audio i wideo to HTMLMediaElement
. Przeglądarka wyzwala określone zdarzenia na tych elementach; zaznaczono tutaj dla wygody:
Nazwa wydarzenia | Opis |
---|---|
błąd | Wystąpił błąd podczas ładowania zasobu. |
załadowane dane | Postęp. |
postęp | Postęp. |
A-Frame wykorzystuje te zdarzenia postępu, porównując czas buforowany przez przeglądarkę z czasem trwania zasobu, aby wykryć, kiedy zasób zostanie załadowany.
Przykładowe wykorzystanie zasobów
Umieszczamy zasoby w <a-assets>
i umieszczamy <a-assets>
w <a-scene>
. Aktywa obejmują:
-
<a-asset-item>
- Różne zasoby, takie jak modele 3D i materiały -
<audio>
- Pliki dźwiękowe -
<img>
- tekstury obrazu -
<video>
- Tekstury wideo
Scena nie będzie renderowana ani inicjowana, dopóki przeglądarka nie pobierze (lub nie wyłączy błędów) wszystkich zasobów lub system zasobów nie przekroczy limitu czasu.
Możemy zdefiniować nasze aktywa w <a-assets>
i wskazać te aktywa od naszych podmiotów za pomocą selektorów:
<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>
Scena i jej podmioty będą czekać na każdy zasób (aż do przekroczenia limitu czasu) przed zainicjowaniem i renderowaniem.
Udostępnianie zasobów między źródłami (CORS)
Ponieważ A-Frame pobiera zasoby za pomocą XHR , zabezpieczenia przeglądarki wymagają, aby przeglądarka obsługiwała zasoby z nagłówkami współdzielenia zasobów pochodzących z różnych źródeł (CORS), jeśli zasób znajduje się w innej domenie. W przeciwnym razie musielibyśmy hostować zasoby tego samego pochodzenia co scena.
W przypadku niektórych opcji GitHub Pages obsługuje wszystko z nagłówkami CORS. Polecamy GitHub Pages jako prostą platformę wdrażania. Możesz też przesłać zasoby za pomocą A-Frame + Uploadcare Uploader , usługi, która obsługuje pliki z ustawionymi nagłówkami CORS.
Biorąc pod uwagę, że nagłówki CORS są ustawione, <a-assets>
crossorigin
<a-assets>
automatycznie ustawi atrybuty crossorigin
na elementach multimedialnych (np. <audio>
, <img>
, <video>
), jeśli wykryje, że zasób znajduje się w innej domenie.
Wstępne ładowanie audio i wideo
Zasoby audio i wideo zablokują scenę tylko wtedy, gdy ustawimy autoplay
lub jeśli ustawimy 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>
Ustawianie limitu czasu
Możemy ustawić limit czasu, po osiągnięciu którego scena zacznie się renderować i jednostki zaczną się inicjować bez względu na to, czy wszystkie zasoby zostały załadowane. Domyślny limit czasu to 3 sekundy. Aby ustawić inny limit czasu, po prostu przekazujemy liczbę milisekund do atrybutu timeout
:
Jeśli ładowanie niektórych zasobów zajmuje dużo czasu, możemy chcieć ustawić odpowiedni limit czasu, aby użytkownik nie czekał przez cały dzień, na wypadek gdyby ich sieć działała wolniej.
<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>
Określanie typu odpowiedzi
Treści pobrane przez <a-asset-item>
zostaną zwrócone jako zwykły tekst. Jeśli chcemy użyć innego typu odpowiedzi, np. arraybuffer
, użyj atrybutu response-type
<a-asset-item>
:
<a-asset-item response-type="arraybuffer" src="model.gltf"></a-asset-item>
Jak to działa wewnętrznie
Każdy element w ramce A dziedziczy po <a-node>
, prototypie AFRAME.ANode
. ANode
kontroluje ładowanie i kolejność inicjowania. Aby element mógł zostać zainicjowany (niezależnie od tego, czy jest to <a-assets>
, <a-asset-item>
, <a-scene>
, <a-entity>
), jego elementy potomne muszą już zostać zainicjowane. Węzły inicjują się od dołu do góry.
<a-assets>
ANode
<a-assets>
jest ANode
i czeka na załadowanie przez dzieci przed załadowaniem. A ponieważ <a-assets>
jest dzieckiem <a-scene>
, scena musi efektywnie czekać na załadowanie wszystkich zasobów. Dodaliśmy także dodatkową logikę ładowania do <a-entity>
tak że jawnie czekają na <a-assets>
aby załadować, jeśli zdefiniowaliśmy <a-assets>
.
<a-asset-item>
THREE.FileLoader
<a-asset-item>
używa THREE.FileLoader
do pobierania plików. three.js przechowuje zwrócone dane w THREE.Cache
. Każdy program ładujący Three.js dziedziczy z THREE.FileLoader
, bez względu na to, czy jest to ColladaLoader
, OBJLoader
, ImageLoader
itp. I wszyscy oni mają dostęp i są świadomi centralnej THREE.Cache
. Jeśli A-Frame już pobrał plik, A-Frame nie spróbuje go ponownie pobrać.
Zatem, ponieważ blokujemy inicjowanie encji na zasobach, do czasu załadowania encji wszystkie zasoby zostaną już pobrane. Tak długo, jak zdefiniujemy <a-asset-item>
THREE.FileLoader
<a-asset-item>
, a jednostka THREE.FileLoader
pliki przy użyciu formularza THREE.FileLoader
, buforowanie będzie działać automatycznie.
Dostęp do FileLoader
i pamięci podręcznej
Aby uzyskać dostęp do FileLoader
three.js, jeśli chcemy uważniej słuchać:
console.log(document.querySelector('a-assets').fileLoader);
Aby uzyskać dostęp do pamięci podręcznej przechowującej odpowiedzi XHR:
console.log(THREE.Cache);