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


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow