Buscar..


Introducción

A-Frame tiene un sistema de administración de activos que nos permite colocar nuestros activos en un solo lugar y precargar y almacenar en caché los activos para un mejor desempeño.

Los juegos y las ricas experiencias en 3D tradicionalmente cargan sus recursos, como modelos o texturas, antes de representar sus escenas. Esto asegura que los activos no falten visualmente, y esto es beneficioso para el rendimiento para garantizar que las escenas no intenten recuperar los activos mientras se procesan.

Observaciones

Eventos

Como <a-assets> y <a-asset-item> son nodos en A-Frame, emitirán el evento loaded cuando digan que han terminado de cargarse.

Nombre del evento Descripción
cargado Todos los activos se cargaron o se agotaron los activos.
se acabó el tiempo Los activos expiraron.

Cargar el progreso en activos individuales

<a-asset-item>

<a-asset-item> invoca a three.js FileLoader . Podemos usar <a-asset-item> para cualquier tipo de archivo. Cuando termine, establecerá su miembro de data con la respuesta de texto.

Nombre del evento Descripción
error Fetch error. El detalle del evento contiene xhr con la instancia XMLHttpRequest .
Progreso Emitido en progreso. El detalle del evento contiene xhr con la instancia XMLHttpRequest , loadedBytes y totalBytes .
cargado El activo apuntado por src fue cargado.

<img>

Las imágenes son un elemento DOM estándar, por lo que podemos escuchar los eventos DOM estándar.

Nombre del evento Descripción
carga La imagen fue cargada.

HTMLMediaElement

Los activos de audio y video son HTMLMediaElement s. El navegador activa eventos particulares en estos elementos; señalado aquí por conveniencia:

Nombre del evento Descripción
error Se ha producido un error al cargar el activo.
datos cargados Progreso.
Progreso Progreso.

A-Frame utiliza estos eventos de progreso, comparando la cantidad de tiempo que el navegador almacenó en búfer con la duración del activo, para detectar cuándo se carga el activo.

Ejemplo de uso de activos

Colocamos activos dentro de <a-assets> , y colocamos <a-assets> dentro de <a-scene> . Los activos incluyen:

  • <a-asset-item> - Activos diversos, como modelos y materiales 3D
  • <audio> - Archivos de sonido
  • <img> - Texturas de imagen
  • <video> - Texturas de video

La escena no se renderizará o inicializará hasta que el navegador recupere (o produzca errores) todos los activos o el sistema de activos llegue al tiempo de espera.

Podemos definir nuestros activos en <a-assets> y señalar aquellos activos de nuestras entidades utilizando selectores:

<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 escena y sus entidades esperarán a cada activo (hasta el tiempo de espera) antes de inicializar y renderizar.

Intercambio de recursos de origen cruzado (CORS)

Dado que A-Frame recupera los activos que utilizan XHR , la seguridad del navegador requiere que el navegador sirva activos con encabezados de intercambio de recursos de origen cruzado (CORS) si el activo está en un dominio diferente. De lo contrario, tendríamos que alojar activos en el mismo origen que la escena.

Para algunas opciones, GitHub Pages sirve todo con encabezados CORS. Recomendamos GitHub Pages como una plataforma de implementación simple. O también puede cargar activos utilizando A-Frame + Uploadcare Uploader , un servicio que sirve archivos con los encabezados CORS establecidos.

Dado que los encabezados CORS están establecidos, <a-assets> establecerá automáticamente los atributos de origen crossorigin en los elementos de medios (por ejemplo, <audio> , <img> , <video> ) si detecta que el recurso está en un dominio diferente.

Precarga de Audio y Video

Los recursos de audio y video solo bloquearán la escena si configuramos la autoplay o si configuramos 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>

Establecer un tiempo de espera

Podemos establecer un tiempo de espera que cuando se alcance, la escena comenzará a renderizarse y las entidades comenzarán a inicializarse independientemente de si se han cargado todos los activos. El tiempo de espera predeterminado es de 3 segundos. Para establecer un tiempo de espera diferente, solo pasamos el número de milisegundos al atributo de timeout :

Si algunos activos tardan mucho tiempo en cargarse, es posible que deseemos establecer un tiempo de espera adecuado para que el usuario no esté esperando todo el día en caso de que su red sea 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>

Especificando el tipo de respuesta

El contenido obtenido por <a-asset-item> se devolverá como texto sin formato. Si queremos usar un tipo de respuesta diferente, como arraybuffer , use el atributo de response-type <a-asset-item> :

<a-asset-item response-type="arraybuffer" src="model.gltf"></a-asset-item>

Cómo funciona internamente

Cada elemento en A-Frame hereda de <a-node> , el prototipo AFRAME.ANode . Control de ANode carga y orden de inicialización. Para que un elemento se inicialice (ya sea <a-assets> , <a-asset-item> , <a-scene> o <a-entity> ), sus elementos secundarios ya deben haberse inicializado. Los nodos se inicializan de abajo hacia arriba.

<a-assets> es un ANode , y espera a que sus hijos se carguen antes de cargarse. Y dado que <a-assets> es un hijo de <a-scene> , la escena debe esperar a que se carguen todos los activos. También agregamos lógica de carga adicional a <a-entity> modo que esperen explícitamente a que se carguen <a-assets> si hemos definido <a-assets> .

<a-asset-item> utiliza THREE.FileLoader para recuperar archivos. three.js almacena los datos devueltos en THREE.Cache . Cada cargador de three.js hereda de THREE.FileLoader , ya sea un ColladaLoader , OBJLoader , ImageLoader , etc. Y todos tienen acceso y conocen el THREE.Cache central. Si A-Frame ya recuperó un archivo, A-Frame no intentará recuperarlo nuevamente.

Por lo tanto, dado que bloqueamos la inicialización de entidades en los activos, para cuando las entidades se carguen, todos los activos ya se habrán recuperado. Siempre y cuando definamos <a-asset-item> s, y la entidad esté recuperando archivos con algún tipo de THREE.FileLoader , el almacenamiento en caché funcionará automáticamente.

Accediendo al FileLoader y al Cache

Para acceder a three.js FileLoader si queremos escuchar más de cerca:

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

Para acceder al caché que almacena respuestas XHR:

console.log(THREE.Cache);


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow